亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

irrlicht引擎源碼剖析1 - 引擎概覽

系統(tǒng) 1573 0

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引擎打一個基礎。

irrlicht引擎源碼剖析1 - 引擎概覽


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩免费播放一区二区 | 国产成人性毛片aaww | 在线观看日本免费视频大片一区 | 97久久久久国产精品嫩草影院 | 久热国产在线视频 | 久久最稳定资源站在线 | 日韩在线欧美 | 国产成人黄色在线观看 | 亚洲欧美日韩中文在线 | 欧美一区2区三区3区公司 | 国产精品久久永久免费 | 欧美久久超级碰碰碰二区三区 | 久久99热这里只有精品7 | 久99频这里只精品23热 视频 | 精品国产呦系列在线看 | 免费一级毛片不卡在线播放 | 亚洲天天做夜夜做天天欢人人 | 黄色片网站观看 | 九草在线免费观看 | 日日夜夜摸 | 国产精品伊人 | 偷偷操网站 | 欧美三级午夜理伦三级小说 | 亚洲精品午夜久久久伊人 | 久草网视频在线观看 | 天天干天天干 | 福利视频精品 | 欧美13一14周岁a在线播放 | 国产色| 欧美线人一区二区三区 | 国产精品久久久久三级 | 精品免费国产一区二区三区 | 2021最新国产成人精品免费 | 亚洲专区欧美专区 | 亚洲激情一区 | 亚洲视频一 | 免费看人做人爱视频拍拍拍 | 97午夜视频 | 久久综合中文字幕 | 波多野结中文字幕在线69视频 | 亚欧在线视频 |