加載模型-01.Assimp開源模型導(dǎo)入庫

我們無法像定義容器盒一樣手動地去指定房子吁断、貨車或人形角色這些復(fù)雜模型的頂點(diǎn)炮障、法線和紋理坐標(biāo)椿每。我們需要做的也是應(yīng)該要做的伊者,是把這些模型導(dǎo)入到應(yīng)用程序中,而設(shè)計制作這些3D模型的工作應(yīng)該交給像Blender间护、3DS Max或者Maya這樣的工具軟件亦渗。

那些3D建模工具,可以讓美工們構(gòu)建一些復(fù)雜的形狀汁尺,并將貼圖應(yīng)用到形狀上去法精,即紋理映射。然后痴突,在導(dǎo)出模型文件時搂蜓,建模工具會自己生成所有的頂點(diǎn)坐標(biāo)、頂點(diǎn)法線和紋理坐標(biāo)辽装。這樣帮碰,美工們可以不用了解大量的圖像技術(shù)細(xì)節(jié),就能有大量的工具集去隨心地構(gòu)建高品質(zhì)的模型拾积。所有的技術(shù)細(xì)節(jié)內(nèi)容都隱藏在里導(dǎo)出的模型文件里殉挽。而我們丰涉,這些圖形開發(fā)者,就必須得去關(guān)注這些技術(shù)細(xì)節(jié)了斯碌。

因此一死,我們的工作就是去解析這些導(dǎo)出的模型文件,并將其中的模型數(shù)據(jù)存儲為OpenGL能夠使用的數(shù)據(jù)傻唾。

一個常見的問題是投慈,導(dǎo)出的模型文件通常有幾十種格式,不同的工具會根據(jù)不同的文件協(xié)議把模型數(shù)據(jù)導(dǎo)出到不同格式的模型文件中冠骄。有的模型文件格式只包含模型的靜態(tài)形狀數(shù)據(jù)和顏色伪煤、漫反射貼圖、高光貼圖這些基本的材質(zhì)信息猴抹,比如Wavefront的.obj文件带族。而有的模型文件則采用XML來記錄數(shù)據(jù)锁荔,且包含了豐富的模型蟀给、光照、各種材質(zhì)阳堕、動畫跋理、攝像機(jī)信息和完整的場景信息等,比如Collada文件格式恬总。Wavefront的obj格式是為了考慮到通用性而設(shè)計的一種便于解析的模型格式前普。建議去Wavefront的Wiki上看看obj文件格式是如何封裝的。這會給你形成一個對模型文件格式的一個基本概念和印象壹堰。

模型加載庫

現(xiàn)在市面上有一個很流行的模型加載庫拭卿,叫做Assimp,全稱為Open Asset Import Library贱纠。Assimp可以導(dǎo)入幾十種不同格式的模型文件(同樣也可以導(dǎo)出部分模型格式)峻厚。只要Assimp加載完了模型文件,我們就可以從Assimp上獲取所有我們需要的模型數(shù)據(jù)谆焊。Assimp把不同的模型文件都轉(zhuǎn)換為一個統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)惠桃,所有無論我們導(dǎo)入何種格式的模型文件,都可以用同一個方式去訪問我們需要的模型數(shù)據(jù)辖试。

