說明:
*介紹從.irr檔案加載場景節點 *三步: *加載.irr檔案 *加載場景節點 *添加碰撞檢測,綁定到照相機 詳情請看源碼及其注釋.
源碼及注釋:
#include <iostream> #include <irrlicht.h> #include "driverChoice.h"
using namespace irr;
#ifdef _IRR_WINDOWS_ #pragma comment(lib, "irrlicht.lib") //#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") #endif
int main(int argc, char** argv) { video::E_DRIVER_TYPE driverType = driverChoiceConsole(); IrrlichtDevice *device = createDevice(driverType, core::dimension2d<u32>(720, 455), 32, false, true, false, 0); if (!device) return 1; device->setWindowCaption(L"15.LoadIrrFile");
video::IVideoDriver *driver = device->getVideoDriver(); scene::ISceneManager *smgr = device->getSceneManager(); gui::IGUIEnvironment *guiev = device->getGUIEnvironment(); //1.準備 scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 50, 0.1); //建立一個meta三角形選擇器用于儲存一些三角形選擇器 //IMetaTriangleSelector多個選擇器的集合 scene::IMetaTriangleSelector* meta = smgr->createMetaTriangleSelector();
if (argc > 1) smgr->loadScene(argv[1]); else smgr->loadScene("../media/aexample-mytest.irr");//注意名字,看情況更改
//擷取到所有的場景節點 core::array<scene::ISceneNode*> nodes; smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);
for (u32 i = 0; i < nodes.size(); ++i) { scene::ISceneNode* node = nodes[i]; scene::ITriangleSelector* selector = 0;
switch (node->getType()) { case scene::ESNT_CUBE: case scene::ESNT_ANIMATED_MESH: //這麼用的原因是:隻用于檢測錄影機,是以隻使用包圍盒檢測 //而不用((scene::IAnimateMeshSceneNode*)node)->getMesh(0); selector = smgr->createTriangleSelectorFromBoundingBox(node); break; case scene::ESNT_MESH: case scene::ESNT_SPHERE: selector = smgr->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(),node); break; case scene::ESNT_TERRAIN: selector = smgr->createTerrainTriangleSelector((scene::ITerrainSceneNode*)node); break; case scene::ESNT_OCTREE: selector = smgr->createOctreeTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node); break; default: break; } if (selector) { //加入到meta selector meta->addTriangleSelector(selector); selector->drop(); } } scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(meta, camera, core::vector3df(5, 5, 5), core::vector3df(0, 0, 0)); meta->drop(); camera->addAnimator(anim); anim->drop();
camera->setPosition(core::vector3df(0, 20, 0)); scene::ISceneNode* cube = smgr->getSceneNodeFromType(scene::ESNT_CUBE); if (cube) camera->setTarget(cube->getAbsolutePosition());
int lastFPS = -1; while (device->run()) { driver->beginScene(true, true, video::SColor(255, 100, 101, 140));
smgr->drawAll(); guiev->drawAll();
driver->endScene();
int fps = driver->getFPS(); if (lastFPS != fps) { core::stringw str = L"15.LoadIrrFile ["; str += driver->getName(); str += "]FPS.", str += fps; device->setWindowCaption(str.c_str()); lastFPS = fps; } } device->drop();
return 0; }