irrlicht是跨平臺,支持多種圖形庫的開源3d引擎。irrlicht的設計很好的體現(xiàn)了接口和實現(xiàn)分離的原則,整個框架設計精巧清晰,是學習3d引擎設計的不錯的教材。
先看下名字空間的劃分,可以看到irr具有非常清晰的結構:
irr | Everything in the Irrlicht Engine can be found in this namespace |
irr::core | In this namespace can be found basic classes like vectors, planes, arrays, lists and so on |
irr::gui | The gui namespace contains useful classes for easy creation of a graphical user interface |
irr::io |
|
irr::scene |
|
irr::scene::quake3 |
|
irr::video | The video namespace contains classes for accessing the video driver. All 2d and 3d rendering is done here |
irr空間中提供了引擎的一些底層構架的支持,如事件處理系統(tǒng),操作系統(tǒng)抽象,引用計數(shù),設備抽象等。
irr::core空間中提供了基礎的數(shù)學和數(shù)據(jù)結構構件,如向量,矩陣,四元數(shù),列表,數(shù)組,紅黑樹等。
irr::io空間提供了io操作的構件并提供對象屬性序列化和xml支持。
irr::video空間包含了3d圖形功能接口和構件。如對圖形驅動,材質渲染的抽象。
irr::scene空間包含了基于scene graph的3d引擎渲染和管理,并提供了camera,骨骼動畫,粒子系統(tǒng)等的豐富支持。
irr::gui空間包含了irrlicht的GUI模塊,同樣也是基于接口的設計。
我 想重點剖析的是irr::video和irr::scene,這是3d引擎的核心部分,目的是分析irrlicht是如何將不同的圖形API進行抽象的, 以及如何使用scene graph-material體系進行引擎的運轉,并將各種3d技術融入到這個體系中的。另外irr如何做到跨平臺支持的也會進行剖析。
作為引擎的概覽,首先看下文檔中的short example:
IrrlichtDevice *device =
createDevice
(
video::EDT_DIRECT3D8
, core::dimension2d(640,480)); video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* scenemgr = device->getSceneManager();
這三句代碼顯示了irrlicht最基本的三個對象-設備,圖形驅動和場景管理器。簡單看來,通過全局函數(shù)createDevice根據(jù)指定的驅動類型創(chuàng)建一個設備,之后可通過設備對象得到驅動對象以及場景管理器對象。
device->setWindowCaption(L
"Hello World!"
);
設備對象具有一些設備相關的能力,比如這兒可以設置窗口標題。
// load and show quake2 .md2 model
scene::ISceneNode* node=scenemgr->addAnimatedMeshSceneNode(scenemgr->getMesh(
"quake2model.md2"
));
// if everything worked, add a texture and disable lighting
if
(node)
{
node->setMaterialTexture(0, driver->getTexture(
"texture.bmp"
));
node->setMaterialFlag(
video::EMF_LIGHTING
,
false
);
}
// add a first person shooter style user controlled camera
scenemgr->addCameraSceneNodeFPS();
這幾行代碼顯示了scene graph體系,ISceneNode是irrlicht場景中基礎組成部分節(jié)點的抽象,這兒添加了一個動畫mesh節(jié)點,和一個camera節(jié)點。節(jié)點 具有材質屬性(當然camera并不需要材質,但是ISceneNode作為一個抽象要盡量兼顧各種節(jié)點,為了讓接口的層次簡單些,這樣做也是一個實用的 方法)
// draw everything
while
(device->run() && driver)
{
driver->beginScene(
true
,
true
, video::SColor(255,0,0,255));
scenemgr->drawAll();
driver->endScene();
}
這幾行是引擎運轉的過程,首先引擎運轉的條件是設備仍然在運轉:device->run(),可通過closeDevice關閉設備。 scenemgr->drawAll()執(zhí)行了所有節(jié)點的渲染,節(jié)點的渲染不僅僅是draw,節(jié)點的transform計算,動畫計算(包括骨骼動 畫),camera這種特殊節(jié)點的操作(特殊的節(jié)點還有光源等),都包含在渲染的范疇中,在drawAll中統(tǒng)一調(diào)用,各種節(jié)點實現(xiàn)各自的渲染,最終由 scenemgr統(tǒng)一管理(如排序)繪制,這正是基于scene graph架構的引擎的特點之一。
device->drop();
這一句體現(xiàn)了irrlicht的引用計數(shù)機制,通過grab,drop管理對象引用次數(shù)。這兒如果一切正常應該是引用drop為0,device銷毀自己,退出程序。
從 這個很短的例子可以看到irrlicht的基本構件和運行過程。irrlicht提供了scene的管理機制,并提供了大量預定義好的scene nodes,實現(xiàn)了很多的功能,這樣你就可以很方便的使用引擎。并且這種機制的好處是,節(jié)點可以不斷的擴展,并可以在以后的項目中復用。
當然,irrlicht引擎不是完美的,我準備在這個源碼剖析的系列的最后,分析一下irrlicht的一些具體問題和不足,當然作為一個開源引擎,irrlicht已經(jīng)非常好了,我的主要目的正是通過分析學習irrlicht給自己設計3d引擎打一個基礎。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
