admin管理员组

文章数量:1532276

2024年5月30日发(作者:)

基于OpenGL的喷泉动画设计

胡运江 重庆大学计算机学院  400044

摘  要

随着计算机图形学的发展,OpenGL的应用已涉

及建筑、产品设计、医学等领域。本文通过

OpenGL实现喷泉三维动画。阐述了OpenGL的基

本特点、功能、设计技术和喷泉动画实现。

关键词

OpenGL; 喷泉; 动画

1、OpenGL简介

OpenGL(Open Graphics

Library),是一个三维的计算机图形和

模型库,同时也是该行业的一个标准。它

源于SGI公司为其图形工作站开发的IRIS

GL,在跨平台移植过程中发展成为

OpenGL。

就需要用到融合技术。

雾化功能:OpenGL提供了"fog"的基

本操作来达到对场景进行雾化的效果。

位图和图像功能:OpenGL提供了一

系列函数来实现位图和图像的操作。

纹理映射功能:在计算机图形学中,

把包含颜色、alpha值、亮度等数据的矩

形数组称为纹理。

动画功能: OpenGL提供了双缓存区

技术来实现动画绘制。

清理缓冲后又继续绘制下一张图片。这时

缓冲1里的图像也绘制好了,就这样两个缓

冲交换使用。由于交换的时间很短,所以在

视觉上给我们动画的效果。

5、OpenGL动画设计喷泉具体实现

(1) OpenGL动画设计喷泉的平台的选

该设计是运用VC++和OpenGL联合

编程实现的,其中运用VC++设计窗体,

运用OpenGL绘制喷泉和设计动画效果。

(2) OpenGL动画设计喷泉的功能结构

模块设计

OpenGL喷泉动画设计的窗体:标题

栏,工具栏,状态栏,窗体(喷泉模拟)

(3) OpenGL动画设计喷泉的实现具体

设计

①.定义一个工程文件MySDOpenGL.

dsp,这里面包括了建立喷泉动画模拟的

工程信息。

②.建立主窗体应用程序MainFrm.cpp,

同时定义MainFrm.h头文件。其中在

MainFrm.h中定义窗体的相关信息,在

MainFrm.cpp中编写执行窗体时所需要的

类。

③.建立应用程序MyFountain.cpp,同

时定义MyFountain.h头文件。在头文件

中定义的主要的是MyFountain.cpp的头文

件。在MyFountain.cpp中,定义了喷泉

相关行为动作。

④.建立应用程序MyFountainDoc.cpp,

同时定义MyFountainDoc.h头文件。头文

件定义的主要是MyFountainDoc.cpp的头

文件。在MyFountainDoc.cpp中,定义

喷泉文本相关行为动作的类。

⑤.建立主要的应用程序

MyFountainView.cpp,同时定义

MyFountainView.h头文件。在头文件中定

义的主要的是MyFountainDoc.cpp的包含

文件信息。在MyFountainView.cpp中完

成OpenGL的主要的操作,包括:场景的绘

制与渲染(初始化OpenGL和设置定时器,

删除调色板和渲染上下文,设置调色板,初

始化OpenGL场景,)绘制喷泉,喷泉的初

始化,纹理的装入,添加,删除粒子,运动

的设计,旋转的设计等等。

⑥.添加MyTexture.h和MyTexture.

cpp。其中MyTexture.cpp定义相关的类。

⑦.添加StdAfx.h, StdAfx.cpp。用

StdAfx.h来定义系统相关的包括文件。

StdAfx.cpp来运用相关的系统资源。例

如:MyFountain.pch和StdAfx.obj。

3、OpenGL动画设计技术基础

(1) OpenGL函数

OpenGL的库函数六类:OpenGL核

心库,OpenGL实用库,OpenGL辅助

库,OpenGL工具库,Windows专用库,

Win32 API函数库。

(2) OpenGL模型的绘制

每组三维物体包括两种形式:网状体

(wire)和实心体(solid)。

(3) OpenGL图形变换流程

世界坐标三维物体—几何变换—投影

