~Irrlicht Tutorial4~ LoadMap and Modeling...

posted on 08 Dec 2008 16:51 by apemon-chan  in game-programing

            ในคราวนี้เราจะมาload mapเข้าแผนที่กันงับ หลังจากที่คราวที่แล้วเราได้สร้างanimatorอย่างง่ายๆ
    แล้ว โดยไฟล์ที่irrlicht supportมีดังนี้(อ้างอิงจากwikiนะ)

            Animated and Rigged:
                B3D files (.b3d)
                Milkshape (.ms3d)
                Microsoft DirectX (.x) (binary & text)

            Animated only:
                Quake 2 models (.md2)
                Quake 3 models (.md3)

            Static:
                3D Studio meshes (.3ds)
                Alias Wavefront Maya (.obj)
                Cartography shop 4 (.csm)
                COLLADA (.xml, .dae)
                DeleD (.dmf)
                FSRad oct (.oct)
                Irrlicht scenes (.irr)
                My3DTools 3 (.my3D)
                OGRE meshes (.mesh)
                Pulsar LMTools (.lmts)
                Quake 3 levels (.bsp)

            โดยเราจะเริ่มโหลดmapเข้ามาในงานเรานะงับ โดยmapที่เราจะใช้นั้นเป็นmapของเกมquake3โดยจะอยู่
    ในโฟล์เดอร์mediaที่อยู่ในโฟล์เดอร์irrlichtนะงับ ลองหาดูแล้วก็อบโฟล์เดอร์mediaมาไว้ในโฟล์เดอร์งานของ
    เรางับ ไฟล์มันจานามสกุลpk3ซึ่งเราสามารถแกะมันด้วยwinrarงับ ดังนั้นเวลาเราจะโหลดmapนี้ต้องอ่านมัน
    ในรูปแบบไฟล์ที่ถูกอัดzipงับ

                device->getFileSystem()->addZipFileArchive("media/map-20kdm2.pk3");

            อ่านไฟล์ที่ถูกอัดzipงับ

                scene::IAnimatedMesh* mesh=0;
                mesh=smgr->getMesh("20kdm2.bsp");

            สร้างIAnimatedMesh โดยตัวนี้จะเหมือนกับเป็นตัวโหลดโมเดล ในขณะที่scenenodeนั้นใช้ควบคุม
    วัตถุนั้น
            สำหรับคำสั่งข้างบนนั้นคือสั่งให้โหลดโมเดล20kdm2.bspมาใส่ในIAnimatedMesh (ไฟล์
    20kdm2.bspนี้จะอยู่ในmap-20kdm2.pk3 ลองแกะดูเน้อ)

               scene::ISceneNode* map=0;
               map=smgr->addOctTreeSceneNode(mesh->getMesh(0));

            สร้างnodeมาเก็บควบคุมmapโดยnodeที่ใช้คราวนี้คือOctTreeSceneNodeซึ่งเป็นnodeอีกประเภท
    หนึ่งที่จะมาว่ากันทีหลัง

               map->setPosition(core::vector3df(-1300,-144,-1249));

            อันนี้setตำแหน่งของmapเรางับ(ให้มองว่าmapเหมือนก้อนโมเดลใหญ่ๆน่ะ) 

            เสร็จแล้วก็add camerascenenodeแล้วก็อย่าลืมmain loop เมื่อเสร็จสมบูรณ์แล้วลองรันดูจะได้ผลดัง
    ภาพงับ

                  

            ตอนนี้ก็บรรลุจุดประสงค์ไป1อย่าง ต่อมาเราจะโหลดโมเดลกันงับ

                scene::IAnimatedMeshSceneNode* anms =0;
                mesh=smgr->getMesh("media/sydney.md2");
                smgr->addAnimatedMeshSceneNode(mesh);

            เห็นถึงความแตกต่างยังงับระหว่างmapกับmodel
                -modelที่เราโหลดมาเป็นไฟล์md2ซึ่งมีการเคลื่อนไหว ในขณะที่mapเป็นbspซึ่งมันstatic
                -ดังนั้นในการเรียกใช้meshจึงไม่เหมือนกัน อย่างmapนั้นเราใช้mesh->getMesh(0) ซึ่ง
            มันเป็นIStaticMesh ในขณะที่modelเราใช้meshตรงๆเลย(อย่าลืมว่าเดิมทีเราประกาศให้มัน
            เป็นIAnimatedMesh
                -OctTreeSceneNodeกับAnimatedMeshSceneNode นั้นไม่เหมือนกันน่ะ OctTree
            คือAnimatedที่ลดการวาดรูปทรง ซึ่งmapนี่คงไม่น่ามีการเปลี่ยนแปลงตลอดเวลา(แต่มันมีขนาดใหญ่)
            ดังนั้นเราจึงใช้OctTreeสำหรับวัตถุใหญ่ๆที่ไม่ค่อยมีการanimate ส่วนAnimatedนี่ก็ใช้กับวัตถุที่มี
            animateทั่วๆไปงับ

               anms->setMaterialTexture(0,driver->getTexture("media/sydney.bmp"));
               anms->setMaterialFlag(video::EMF_LIGHTING,false);
               anms->setPosition(core::vector3df(114,-50,96));
               anms->setScale(core::vector3df(2,2,2));

         อันนี้ก็โหลดtexture,แล้วก็ตั้งค่าปกติ(ถ้าไม่getลองดูในtutorialที่ผ่านๆมาดู)

              anms->setAnimationSpeed(30);
              anms->setFrameLoop(200,400);

         อันนี้คือsetว่าจะให้animateเร็วขนาดไหนโดยตัวเลขในวงเล็บคือframe per sec
         ส่วนบรรทัดต่อมาคือจะให้เลือกเล่นช่วงที่เฟรมที่เราต้องการ โดยในตัวอย่างคือเริ่มที่200จบที่400
         แล้วก็เล่นซำ้ช่วงนี้เรื่อยๆ ลองrunดูก็จะได้ผลดังภาพ

                

    codeตัวอย่างงับ

    //header
    #include <irrlicht.h>
    using namespace irr;
    #pragma comment(lib, "Irrlicht.lib")
    //main
    int main(){
    IrrlichtDevice *device =createDevice(
                                        video::EDT_DIRECT3D9, core::dimension2d<s32>(640, 480));
    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();

    //load mesh for map
    device->getFileSystem()->addZipFileArchive("media/map-20kdm2.pk3");
    scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");
    scene::ISceneNode* map = 0;
    map = smgr->addOctTreeSceneNode(mesh->getMesh(0));
    map->setPosition(core::vector3df(-1300,-144,-1249));

    //setup camera   
    smgr->addCameraSceneNodeFPS();

    //hide mouse cursor   
    device->getCursorControl()->setVisible(false);

    //load model
    mesh=smgr->getMesh("media/sydney.md2");
    scene::IAnimatedMeshSceneNode* anms =
    smgr->addAnimatedMeshSceneNode(mesh);
    anms->setMaterialFlag(video::EMF_LIGHTING,false);
    anms->setMaterialTexture(0,driver->getTexture("media/sydney.bmp"));
    anms->setPosition(core::vector3df(114,-50,96));
    anms->setScale(core::vector3df(2,2,2));
    anms->setAnimationSpeed(30);
    anms->setFrameLoop(200,400);

    //main loop
    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

เมพขริงๆ

#1 By book on 2008-12-10 01:43

อยากรูอ่ะ ว่ามีโปรแกรมอะไรที่ edit md2 ได้เจ๋งๆบ้าง
เดิมๆ ผมใช้ 3dsmax แต่มาเปิด md2 กับ blander รู้สึกไม่ดีเลยครับ มีโปรแรกมไหนที่สร้าง md2 ดีๆ(ที่คล้ายกับ 3dsmax) บ้างครับ

#2 By Browny Application on 2009-01-17 18:32

จะว่ากันตรงๆผมก็ยังไม่เป็นพวก3dเลยงับ(แต่ดันอยากลอง
ศึกษาgraphic enginesad smile ) และขณะนี้หนังสือ3dmax
ที่ซื้อมาคาดว่ามีสถานะที่น่าจะถูกลืมไปแล้วสะงั้นsad smile
แต่เท่าที่ดูตามบอร์ดต่างๆเรื่มรู้สึกว่าไฟล์ที่ได้รับความนิยม
ในการทำโมเดลสำหรับเกมในสมัยนี้มักเป็น .b3d .x นะ
เพราะเห็นเขาว่ามันมีข้อจำกัดอะไรสักอย่างนี่แหละ
ส่วนโปรแกรมedit md2 เท่าที่หาดู เห็นมีตัวที่น่าสนใจคือ
Quake Model Editor http://www.quake2.com/fear/ed_model.htm ส่วนเรื่องที่ใช้งานได้ดีไหมอันนี้ผมก็ยังไม่ทราบนะงับ เพราะ ยังไม่ได้ลอง
สำหรับข้อมูลอื่นๆลองดูได้ที่

http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=31951&highlight=program+programme+md2
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=20568&highlight=md2+editor
http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=5609&highlight=md2+editor
และhttp://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=2963&highlight=md2+editor

สุดท้ายก็ขอโทษด้วยที่ไม่สามารถตอบคำถามได้ด้วยตัวเองงับ(แบบว่ายังกะลังฝึกหัดอยู่อ่ะงับ)

#3 By apemon on 2009-01-17 22:56

คือผมมีปัญหาตรง dimension2d ตั้งแต่ Tutorial แรกแล้วอ่ะครับ sad smile
คือมันจะขึ้นว่า 'irr::core::dimension2d' : use of class
template requires template argument list อ่ะครับ
ผมต้องไปเปลี่ยน dimension2d (ประมาณบรรทัดที่ 5 - 6)
ให้เป็น dimension2d<s32> (มั่วเอา cry )
มันถึงจะใช้งานได้อ่ะครับ อยากทราบว่ามันต่างกันยังไงครับ embarrassed

#4 By KraBrR (117.47.231.46) on 2009-03-15 12:20

อ้อ จะบอกว่าจริงๆแล้วมันมีs32ด้วยแหละครับ คาดว่าในblogนี้คงพิมพ์ตกไป หรือไม่ก็จะเหมือนกรณีบรรทัด include
ที่มีพวกเครื่องหมาย มากกว่า น้อยกว่า แล้วblogมันจะเข้าใจผิดคิดว่าเป็นtag html sad smile
ส่วนdimension2d<32>นั้น ส่วนเครื่องหมาย <> นี้มันคือ
genericงับ โดย u32 คือ unsign char s32 คือ signed chat หรือ int นะแหละ s16 u16 คือ short ส่วน f32 คือ float f64คือ double งับquestion

#5 By apemon on 2009-03-15 13:21

พี่เจ้าของ Blog ฮะผมขอปรึกษาเกี่ยวกับ Irrlicht หน่อยได้ไหมครับ พอดีในเมลผมไม่มีใครที่ใช้ Irrlicht เลย


แอดมาหน่อยนะคับ _mind@Live.com

#6 By mycom on 2009-05-26 00:33

Favourites