用户工具

站点工具


编程:cpp:irrlicht:激光特效

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());//旋转
      
  }
编程/cpp/irrlicht/激光特效.txt · 最后更改: 2019/08/05 00:29 由 cgoxopx