—三维剪裁—视口变换—图形显示

(4) OpenGL效果处理

OpenGL的三个特殊效果处理:融

合、雾化和反走样

2、OpenGL的特点和功能

(1) OpenGL的特点

工业标准:

OARB(OpenGL Architecture Review

Board)联合会领导OpenGL技术规范的发

展,OpenGL有广泛的支持,它是业界唯一

的真正开发的、跨平台的图形标准。

可靠度高:利用OpenGL技术开发的

应用图形软件与硬件无关,只需硬件支持

OpenGL API标准。

可扩展性:OpenGL是低级的图形

API,它具有充分的可扩展性。

可伸缩性:基于OpenGL API的图形

应用程序可以运行在许多系统上,包括各

种用户电子设备、PC、工作站以及超级计

算机。

灵活性:OpenGL功能可由硬件实现,

也可软件实现,或者以软硬件结合的方式

实现。

(2) OpenGL的功能

绘制物体功能:OpenGL提供了丰富

的基本图元绘制命令,可以方便地绘制物

体。

变换变换:OpenGL提供了一系列基

本的变换,如取景变换、模型变换、投

影变换及视口变换。

光照处理功能:绘制有真实感的三维

物体必须做光照处理。

着色功能:OpenGL提供了两种物体

着色模:RGBA颜色模式和颜色索引模

式。

反走样功能:为了消除这种缺陷,

OpenGL提供了点、线、多边形的反走样技

术。

融合功能:为使物体具有真实感觉,

4、OpenGL动画设计喷泉原理

(1) 动画设计的原理

OpenGL提供了双缓存来制作动画。

即在显示前台缓存内容中的一帧画面时,

后台缓存正在绘制下一帧画面,当绘制完

毕,则后台缓存内容便在屏幕上显示出来,

而前台正好相反,又在绘制下一帧画面内

容。这样循环反复,屏幕上显示的总是已经

画好的图形,所以图片都是连续的。

在OpenGL中,设计这样的动画程序

需要掌握一个重点函数,即:void

auxSwapBuffers(void);

设置交换缓存。即执行完一次绘制过

程,便交换前后台缓存,以便让下一帧图

形在屏幕后绘制完成。当然,使用不同的

窗口系统设置交换缓存的函数也可能不一

样,比如在X窗口系统下,就最好用

glxSwapBufferS()。

此外,在窗口显示模式中还应设置双

缓存模式。

(2) OpenGL喷泉动画设计原理

利用粒子模型绘制水滴,通过对粒子

设置方向矢量。在T1时刻,在缓冲1正

在绘制(x1,y1,z1)的图像,在T2时刻,

在缓冲2已经绘制完(x2,y2,z2),绘制

完后就把缓冲2的内容送到屏幕上显示,

-113-

信息科技

中国科技信息2009年第12期    CHINA SCIENCE AND TECHNOLOGY INFORMATION Jun.2009

⑧.res\MyFountain.ico包含icon文

件。res\MyFountain.rc2是资源文件不可

以被vc++编辑。res\Toolbar.bmp是工具

条上的图标。

1.喷泉的绘制

DrawFountain();

glBindTexture(GL_TEXTURE_2D,

texture[2]); // 装如纹理

glPushMatrix(); //压入当前堆栈;

glRotatef(a, 0, -1, 0); //用旋转矩阵

乘以单前矩阵,围绕原点与(x,y,z)旋

转a

glBegin(GL_QUADS);//绘制粒子

glTexCoord2f(0, 0); glVertex3f(-100,

0, -100); //绘制粒子纹理坐标。

glTexCoord2f(1, 0); glVertex3f(-100,

0, 100);

glTexCoord2f(1, 1); glVertex3f(100,

0, 100);

glTexCoord2f(0, 1); glVertex3f(100,

0, -100);

glEnd();

glPopMatrix(); //弹出当前堆栈;

glFlush();

2.添加新的粒子

void CMyFountainView::

AddParticles()