當(dāng)導(dǎo)入一個模型文件時辜王,即Assimp加載一整個包含所有模型和場景數(shù)據(jù)的模型文件到一個scene對象時,Assimp會為這個模型文件中的所有場景節(jié)點(diǎn)罐孝、模型節(jié)點(diǎn)都生成一個具有對應(yīng)關(guān)系的數(shù)據(jù)結(jié)構(gòu)呐馆,且將這些場景中的各種元素與模型數(shù)據(jù)對應(yīng)起來。下圖展示了一個簡化的Assimp生成的模型文件數(shù)據(jù)結(jié)構(gòu):

  • 所有的模型莲兢、場景數(shù)據(jù)都包含在Scene對象中汹来,如所有的材質(zhì)和Mesh辫继。同樣,場景的根節(jié)點(diǎn)引用也包含在這個scene對象中俗慈。
  • 場景的根節(jié)點(diǎn)(Root node)可能也會包含很多子節(jié)點(diǎn)和一個指向保存模型點(diǎn)云數(shù)據(jù)mMeshes[]的索引集合姑宽。根節(jié)點(diǎn)上的mMeshes[]里保存了實(shí)際了Mesh對象,而每個子節(jié)點(diǎn)上的mMesshes[]都只是指向根節(jié)點(diǎn)中的mMeshes[]的一個引用(譯者注:C/C++稱為指針闺阱,Java/C#稱為引用)炮车。
  • 一個Mesh對象本身包含渲染所需的所有相關(guān)數(shù)據(jù),比如頂點(diǎn)位置酣溃、法線向量瘦穆、紋理坐標(biāo)、面片及物體的材質(zhì)赊豌。
  • 一個Mesh會包含多個面片扛或。一個Face(面片)表示渲染中的一個最基本的形狀單位,即圖元(基本圖元有點(diǎn)碘饼、線熙兔、三角面片、矩形面片)艾恼。一個面片記錄了一個圖元的頂點(diǎn)索引住涉,通過這個索引,可以在mMeshes[]中尋找到對應(yīng)的頂點(diǎn)位置數(shù)據(jù)钠绍。頂點(diǎn)數(shù)據(jù)和索引分開存放舆声,可以便于我們使用緩存(VBO、NBO柳爽、TBO媳握、IBO)來高速渲染物體。(詳見Hello Triangle)磷脯。
  • 一個Mesh還會包含一個Material(材質(zhì))對象用于指定物體的一些材質(zhì)屬性蛾找。如顏色、紋理貼圖(漫反射貼圖争拐、高光貼圖等)腋粥。

所以我們要做的第一件事,就是加載一個模型文件為Scene對象架曹,然后獲取每個節(jié)點(diǎn)對應(yīng)的Mesh對象(我們需要遞歸搜索每個節(jié)點(diǎn)的子節(jié)點(diǎn)來獲取所有的節(jié)點(diǎn))隘冲,并處理每個Mesh對象對應(yīng)的頂點(diǎn)數(shù)據(jù)、索引以及它的材質(zhì)屬性绑雄。最終我們得到一個只包含我們需要的數(shù)據(jù)的Mesh集合展辞。(在03.模型中體現(xiàn))(The result is then a collection of mesh data that we want to contain in a single Model object.)

Mesh(網(wǎng)格,或被譯為“模型點(diǎn)云”)
用建模工具構(gòu)建物體時,美工通常不會直接使用單個形狀來構(gòu)建一個完整的模型万牺。一般來說罗珍,一個模型會由幾個子模型/形狀組合拼接而成洽腺。而模型中的那些子模型/形狀就是我們所說的一個Mesh。例如一個人形模型覆旱,美工通常會把頭蘸朋、四肢、衣服扣唱、武器這些組件都分別構(gòu)建出來藕坯,然后在把所有的組件拼合在一起,形成最終的完整模型噪沙。一個Mesh(包含頂點(diǎn)炼彪、索引和材質(zhì)屬性)是我們在OpenGL中繪制物體的最小單位。一個模型通常有多個Mesh組成正歼。

下一節(jié)教程中辐马,我們將用上述描述的數(shù)據(jù)結(jié)構(gòu)來創(chuàng)建我們自己的Model類和Mesh類,用于加載和保存那些導(dǎo)入的模型局义。如果我們想要繪制一個模型喜爷,我們不會去渲染整個模型,而是去渲染這個模型所包含的所有獨(dú)立的Mesh旭咽。

在開始導(dǎo)入模型之前贞奋,我們需要先把Assimp包含到我們的工程中。

構(gòu)建Assimp

你可以在Assimp的下載頁面選擇一個想要的版本去下載Assimp庫穷绵。到目前為止,Assimp可用的最新版本是3.1.1特愿。我們建議你自己編譯Assimp庫仲墨,因?yàn)锳ssimp官方的已編譯庫不能很好地覆蓋在所有平臺上運(yùn)行。如果你忘記怎樣使用CMake編譯一個庫揍障,請詳見Creating a window(創(chuàng)建一個窗口)教程目养。

