1. 程式人生 > >Ogre程式載入mesh檔案原理

Ogre程式載入mesh檔案原理

createEntity() (建立實體) 在當前場景中建立一個實體例項並返回它的物件指標,作為 SceneManager 類的一個成員函式,它有兩個過載:

Entity * Ogre::SceneManager::createEntity (

const String & entityName, // 實體名稱(同一場景中不能有相同的實體名稱)

PrefabType ptype // 預製型別(不需要讀取模型,直接在程式中建立簡單幾何體,

// 目前只有平面 PT_PLANE 一種預製型別)

) [virtual]

Entity * Ogre::SceneManager::createEntity (

const String & entityName, // 實體名稱(同一場景中不能有相同的實體名稱)

const String & meshName // 模型名稱(需要從硬碟上讀取的模型的檔名)

) [virtual]

這裡用的是第二個過載,也就是從硬碟上讀取模型,模型檔名 “ogrehead.mesh” ,這個檔案在 OGRE\Samples\Media\models 目錄下。檢視一下這個目錄,裡面有一些 .mesh 檔案,還有一些 .skeleton 檔案 。

  • .mesh 檔案包含了靜態模型和材質的資訊,.skeleton 檔案對應一個同名的 .mesh 檔案,儲存這個模型的骨骼和動畫資訊(如果有)。使用 createEntity() 方法,不管是不是帶骨骼帶動畫的 *.mesh ,都一樣讀取,但是要想播放模型的動畫,還需要做一些別的工作,如果現在你直接讀取 ninja.mesh 這個帶骨骼動畫的模型,它不會動。

到了這裡,還有一個問題,就是 OGRE 是怎麼找到的這個 .mesh 檔案?它怎麼知道這個 .mesh 檔案是放在 OGRE\Samples\Media\models 目錄下的?還有我們在示例中看到的模型是帶紋理貼圖的,那麼紋理貼圖都在哪裡呢? OGRE 又是怎麼找到這個模型需要的紋理貼圖的呢?

在 E:\Desktop\Learning\OGRE\Samples\Common\bin 目錄、還有這個目錄的 Debug 和 Release 兩個子目錄下,存在著一系列的 *.cfg 檔案,它們都是些配置檔案, OGRE 程式在開啟以後,第一件事情就是檢查並讀取這些配置檔案,從中瞭解一些關鍵資訊。其中的 resources.cfg 就是用來指定所有的遊戲資源所在的目錄路徑, OGRE 要讀取一些資源,就會從這些路徑中搜索。

resources.cfg 檔案的內容:

FileSystem=../../../Media

FileSystem=../../../Media/fonts // 字型

FileSystem=../../../Media/materials/programs // 材質程式 (CG、HLSH、GLSL 等)

FileSystem=../../../Media/materials/scripts // 材質定義指令碼

FileSystem=../../../Media/materials/textures // 紋理貼圖

FileSystem=../../../Media/models // 模型

FileSystem=../../../Media/overlays // 蓋層(介面)定義指令碼

FileSystem=../../../Media/particle // 粒子定義指令碼

Zip=../../../Media/packs/cubemap.zip

Zip=../../../Media/packs/cubemapsJS.zip

Zip=../../../Media/packs/dragon.zip

Zip=../../../Media/packs/fresneldemo.zip

Zip=../../../Media/packs/OgreCore.zip

Zip=../../../Media/packs/ogretestmap.zip

Zip=../../../Media/packs/skybox.zip

你可能會留意到每一條語句前面有 FileSystem 和 Zip 的區別,檢視一下 OGRE\Samples\Media\packs 裡面的那些 *.zip 檔案,用 WinRAR 把它們開啟來看,比方說開啟 dragon.zip ,可以看到裡面有這樣幾個檔案:

dragon.mesh body.jpg head4.jpg legs.jpg

一個模型,帶三張貼圖,就是這麼簡單。 這個意味著,OGRE 在搜尋所需資源的時候,不但能搜尋系統目錄 (FileSystem) ,還能在壓縮檔案 (Zip) 中搜索。

最後是模型的紋理貼圖,這個在 .mesh 檔案自身中定義,我們在使用 3dsmax 、 Maya 等輸出 .mesh 模型的同時,紋理貼圖的相對路徑也會被同時包含輸出。

// 建立模型實體 Entity* entObject = mSceneMgr->createEntity(“object”, “ogrehead.mesh”);

現在你可以試著讓它讀取不同的模型,就把這個示例當作一個模型瀏覽器來用吧 ,幾個 *.zip 檔案裡的資源也試試,比方說,讀取 “dragon.mesh” 。