1. 程式人生 > >Irrlicht 中如何自定義場景節點和網格資料

Irrlicht 中如何自定義場景節點和網格資料

自定義場景節點需要繼承ISceneNode注意ISceneNode有幾個函式必須覆蓋

自定義網格資料需要繼承 IMeshNode,IMeshNode繼承與ISceneNode

class CSampleSceneNode : public scene::ISceneNode

{

core::aabbox3d<f32> Box;

    //頂點資料

video::S3DVertex Vertices[4];

    //材質

video::SMaterial Material;

public:

CSampleSceneNode(scene::ISceneNode

* parent, scene::ISceneManager* mgr, s32 id)

: scene::ISceneNode(parent, mgr, id)

{

         //設定節點的材質 ,一般情況下需要將lighting 設定為false (表示不需要光照)

Material.Wireframe = false;

Material.Lighting = false;

//節點的四個頂點資料

Vertices[0] = video::S3DVertex(0,0,10, 1,1,0,

video::SColor(255,0,255,255), 0, 1);

Vertices[1]

= video::S3DVertex(10,0,-10, 1,0,0,

video::SColor(255,255,0,255), 1, 1);

Vertices[2] = video::S3DVertex(0,20,0, 0,1,1,

video::SColor(255,255,255,0), 1, 0);

Vertices[3] = video::S3DVertex(-10,0,-10, 0,0,1,

video::SColor(255,0,255,0), 0, 0);

Box.reset(Vertices[0].Pos);

for (s32 i=1; i<4; ++i)

Box.addInternalPoint(Vertices[i].Pos);

}

virtual void OnRegisterSceneNode()

{

if (IsVisible)

SceneManager->registerNodeForRendering(this);

ISceneNode::OnRegisterSceneNode();

}

virtual void render()

{

u16 indices[] = { 0,2,3, 2,1,3, 1,0,3, 2,0,1 };

video::IVideoDriver* driver = SceneManager->getVideoDriver();

driver->setMaterial(Material);

driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);

//通過4個頂點畫出立體三角形

driver->drawVertexPrimitiveList(&Vertices[0], 4, &indices[0], 4, video::EVT_STANDARD, scene::EPT_TRIANGLES, video::EIT_16BIT);

}

virtual const core::aabbox3d<f32>& getBoundingBox() const

{

return Box;

}

virtual u32 getMaterialCount() const

{

return 1;

}

virtual video::SMaterial& getMaterial(u32 i)

{

return Material;

}

};