{struct particle *tempp;

int i, j;

for (j=0; j<3; j++)

for (i=0; i<2; i++)

{tempp = (struct particle *)malloc

(sizeof(struct particle)); //申请空间

if (fn[j]) fn[j]->prev = tempp; //给

变化的粒子赋值

tempp->next=fn[j]; //使之具有连续

fn[j] = tempp;

tempp->t = -9.9; //设置粒子的生

命周期

tempp->v = (float)(rand() % 200000)/

100000+1; //粒子速度

tempp->d = (float)(rand() % 400)/

100-2; //粒子方向

tempp->x= 0;

tempp->y= 0;

tempp->z= 0;

tempp->xd=cos((tempp->d*3.14159)/

180)*tempp->v/4;

tempp->zd=sin((tempp->d*3.14159)/

180)*tempp->v;

tempp->type = 0; //粒子状态为运

tempp->a = 1;  //粒子淡化

3.粒子运动函数(在x , y , z各

自的运动方向)

void CMyFountainView::

MoveParticles()

{struct particle *tempp;

int j;

for (j=0; j<3; j++)

{tempp = fn[j];

while (tempp)

{if (tempp->type == 0) // 如果粒

子处于运动状态

{tempp->x += tempp->xd;  //

在x,z方向作匀速运动

tempp->z += tempp->zd;

tempp->y = -(9.8*(tempp->

t*tempp->t/4))/2+122.5; // 计算粒子的

高度 H = gt^2/2

tempp->t += 0.1; // 增加粒子寿命

if (tempp->y < 0) tempp->type = 1;

// 如果粒子位于地面

}else  // 粒子高于地面

{tempp->y = -(9.8*(tempp->

t*tempp->t/4))/2+122.5; // 计算粒子高

tempp->a -= 0.1; // 粒子淡化

tempp = tempp->next;   // 下一个

粒子

上接第110页

模拟结果如图5所示,在该模拟过程

中共发生了两次DDoS攻击。第一次在15

至20秒之间,第二次在35至40秒之间。

从图中可看出:当没有部署DDoS防御机

制时,受害者收到数据包数目在10000左

右;而部署本文提出的确定性包标记防御

机制,受害者收到数据包数目仅在2000到

3000之间。由此可知,本文提出的防御

机制能有效地抵御DDoS攻击和减轻DDoS

攻击对受害者的影响。

5、结论

由于文中所提出的算法通过重载IP包

头偏移域和服务类型来获得更多的标记空

间,解决了普通路径识别方法标记空间不

足问题,由于它在每个数据包中都存储了

源AS编号,受害者可实时追踪到攻击源

所在的AS。它不管是对BGP路由器标记

过程还是对受害者过滤攻击包来说都是一

种极其轻量级的方法。

6、OpenGL动画设计喷泉测试

在设计喷泉的过程中,我进行了简单

窗体的测试和喷泉动画效果的测试。

参考文献

[1] 和平鸽工作室.OpenGL高级编程与可视

化系统开发(高级编程篇)[M].北京:中

国水利出版社,2002

[2] 吴斌等.OpenGL编程权威指南第三版[M].

北京:中国水利出版社.2001.8

[3] 陈岩涛.OpenGL图形程序设计指南[M].北

京:中国水利出版社.2001.10

参考文献

[1] Abraham Yaar, Adrian Perrig and Dawn

Song. “Pi: A Path Identification Mechanism to

Defend against DDoS Attacks”, Proceedings of

Symposium on Security and Privacy, Page(s):

93-107, 2003.

[2] Changhyun Beak, Junaid Ahsenali Chaudhry,

Keonsoo Lee, Seungkyu Park and Minkoo Kim.

“A Novel Packet Marketing Method in DDoS

Attack Detection”, American Journal of Applied

Sciences 4 (10): 741-745, 2007.

作者简介

张国锋,男,大学学历,现在淮南矿业集团

瓦斯利用分公司,从事计算机网络管理和计

算机工业控制系统管理工作。

-114-

本文标签: 绘制粒子功能动画缓存