~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;
}

 

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet

godddddddddd

#1 By book on 2008-11-18 00:26

Favourites