模型加載庫
現(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é)點、模型節(jié)點都生成一個具有對應(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é)點引用也包含在這個scene對象中
- 場景的根節(jié)點可能也會包含很多子節(jié)點和一個指向保存模型點云數(shù)據(jù)mMeshes[]的索引集合。根節(jié)點上的mMeshes[]里保存了實際了Mesh對象,而每個子節(jié)點上的mMesshes[]都只是指向根節(jié)點中的mMeshes[]的一個引用(譯者注:C/C++稱為指針,Java/C#稱為引用)
- 一個Mesh對象本身包含渲染所需的所有相關(guān)數(shù)據(jù),比如頂點位置、法線向量、紋理坐標(biāo)、面片及物體的材質(zhì)
- 一個Mesh會包含多個面片。一個Face(面片)表示渲染中的一個最基本的形狀單位,即圖元(基本圖元有點、線、三角面片、矩形面片)。一個面片記錄了一個圖元的頂點索引,通過這個索引,可以在mMeshes[]中尋找到對應(yīng)的頂點位置數(shù)據(jù)。頂點數(shù)據(jù)和索引分開存放,可以便于我們使用緩存(VBO、NBO、TBO、IBO)來高速渲染物體。(詳見Hello Triangle)
- 一個Mesh還會包含一個Material(材質(zhì))對象用于指定物體的一些材質(zhì)屬性。如顏色、紋理貼圖(漫反射貼圖、高光貼圖等)
所以我們要做的第一件事,就是加載一個模型文件為scene對象,然后獲取每個節(jié)點對應(yīng)的Mesh對象(我們需要遞歸搜索每個節(jié)點的子節(jié)點來獲取所有的節(jié)點),并處理每個Mesh對象對應(yīng)的頂點數(shù)據(jù)、索引以及它的材質(zhì)屬性。最終我們得到一個只包含我們需要的數(shù)據(jù)的Mesh集合。
Mac 系統(tǒng)導(dǎo)入Assume
官方方式 : 通過Assimp的下載頁面下載最新的版本, 然后通過CMake的方式來生成.
Mac方式
通過 brew install assimp 命令行的方式直接安裝在/usr/local/Cellar目錄下.現(xiàn)在安裝的最新版本是5.0.1
跟加載glfw庫一樣, 在Header Search Paths添加path和dylib
正常能加載頭文件就沒問題了
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
如果有遇到 library not found for -lminizip
github參考:https://github.com/assimp/assimp/issues/2553
brew install minizip
網(wǎng)格(Mesh)
用建模工具構(gòu)建物體時,美工通常不會直接使用單個形狀來構(gòu)建一個完整的模型。一般來說,一個模型會由幾個子模型/形狀組合拼接而成。而模型中的那些子模型/形狀就是我們所說的一個網(wǎng)格。例如一個人形模型,美工通常會把頭、四肢、衣服、武器這些組件都分別構(gòu)建出來,然后在把所有的組件拼合在一起,形成最終的完整模型。一個網(wǎng)格(包含頂點、索引和材質(zhì)屬性)是我們在OpenGL中繪制物體的最小單位。一個模型通常有多個網(wǎng)格組成。



