3d遊戲裏的武器特效比如有粒子發光,火焰,或者是劍氣散發出來。一般都可以用粒子來實現(有點偷懶還可以用精靈圖片動畫來實現= =更節約資源,比如夢幻西遊那種2d的特效都是圖片動畫)。
例如上圖的武器粒子效果。
思路是這樣的。
找到武器劍柄節點以及武器劍尖節點。然後把粒子系統設置在這個AB兩點之間噴射即可,萬一武器是移動的位置方向變化的,那麼也要隨時update方向,或者綁定到父節點方式,一勞永逸。
首先是武器模型要設置骨骼節點。
我的武器劍尖節點叫joint4,劍柄joint2
下面開始代碼了,我用irrlicht 3d引擎來做示範。
加載人物。。
加載武器綁定到人物後背節點
//添加武器節點
scene::IAnimatedMeshSceneNode* weaponNode = smgr->addAnimatedMeshSceneNode( weaponmesh );
video::SColor startcolor,endcolor;
startcolor=video::SColor(0,50,0,50);//粒子系統開始到結束的顏色定義 可產生漸變效果
endcolor=SColor(0,0,40,50);
// 創建 粒子系統
scene::ISceneNode* pJointNode =weaponNode->getJointNode("joint2"); //joint4是劍尖
if(pJointNode)
{
vector3df pos1=pJointNode->getAbsolutePosition();
vector3df pos2=weaponNode->getJointNode("joint4")->getAbsolutePosition();
vector3df dir=pos1-pos2;
dir.normalize();
ps = device->getSceneManager()->addParticleSystemSceneNode(false); //創建一個粒子系統,並使用自定義的發射器
em=ps->createPointEmitter(dir,20,20,
startcolor, endcolor,//開始顏色和結束顏色
2000,2000 //存活時間,800-2000毫秒
);
em->setMaxStartSize(core::dimension2d<f32>(5.0f, 5.0f));
em->setMinStartSize(core::dimension2d<f32>(5.0f, 5.0f));
ps->setEmitter(em);//粒子系統設置發射器
em->drop();
ps->setMaterialFlag(video::EMF_LIGHTING, false);
ps->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
ps->setMaterialTexture(0, device->getVideoDriver()->getTexture("textures/flare.bmp")); // fireball
//ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
ps->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
pJointNode->addChild(ps);
}
然後不斷更新武器的粒子方向
void MyWeapon::update()
{
if(weaponType>0 && ps){
vector3df pos1=weaponNode->getJointNode("joint4")->getAbsolutePosition();
vector3df pos2=weaponNode->getJointNode("joint2")->getAbsolutePosition();
vector3df dir=pos1-pos2;
dir.normalize();
dir*=0.007f;
em->setDirection(dir);
}
}
完。
歡迎任何形式的轉載,但請務必註明出處,尊重他人勞動成果。