Particle Engine Using OpenGL

原创 2005年05月22日 09:39:00
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》

Particle Engine介绍

Particle Engine介绍         本文介绍我自己开发的一个游戏编辑器,Particle Engine的主要功能和基本操作;介绍分为三个部分,第一部分介绍开发PE的原因和PE的主要功...

QML官方教程——Using the Qt Quick Particle System

附网址:http://qt-project.org/doc/qt-5/qtquick-effects-particles.html

ArcGIS Engine Controls fail to build using Visual Studio 2010 on a 64-bit OS

错误 当构建基于地图引擎控件的应用程序在一个支持 64 位操作系统 (OS) 针对微软。在 Visual Studio 2010 .Net 3.5 框架,可能会出现以下错误: "...

Using WITH Clause to mimic App Engine Temp Tables

I've been working on an App Engine that makes use of Temp tables and uses the %Table meta-sql. It's ...

Using Application Engine to Import Data from Files

You can use application engine to import files into tables in your PeopleSoft Database. Prior to ver...

File Upload on Google App Engine using struts2

Few months back, i wrote a blog on Creating Struts2 application on Google App Engine and some develo...
  • wwwqvod
  • wwwqvod
  • 2011年06月05日 16:42
  • 1870

Using robots.txt To Control Search Engine Spiders

 转自 http://www.activewebhosting.com/faq/web-robots.html What are robots and spiders? Search engines...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Particle Engine Using OpenGL
举报原因:
原因补充:

(最多只允许输入30个字)