Irrlicht学习之粒子系统的研究
马上十一月份就要过去了,感觉时间过得很快的样子,我学习的Irrlicht引擎也有大半个月了,但是我关注这款引擎已经很久了,记得那是去年的时候我看到了一篇博客中引用这样的引擎,好奇之下在搜了一下这个引擎,发现还不错,大家都说Irrlicht是一款轻量级的引擎,非常适合3D游戏开发的初学者进行学习,而且这款引擎是对接口进行编程,内存管理这些可以大可不用操心,需要释放的内容可以调用drop()函数即可。总而言之,Irrlicht引擎对我来说比较简单,我希望在不久后以它为基础进行深入的探析,深入了解游戏引擎的工作原理。
原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/16971489
粒子系统是作为游戏引擎不可或缺的一部分,它可以创造出非常炫的效果,但是传统上,如果是从Direct3D或者是从OpenGL/GLUT开始,将会遇到很大的麻烦,因为需要定义粒子发射器以及粒子管理器,还有种种复杂的东西,以前我曾经用Direct3D模仿粒子系统制作弹幕,就知道管理粒子有多么的复杂。不过在使用了Irrlicht之后,我觉得使用粒子系统简单了许多,只需要调用几个函数就可以解决问题。
演示程序和源代码的下载地址:这里
下面是演示程序的截图:
有关粒子系统的内容,我用C语言的方式把它放在了一个函数中。这个函数负责添加所有与粒子系统相关的内容。顺便说一下,Irrlicht的粒子系统其实也是一个场景节点,所以它隶属于场景管理器(ISceneManager)。它和带动画的mesh一样也可以设置动画,也就是粒子的运动。粒子系统既可以使用代码实现,也可以作为场景的一部分使用CopperCube(IrrEdit)进行编辑预览。
不过,我这回使用的是代码实现。如果项目比较大且有这样的需求,我会转向使用场景编辑器。下面就是创建粒子系统的核心代码,代码中有简单的注释,便于大家和我以后对其进行查阅。
void CreateParticles( ISceneManager* pSMgr) { IParticleSystemSceneNode*pParticle = pSMgr->addParticleSystemSceneNode(false ); IParticleEmitter*pEmitter = pParticle->createBoxEmitter( aabbox3d<f32>(-5.0f, 0.0f, -5.0f, 5.0f, 1.0f, 5.0f ), //碰撞盒 vector3df(0.0f, 0.1f, 0.0f ), //方向 50, //每秒最少粒子 200, //每秒最大粒子 SColor(0, 0, 0, 255 ), //最小开始颜色 SColor(0, 255, 255, 255 ), //最大开始颜色 800, //最小生存时间 1000, //最大生存时间 0, //最大角(弧度制) dimension2df(10.0f, 10.0f ), //最小开始大小 dimension2df(20.0f, 20.0f ) ); //最大开始大小 pParticle->setEmitter(pEmitter ); pEmitter->drop();// 发射器可以不用了 //设置粒子系统 pParticle->setPosition(vector3df( 0.0f, -10.0f, 0.0f ) ); pParticle->setScale(vector3df( 2.0f, 2.0f, 2.0f ) ); pParticle->setMaterialFlag(EMF_LIGHTING, false ); pParticle->setMaterialFlag(EMF_ZWRITE_ENABLE, false ); pParticle->setMaterialTexture( nullptr, pSMgr->getVideoDriver()->getTexture( "fireball.bmp" ) ); pParticle->setMaterialType(EMT_TRANSPARENT_ADD_COLOR ); }