OpenGL遊戲引擎開發[5]-自己動手寫STL模型加載器

前面我們繪製的物體要麼是手動設置的頂點(比如簡單的三角形),要麼是程序生成的頂點(比如繪製的地球)。還有一種就是加載3D建模軟件建好的3D模型。常見的3D模型格式有很多:.OBJ, .STL, .PLY, .fbx, .x 等等。當然加載這些3D模型有成熟的第三方庫,如Assimp,我們自己手動寫代碼解析這些模型的格式是爲了熟悉模型加載的流程,爲了以後在使用第三方庫的時出錯了,或者加載的模型和預期的結果不同時,方便排錯。

本節我們來介紹如何加載STL格式的3D模型。這種格式很簡單,只包含頂點數據位置數據以及三角面片的法線數據,其他的數據格式還可能包括:紋理座標數據,紋理貼圖數據,甚至是動畫數據,這需要在解析的時候建立相應的數據結構來存儲這些數據,特別是動畫數據,往往和你的引擎動畫機制相關,你需要將模型文件中的動畫數據加載爲你引擎能夠工作的數據結構,否則你讀出來動畫數據,你也使用不了。

原先我是打算加載OBJ模型的,因爲OBJ文件中包含物體的頂點,法線,還有紋理數據。但是應一位小夥伴的請求,這節先加載個STL文件吧。

STL文件格式

STL (STereoLithography, 立體光刻)是由3D Systems軟件公司創立、原本用於立體光刻計算機輔助設計軟件的文件格式。

STL文件僅描述三維物體的表面幾何形狀,沒有顏色、材質貼圖或其它常見三維模型的屬性。

STL文件兩種格式,ASCII STL和Binary STL。說白了,就是一個是文本數據,一個是二進制數據。

STL的ASCII格式

ASCII STL,每一個facet由7行數據組成,outer loop後面三個頂點的順序沿法線矢量逆時針排序,格式如下:

solid name // 文件名及文件路徑

facet normal ni nj nk          // 三角形法向量的三個分量
    outer loop
        vertex v1x v1y v1z     // 第一個頂點座標
        vertex v2x v2y v2z     // 第二個頂點座標
        vertex v3x v3y v3z     // 第三個頂點座標
    endloop
endfacet                       // 完成一個三角形的定義

endsolid name                  // 整個文件結束

STL的二進制格式

Binary STL,起始有80個字節文件頭用於存儲文件名,緊接4個字節表示三角形數量,而每個三角面片佔用固定的50個字節,3個4字節浮點數(法線矢量),3個4字節浮點數(第一個頂點座標),3個4字節浮點數(第二個頂點座標),3個4字節浮點數(第三個頂點座標),接着2個字節描述三角形基本屬性,那麼一個完整的二進制STL文件的字節大小就是三角形面數乘50再加上84字節,格式如下:

UINT8[80] – Header             // 文件頭
UINT32 – Number of triangles   // 三角形數量

foreach triangle
REAL32[3] – Normal vector      // 法線矢量
REAL32[3] – Vertex 1           // 第一個頂點座標
REAL32[3] – Vertex 2           // 第二個頂點座標
REAL32[3] – Vertex 3           // 第三個頂點座標
UINT16 – Attribute byte count  // 文件屬性
end

加載STL二進制文件

說實話C++讀取文件文件太費勁了,用C#就方便多了。我們這裏讀一下二進制文件吧,按照文件字節讀取就行。讀文本文件就作爲課後作業吧,照葫蘆畫瓢的事。其實就是因爲太麻煩了。

因爲我們的引擎還沒有添加光照,所以只顯示了線框模型和純色模型,看起來並沒有立體感。

ok。本節結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章