1,
Assimp可以導入幾十種不同格式的模型文件(同樣也可以導出部分模型格式)。只要Assimp加載完了模型文件,我們就可以從Assimp上獲取所有我們需要的模型數據。Assimp把不同的模型文件都轉換為一個統一的數據結構,所有無論我們導入何種格式的模型文,件,都可以用同一個方式去訪問我們需要的模型數據。
2,
當導入一個模型文件時,即Assimp加載一整個包含所有模型和場景數據的模型文件到一個scene對象時,Assimp會為這個模型文件中的所有場景節點、模型節點都生成一個具有對應關系的數據結構,且將這些場景中的各種元素與模型數據對應起來。下圖展示了一個簡化,,的Assimp生成的模型文件數據結構:
- 所有的模型、場景數據都包含在Scene對象中,如所有的材質和Mesh。同樣,場景的根節點引用也包含在這個scene對象中。
- 場景的根節點(Root node)可能也會包含很多子節點和一個指向保存模型點雲數據mMeshes[]的索引集合。根節點上的mMeshes[]里保存了實際了Mesh對象,而每個子節點上的mMesshes[]都只是指向根節點中的mMeshes[]的一個引用(譯者注:C/C++稱為指針,Java/C#稱為引用)。
- 一個Mesh對象本身包含渲染所需的所有相關數據,比如頂點位置、法線向量、紋理坐標、面片及物體的材質。
- 一個Mesh會包含多個面片。一個Face(面片)表示渲染中的一個最基本的形狀單位,即圖元(基本圖元有點、線、三角面片、矩形面片)。一個面片記錄了一個圖元的頂點索引,通過這個索引,可以在mMeshes[]中尋找到對應的頂點位置數據。頂點數據和索引分開存放,可以便於我們使用緩存(VBO、NBO、TBO、IBO)來高速渲染物體。
- 一個Mesh還會包含一個Material(材質)對象用於指定物體的一些材質屬性。如顏色、紋理貼圖(漫反射貼圖、高光貼圖等)。
所以我們要做的第一件事,就是加載一個模型文件為Scene對象,然后獲取每個節點對應的Mesh對象(我們需要遞歸搜索每個節點的子節點來獲取所有的節點),並處理每個Mesh對象對應的頂點數據、索引以及它的材質屬性。最終我們得到一個只包含我們需要的數據的Mesh集合。
3,
Assimp使用一個aiScene對象來表示加載的mesh(網格結構),aiScene對象中包含了mesh,且這個mesh部分封裝了模型。
aiScene對象中至少包含一個mesh,而復雜的模型就可能包含多個mesh。
std::vector<MeshEntry> m_Entries;