Irrlicht学习之水波特效的研究
上一篇文章作为一个引子,介绍了粒子系统的简单使用方法,不过Irrlicht的粒子系统提供的效果非常多,只要选对了粒子特效,再加上合适的美术资源,就可以制作相当漂亮以及震撼的特效。同时粒子系统作为场景的一个普通的节点,可以绑定在场景的任何位置,也就是说一些场景效果比如说昏暗的山洞里一把篝火这样的特效就可以绑定在场景的火把处,通过场景编辑器编辑完成,再用程序导入irr文件,这样的话一个逼真的场景就实现了。
原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/16973059
演示程序和源代码的下载地址:这里
下面是程序截图:
今天我对粒子系统的理解又加深了一点。粒子系统中的粒子除了有发射器(Emitter)之外,还有效应器(Affector、Effector)。好比传球,篮球在你手中的时候,手作为发射器对篮球施加影响,当你把球抛出去的时候,篮球不受手的影响了,此时只有重力对其施加影响。当然也有除了重力外受到其他效应器影响的情况比如说风和电磁场,更不用说带有魔幻色彩的游戏世界了。所以说要设置一个完整的粒子系统除了发射器外,还必须有效应器。
以上就是我对粒子系统的理解,除此之外,这回的演示程序还包括了水波特效和雾特效。下面就把水波特效拿出来做做笔记。
水波在Irrlicht中是一种网格(mesh),其实就是地形网格(terrainmesh)。Irrlicht有一个非常方便的函数对其进行创建。叫ISceneManager::addHillPlaneMesh()。这个函数的参数非常多,在稍后的代码中会将函数的参数列举出来。同时一个网格需要一个场景节点作为容器承载它,所以在创建了水波网格后需要将网格的指针传递给ISceneManager::addWaterSurfaceSceneNode()函数。演示程序截图展示了粼粼的水波和依稀可见的鹅卵石,其实这是在地形网格中贴了双重纹理产生的效果。当然,还需要设置材质类型:ISceneNode::setMaterialType( EMT_REFLECTION_2_LAYER );否则的话是这样的效果:
最后通过IVideoDriver:: setFog()函数设置雾,Irrlicht有两种雾可以选择:一是顶点雾二是片断(像素)雾,这里选择了像素雾,因为像素雾更加逼真漂亮。如上图,可以发现远处有一种灰蒙蒙的感觉,这就是像素雾的效果。
下面是创建水波特效的核心代码:
void CreateWaterEffect( ISceneManager* pSMgr) { IAnimatedMesh*pHill = pSMgr->addHillPlaneMesh(// 添加测试的山平面网格 "waterMesh", //网格的大小 dimension2d<f32>(30.0f, 30.0f ), // 网格片的大小 dimension2d<u32>(30, 30 ), // 网格两个维度的大小 nullptr, //材质的指针 0, //山高度 dimension2d<f32>(0.0f, 0.0f ), // 山的个数 dimension2d<f32>(10.0f, 10.0f ) ); // 纹理重复的个数 ISceneNode*pHillNode = pSMgr->addWaterSurfaceSceneNode( pHill->getMesh(0 ), //网格的指针 3.0f, //波的高度 300.0f, //波速 30.0f); //波长 pHillNode->setPosition(vector3df( 0.0f, -10.0f, 0.0f ) ); pHillNode->setMaterialTexture( 0, //纹理层 pSMgr->getVideoDriver()->getTexture( "stones.jpg" ) );// 纹理指针 pHillNode->setMaterialTexture( 1, //纹理层 pSMgr->getVideoDriver()->getTexture( "water.jpg" ) );// 纹理指针 pHillNode->setMaterialType(EMT_REFLECTION_2_LAYER );// 将0号纹理反射到1号纹理上 pHillNode->setMaterialFlag(EMF_FOG_ENABLE, true ); pHillNode->setMaterialFlag(EMF_LIGHTING, false ); //添加雾 pSMgr->getVideoDriver()->setFog( video::SColor(0, 138, 125, 81 ), // 雾颜色(忽略Alpha位) video::EFT_FOG_LINEAR, // 雾的类型 250.0f, //雾起始距离 1000.0f, //雾结束距离 0.01f, //雾的浓度 true, //true代表像素(片断)雾,false代表顶点雾 false); //范围雾 //添加全局光 pSMgr->setAmbientLight(SColor( 255, 100, 100, 100 ) ); }