激光的本质是两张相互垂直的图片。创建过程如下(以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());//旋转
}