天天看點

Qt 使用irrlicht(鬼火)3D引擎

Irrlicht引擎是一個用C++書寫的高性能實時的3D引擎,可以應用于C++程式或者.NET語言中。通過使用Direct3D(Windows平台),OpenGL 1.2或它自己的軟體着色程式,可以實作該引擎的完全跨平台。盡管是開源的,該Irrlicht庫提供了可以在商業級的3D引擎上具有的藝術特性,例如動态的陰影,粒子系統,角色動畫,室内和室外技術以及碰撞檢測等。

具體資訊 百度百科。

如何使用,

首先使用Qt建立工程,略過。

在Qt pro工程檔案總中加入引擎頭檔案路徑,和庫檔案路徑。

#包含鬼火3D引擎需要的頭檔案路勁
INCLUDEPATH +=D:\irrlicht-1.8.3\include
#連接配接開發需要用到的庫檔案
LIBS +=D:\irrlicht-1.8.3\lib\Win32-gcc\libIrrlicht.a      

如圖所示

Qt 使用irrlicht(鬼火)3D引擎
Qt 使用irrlicht(鬼火)3D引擎
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;      

引擎初始化

void Irr_Device::init_Dev()
{
    if(m_Device != NULL)
    {
        return;
    }
    SIrrlichtCreationParameters params;
    params.AntiAlias = 0;
    params.Bits = 32;
    params.DeviceType = EIDT_BEST;
    params.Doublebuffer = true;
    params.DriverType = EDT_OPENGL;
    params.EventReceiver = 0;
    params.Fullscreen = false;
    params.HighPrecisionFPU = false;
    params.IgnoreInput = false;
    params.LoggingLevel = ELL_INFORMATION;
    params.Stencilbuffer = true;
    params.Stereobuffer = false;
    params.Vsync = false;
 
 
    // Specify which window/widget to render to
    // 指定哪個視窗小部件呈現
    params.WindowId = reinterpret_cast<void*>(winId());
    params.WindowSize.Width = width();
    params.WindowSize.Height = height();
    params.WithAlphaChannel = true;
    params.ZBufferBits = 16;
 
    // Create the Irrlicht Device with the previously specified parameters
    // 建立Irrlicht裝置的使用與前面指定的參數
 
    m_Device = createDeviceEx(params);
 
    /*
        擷取視訊裝置,場景管理器和使用者圖形環境的指針并存儲起來。
    */
    video_Driver = m_Device->getVideoDriver();
    scene_Msnsger = m_Device->getSceneManager();
    guienv = m_Device->getGUIEnvironment();
    //smgr->loadScene
    qDebug()<< scene_Msnsger->loadScene("123.irr");
    /*
        Now we'll create a camera, and give it a collision response animator
        that's built from the mesh nodes in the scene we just loaded.
    */
    /*
        現在我們将建立一個相機,給它一個碰撞響應動畫師  由網格節點的現場加載。
    */
    m_Camera = scene_Msnsger->addCameraSceneNodeFPS(0,50.f,0.1f);
    /*
        Now we will find all the nodes in the scene and create triangle
        selectors for all suitable nodes.  Typically, you would want to make a
        more informed decision about which nodes to performs collision checks
        on; you could capture that information in the node name or Id.
    */
    /*
        現在我們将在現場找到的所有節點并建立三角形  選擇合适的節點。通常,您會想要  更明智的決定哪些節點執行碰撞檢查  ;你可以捕捉資訊的節點名稱或Id。
    */
    scene::IMetaTriangleSelector* meta = scene_Msnsger->createMetaTriangleSelector();
    //    core::array<scene::ISceneNode*> nodes;
    //    scene_Msnsger->getSceneNodeFromType(scene::ESNT_ANY, nodes);
    core::array<scene::ISceneNode *> nodes;
    scene_Msnsger->getSceneNodesFromType(scene::ESNT_ANY, nodes); // Find all 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:
            // Because the selector won't animate with the mesh,
            // and is only being used for camera collision, we'll just use an approximate
            // bounding box instead of ((scene::IAnimatedMeshSceneNode*)node)->getMesh(0)
            // 因為選擇器不會與網格動畫,
            // 和僅用于相機碰撞,我們隻使用一個近似
            // 邊界框代替((場景::IAnimatedMeshSceneNode *)節點)- > getMesh(0)
            selector = scene_Msnsger->createTriangleSelectorFromBoundingBox(node);
            break;
        case scene::ESNT_MESH:
        case scene::ESNT_SPHERE:
            selector = scene_Msnsger->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(),node);
            break;
        case scene::ESNT_TERRAIN:
            selector = scene_Msnsger->createTerrainTriangleSelector((scene::ITerrainSceneNode*)node);
            break;
        case scene::ESNT_OCTREE:
            selector = scene_Msnsger->createOctreeTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(),node);
            break;
        default:
            break;
        }
        if(selector)
        {
            meta->addTriangleSelector(selector);
            selector->drop();
        }
    }
    /*
        Now that the mesh scene nodes have had triangle selectors created and added
        to the meta selector, create a collision response animator from that meta selector.
    */
    /*
        現在有三角形網格場景節點選擇器建立和添加  元選擇器,建立一個元的碰撞響應動畫選擇器。
    */
    scene::ISceneNodeAnimator* anim = scene_Msnsger->createCollisionResponseAnimator(
                meta,m_Camera,core::vector3df(5,5,5),core::vector3df(0,0,0));
    meta->drop();
    m_Camera->addAnimator(anim);
    anim->drop();
    m_Camera->setPosition(core::vector3df(0.f,20.f,0.f));
 
    scene::ISceneNode*cube = scene_Msnsger->getSceneNodeFromType(scene::ESNT_CUBE);
    if(cube)
    {
        m_Camera->setTarget(cube->getAbsolutePosition());
    }
    m_Device->getCursorControl()->setVisible(false);
    connect(this,SIGNAL(sigUpdateIrrlicht(irr::IrrlichtDevice*)),
            this,SLOT(slotUpdateIrrlicht(irr::IrrlichtDevice*)));
    startTimer(0);
}      

保證明時重新整理界面部分

void Irr_Device::slotUpdateIrrlicht(IrrlichtDevice *device) { if(device != 0) { if (isVisible() && isEnabled()/*&&device->isWindowActive()*/) { device->getTimer()->tick();//在沒有用IrrlichtDevice::run()的情況下,必須加上這句,否則鍵盤不響應 SColor color (255,100,100,140); device->getVideoDriver()->beginScene(true, true, color); device->getSceneManager()->drawAll(); device->getVideoDriver()->endScene(); } else { device->yield(); } } } void Irr_Device::timerEvent(QTimerEvent *event) { if (m_Device != NULL) { emit sigUpdateIrrlicht(m_Device); } event->accept(); }      

這部分代碼暫時還不是很了解,也歡迎大神指出裡面存在的問題。

軟體運作截圖如圖

Qt 使用irrlicht(鬼火)3D引擎

Demo 連結:

http://download.csdn.net/detail/z609932088/9504584