Particle Engine Using OpenGL
一、粒子系统(Particle System
)
大量的自然现象可以被精确或近似地使用粒子系统模拟。火焰,喷泉,爆炸,鱼群,气体,星空等等。他们的原理相似。
一个粒子系统由带有不同属性的物体对象(Object)和一些它们必须遵守的行为规则组成。确切的说这些属性和规则依赖于你想模拟的现象。一些粒子系统可能需要大量的属性和复杂的规则,然而有些可能极为简单。
每个粒子需要一些属性来和其他粒子区别。通常在一个系统中的所有粒子有一个相同的属性集。
有一些适用于粒子的典型属性:
1.位置(Position):粒子在哪里。
处理运动粒子的每个粒子系统都需要知道每个粒子的位置。二维空间需要二维坐标(x , y),三维空间需要三维坐标(x , y , z)
2.速度(Velocity):包括速率(speed)和方向(direction)
位置的改变依赖于速度。速度是一个矢量表明系统由多快和粒子的运动方向。每一时间间隔,速度用于改变粒子位置。
3.加速度(Acceleration):
和速度作用于位置一样,加速度作用于速度。粒子的加速度通常适用于外力作用。外力经常是重力,或者是粒子间的引力或斥力。
4.生命值(Life):
每个粒子都有着自己的生命值,随着时间的推移,粒子的生命值不断减小,直到粒子死亡(生命值为0)。一个生命周期结束时,另一个生命周期随即开始,有时为了使粒子能够源源不断地涌出,必须使一部分粒子在初始后立即死亡。
5.衰减(Decay):
就象人会衰老一样,每个粒子也有它自己的生命周期,Decay就是用来控制粒子生命周期的一个物理量。
二、OpenGL中三维变换
OpenGL中有最主要的坐标系是模型坐标系和观察坐标系。默认情况下,模型坐标系是右手坐标系,原点在屏幕左下角,原点右方向是X axis,向上方向是Y axis。观察坐标系是左手坐标系,X axis和Y axis和观察坐标系方向相同,Z axis则相反,指向屏幕内部。
OpenGL中提供了丰富的图形变换函数,这些函数都是通过矩阵操作实现的。OpenGL提供了三种矩阵操作函数。
Void glMartixMode(GLenum mode);
mode 功能
GL_MODEVIEW 模型视图矩阵堆栈。几何模型的平移、旋转、比例缩放都是通过该函数设定的堆栈完成。视点变换也是通过这个堆栈?
GL_PROJECTION 观察矩阵堆栈。void glOrtho()和void glPerspective()改变投影变换定义的观察体
GL_TEXTURE 纹理矩阵堆栈
在OpenGL中,平移、旋转和缩放变换的组合会产生复杂的变换效果。不同的变换次序会产生不同的效果。
因为这些函数都是对当前矩阵的操作,并且是累乘的。例如glRotatef()函数的功能实际上是用模型视图矩阵堆栈的当前矩阵乘以该函数定义的矩阵,glTranslatef()则是用前面旋转函数产生的矩阵再乘以该函数定义的矩阵。这种效果就相当于
每次变换都建立了一个新的坐标系(在原坐标系基础之上),在当前矩阵堆栈未单位化之前,所有的操作都是在这个坐标系进行的。
下面是Demo中的代码:
glRotatef(90.0f,1.0f,0.0f,0.0f); // Tilt The View
glRotatef(10.0f,0.0f,1.0f,0.0f); // Rotate To The Current Stars Angle(10.0f)
glTranslatef(5.0f,0.0f,0.0f); // Move Forward On The X Plane
glRotatef(-10.0f,0.0f,1.0f,0.0f); // Cancel The Current Stars Angle
glRotatef(-90.0f,1.0f,0.0f,0.0f);
这段代码不仅将模型沿X axis上移动了5.0*cos(10)长度,还沿Y axis上移动了5.0*sin(10).
三、Blend
OpenGL中大部分的特效都在某种程度上依赖Blend。Blend被用来混合要显示的象素与屏幕上已存在象素的颜色。颜色怎么混合依赖于Alpha值。Alpha是颜色的第四个分量。在OpenGL中可以用glColor4f()代替glColor3f()来指定Alpha值。
Alpha值相当于物体的透明度。Alpha=0相当于物体完全透明。Alpha=1相当于物体完全不透明。
Blend 等式:
(Rs Sr + Rd Dr, Gs Sg + Gd Dg, Bs Sb + Bd Db, As Sa + Ad Da)
OpenGL根据上面的等式计算象素的颜色。s和r下标指定了源象素和目标象素。S和D是混合因子,指定了混合的程度。S和D最常用的值是S=(As, As, As, As),D=(1-As,1-As,1-As,1-As).这样Blend等式为:
(Rs As + Rd (1 - As), Gs As + Gd (1 - As), Bs As + Bs (1 - As), As As + Ad (1 - As))
。
OpenGL中用 glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glDisable(GL_DEPTH_TEST);
打开Blend并关闭深度测试。
四、小结
屈指算来,接触OpenGL已经差不多一个月了。因为没有系统的学习,学的都是些别人的代码中的零碎的知识点。虽然我目前对OpenGL的理解能解释我所观察到的一切现象,但我相信误解在所难免。如果有任何错误的地方请指正,Email me at
cofd.eric@163.com
Thanks in advance!
参考书目: 《NEHE’s OpenGL tutorial》