~Irrlicht Tutorial2~ The SceneNoding....
posted on 17 Nov 2008 18:24 by apemon-chan in game-programingก่อนที่จะเริ่มในคราวนี้ก็ขอแนะนำบล็อกที่เป็นประโยชน์ต่อการศึกษาengineตัวนี้นะงับ http://afterzeroo.exteen.com ซึ่งเป็นบล็อกที่มีเนื้อหาดีมากงับ ลองเข้าไปดูกันนา
วันนี้เราจะมาพูดถึงSceneNodeกัน อะไรคือSceneNodeเดี๋ยวเราจะได้รู้กันงับ SceneNode พูกง่ายๆตาม
ประสาnoobก็คือobjectหนึ่งๆบนโลกนะงับเช่น ลูกบอลลูกหนึ่ง,กล่อง หรือ ปราสาทหลังหนึ่ง,เกรียนตัวหนึ่ง หรือแม้แต่มุมกล้องที่เราใช้ ประมาณนี้นักแล
สำหรับtutorialนี้เราจะมาสร้างSceneNodeง่ายๆกันคับ ว่าแล้วเราก็ลองไปเริ่มกันเลยยยยย......
ก่อนอื่นก็หยิบงานคราวที่แล้วมา่ปัดฝุ่นแล้วทำต่อนะงับ จากที่แล้วหลังจากที่เราได้สร้างSceneManager คราวนี้เราจะได้ใช้ประโยชน์จากมันงับ โดยเริ่มจากการสร้างSceneNodeขึ้นมาก่อนงับ
scene::ISceneNode* node;
สร้างSceneNodeที่มีชื่อว่าnodeงับ(เล่นง่ายไหมล่ะ)
ต่อมาอยากจะเอาลูกบอลหรือกล่องก่อนล่ะ งั้นเราขอเอาลูกบอลก่อนละกันงับ
node=smgr->addSphereSceneNode();
สร้างเสร็จแล้ว แต่ยังไม่ได้กำหนดตำแหน่งที่อยู่ให้มันเลยอ่ะ งั้นเรามากำหนดตำแหน่งให้มันหน่อยละกัน
node->setPosition(core::vector3df(0,0,30));
อันนี้กำหนดตำแหน่งให้มันอยู่บนระนะทางแกนZไปประมาณ30งับ สำหรับการสร้างวัตถุ3มิติ เวลาเราอ้างอิงพิกัดต่างๆเราจะอ้างอิงเป็นvectorนะงับ ไม่ใช่กำหนดpixelแบบใน2มิติ
ตอนนี้ถ้าลองrunดูจะพบว่ามันเป็นก้อนกลมๆสีดำนะงับ เราจะมาแปะtextureให้มันซะหน่อยงับ
node->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
ตอนนี้เราได้ปะtextureลงไปแล้ว(ไฟล์พวกนี้หาได้จากโฟล์เดอร์mediaที่อยู่ในโฟล์เดอร์irrlichtนะงับ ลองหาดูแล้วก็อบโฟล์เดอร์mediaมาไว้ในโฟล์เดอร์งานของเรางับ) ลองrunดู อ้ายทำไมมันยังดำเมี่ยมอยู่ฟระ
ที่เป็นแบบนี้เพราะเรายังไม่ได้ปิดการคำนวณแสงมันงับ ว่าแล้วก็มันมันซะ
node->setMaterialFlag(video::EMF_LIGHTING,false);
ยัง มันยังไม่จบยังไม่ได้ใส่มุมกล้องลงไปเลย ว่าแต่จะเอามุมกล้องแบบmayaหรือfpsดีล่ะ
smgr->addCameraSceneNodeFPS();
ถ้าจะใช้แบบmayaก็ smgr->addCameraSceneNodeMaya();
ทีนี้ลองrunดูก็น่าจะเห็นบอลมันอยู่ตรงกลางแล้วเน้อ ต่อมาเราจะมาสร้างกล่องกันล่ะ
scene::ISceneNode* node2;
node2=smgr->addCubeSceneNode();
node2->setPosition(core::vector3df(-30,0,30));
node2->setMaterialFlag(video::EMF_LIGHTING,false);
node2->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
อันนี้ก็ล้อเลียนของเดิมนะงับ แต่เราจะมาปู้นี้ปู้ยำกับเจ้ากล่องนี้ด้วย2คำสั่งนี้งับ
node2->setRotation(core::vector3df(10,20,30));
node2->setScale(core::vector3df(2,1,1));
อันแรกทำให้กล่องมันวางเอียงๆ ส่วนอันที่2ทำให้กล่องมีรูปทรงตามscaleมันในทีนี้ เราให้มันขยายความยาวด้านแกนxให้เป็น2เท่างับ ลองแก้ค่าตัวเลขเล่นๆน่ะ เราจะได้กล่องรูปทรงประหลาดออกมา
รูปก็ประมาณนี้งับ
ส่วนอันนี้ก็codeทั้งหมดงับ
#include <irrlicht.h>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
int main(){
IrrlichtDevice *device =
createDevice(video::EDT_DIRECT3D9,
core::dimension2d<s32>(640,480));
if (device == 0)
return 1;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
scene::ISceneNode* node;
scene::ISceneNode* node2;
node=smgr->addSphereSceneNode();
node->setPosition(core::vector3df(0,0,30));
node->setMaterialFlag(video::EMF_LIGHTING,false);
node->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
node2=smgr->addCubeSceneNode();
node2->setPosition(core::vector3df(-30,0,30));
node2->setRotation(core::vector3df(10,20,30));
node2->setScale(core::vector3df(2,1,1));
node2->setMaterialFlag(video::EMF_LIGHTING,false);
node2->setMaterialTexture(0,driver->getTexture("media/wall.bmp"));
smgr->addCameraSceneNodeFPS();
while(device->run())
{
driver->beginScene(true, true, video::SColor(0,200,200,200));
smgr->drawAll();
driver->endScene();
}
device->drop();
return 0;
}
#1 By book on 2008-11-18 00:26