这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
编程:cpp:irrlicht:激光特效 [2019/08/02 13:50] 127.0.0.1 外部编辑 |
编程:cpp:irrlicht:激光特效 [2019/08/05 00:29] (当前版本) cgoxopx irrlicht:激光特效 更名为 编程:cpp:irrlicht:激光特效 |
||
---|---|---|---|
行 1: | 行 1: | ||
====== 3d游戏中的激光效果 ====== | ====== 3d游戏中的激光效果 ====== | ||
+ | 激光的本质是两张相互垂直的图片。创建过程如下(以irrlicht为例)\\ | ||
+ | void addLaser(//创建激光 | ||
+ | irr::scene::ISceneManager * scene, | ||
+ | const irr::core::vector3df & from, | ||
+ | const irr::core::vector3df & dir//激光方向及长度 | ||
+ | ){ | ||
+ | auto node = scene->addEmptySceneNode();//创建主节点 | ||
+ | | ||
+ | auto length=dir.getLength(); | ||
+ | irr::core::vector3df center(0,0,length/2);//中心点。 | ||
+ | //因为创建的正方形原点位于中心,要将其拉伸至length,中心点自然就是length/2 | ||
+ | | ||
+ | auto geo = scene->getGeometryCreator();//几何体绘制工具 | ||
+ | | ||
+ | auto mesh = geo->createPlaneMesh(irr::core::dimension2d<f32>(1,1));//创建一个正方形 | ||
+ | | ||
+ | //创建一个水平的和一个垂直的矩形,贴上相同的纹理 | ||
+ | auto n1 = scene->addMeshSceneNode( | ||
+ | mesh,node,-1, | ||
+ | center, | ||
+ | irr::core::vector3df(0,0,0),//水平方向 | ||
+ | irr::core::vector3df(1,1,length)//向z轴拉伸length倍 | ||
+ | ); | ||
+ | n1->setMaterialFlag(irr::video::EMF_LIGHTING, false );//不受光照 | ||
+ | n1->setMaterialTexture( 0 , this->texture);//纹理 | ||
+ | n1->setMaterialType(irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);//开启透明 | ||
+ | | ||
+ | auto n2 = scene->addMeshSceneNode( | ||
+ | mesh,node,-1, | ||
+ | center, | ||
+ | irr::core::vector3df(0,0,90),//旋转90度(irr和其他引擎不一样,irr使用角度来控制旋转) | ||
+ | irr::core::vector3df(1,1,length) | ||
+ | ); | ||
+ | n2->setMaterialFlag(irr::video::EMF_LIGHTING, false );//不受光照 | ||
+ | n2->setMaterialTexture( 0 , this->texture);//纹理 | ||
+ | n2->setMaterialType(irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);//开启透明 | ||
+ | | ||
+ | mesh->drop();//mesh不再使用了 | ||
+ | | ||
+ | //设置节点属性 | ||
+ | node->setPosition(from);//位置 | ||
+ | node->setRotation(dir.getHorizontalAngle());//旋转 | ||
+ | | ||
+ | } |