這里我們列出一些編譯Assimp時可能遇到的問題,以便大家參考和排除:

  • CMake在讀取配置列表時毒嫡,報出與DirectX庫丟失相關(guān)的一些錯誤癌蚁。報錯如下:
    Could not locate DirectXCMake Error at cmake-modules/FindPkgMacros.cmake:110 (message):Required library DirectX not found! Install the library (including dev packages) and try again. If the library is already installed, set the missing variables manually in cmake.
    這個問題的解決方案:如果你之前沒有安裝過DirectX SDK,那么請安裝兜畸。下載地址:DirectX SDK
  • 安裝DirectX SDK時努释,可以遇到一個錯誤碼為S1023的錯誤。遇到這個問題咬摇,請在安裝DirectX SDK前伐蒂,先安裝C++ Redistributable package(s)。 問題解釋::已知問題:DirectX SDK (June 2010) 安裝及S1023錯誤
  • 一旦配置完成肛鹏,你就可以生成解決方案文件了逸邦,打開解決方案文件并編譯Assimp庫(編譯為Debug版本還是Release版本恩沛,根據(jù)你的需要和心情來定吧)
  • 使用默認(rèn)配置構(gòu)建的Assimp是一個動態(tài)庫,所以我們需要把編譯出來的assimp.dll文件拷貝到我們自己程序的可執(zhí)行文件的同一目錄里(I:\vs\OpenGL\Debug)
  • 編譯出來的Assimp的LIB文件和DLL文件可以在code/Debug或者code/Release里找到
  • 把編譯好的LIB文件和DLL文件拷貝到工程的相應(yīng)目錄下缕减,并鏈接到你的解決方案中雷客。同時還好記得把Assimp的頭文件也拷貝到工程里去(Assimp的頭文件可以在include目錄里找到)

如果你想要讓Assimp使用多線程支持來提高性能,你可以使用Boost庫來編譯 Assimp桥狡。在Boost安裝頁面佛纫,你能找到關(guān)于Boost的完整安裝介紹。

現(xiàn)在总放,你應(yīng)該已經(jīng)能夠編譯Assimp庫呈宇,并鏈接Assimp到你的工程里去了。下一節(jié)內(nèi)容:導(dǎo)入完美的3D物件局雄!


拓展閱讀:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甥啄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炬搭,更是在濱河造成了極大的恐慌蜈漓,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宫盔,死亡現(xiàn)場離奇詭異融虽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灼芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門有额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彼绷,你說我怎么就攤上這事巍佑。” “怎么了寄悯?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵萤衰,是天一觀的道長。 經(jīng)常有香客問我猜旬,道長脆栋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任洒擦,我火速辦了婚禮椿争,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秘遏。我一直安慰自己丘薛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布邦危。 她就那樣靜靜地躺著洋侨,像睡著了一般舍扰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上希坚,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天边苹,我揣著相機(jī)與錄音,去河邊找鬼裁僧。 笑死个束,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聊疲。 我是一名探鬼主播茬底,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼获洲!你這毒婦竟也來了阱表?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤贡珊,失蹤者是張志新(化名)和其女友劉穎最爬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體门岔,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爱致,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寒随。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠悯。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牢裳,靈堂內(nèi)的尸體忽然破棺而出逢防,到底是詐尸還是另有隱情,我是刑警寧澤蒲讯,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站灰署,受9級特大地震影響判帮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溉箕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一晦墙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肴茄,春花似錦晌畅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棋凳。三九已至,卻和暖如春连躏,著一層夾襖步出監(jiān)牢的瞬間剩岳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工入热, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拍棕,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓勺良,卻偏偏與公主長得像绰播,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尚困,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容