NDK OpenGL ES 3.0 开发(二十):3D 模型
該原創文章首發于微信公眾號:字節流動
OpenGLES 3D 模型
OpenGLES 3D 模型本質上是由一系列三角形在 3D 空間(OpenGL 坐標系)中構建而成,另外還包含了用于描述三角形表面的紋理、光照、材質等信息。
構建一些規則的 3D 物體,如立方體、球體、椎體等,我們自己可以手動輕易實現,但是在實際開發中往往會用到復雜的 3D 物體,如人體、汽車等,這就需要設計師和專業的建模工具軟件(像 3DS Max、Maya )來生成。
利用 3D 建模軟件,設計師可以構建一些復雜的形狀,并將貼圖應用到形狀上去,不需要去關注圖像技術細節。最后在導出模型文件時,建模工具會自己生成所有的頂點坐標、頂點法線和紋理坐標。
常用的模型文件格式有 .obj、.max、.fbx .3ds 等,其中 .obj 是 Wavefront 科技開發的一種幾何體圖形文件格式,包含每個頂點的位置、紋理坐標、法線,以及組成面(多邊形)的頂點列表等數據,應用較為廣泛。
OBJ 文件的結構
本文主要介紹 obj 3D 模型文件及其附屬文件 mtl ,下面是 obj 模型文件的數據結構(為了方便展示部分數據被略過)。
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2019 guruware # File Created: 25.01.2019 02:22:51mtllib earth.mtlv -4.4189 340.8998 -4.2436 v -4.4189 339.2582 -37.6576 v -7.6941 339.2582 -37.4967 v -10.9377 339.2582 -37.0156 v -14.1185 339.2582 -36.2188 v -17.2059 339.2582 -35.1141 ... # 1986 verticesvn -0.0000 1.0000 0.0000 vn 0.0000 0.9950 -0.0995 vn -0.0098 0.9950 -0.0991 vn -0.0194 0.9950 -0.0976 vn -0.0289 0.9950 -0.0952 vn -0.0381 0.9950 -0.0920 vn -0.0469 0.9950 -0.0878 ... # 1986 vertex normalsvt 0.0000 1.0000 0.0000 vt 0.0000 0.9688 0.0000 vt 0.0156 0.9688 0.0000 vt 0.0156 1.0000 0.0000 vt 0.0313 0.9688 0.0000 vt 0.0313 1.0000 0.0000 ... # 2143 texture coordsusemtl 01___Default s 1 f 1/1/1 2/2/2 3/3/3 f 1/4/1 3/3/3 4/5/4 f 1/6/1 4/5/4 5/7/5 f 1/8/1 5/7/5 6/9/6 f 1/10/1 6/9/6 7/11/7 ...OBJ 文件數據結構的簡單說明:
mtl 文件的結構:
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2019 guruware # File Created: 25.01.2019 02:22:51newmtl 01___DefaultNs 10.0000Ni 1.5000d 1.0000Tr 0.0000Tf 1.0000 1.0000 1.0000 illum 2Ka 0.0000 0.0000 0.0000Kd 0.0000 0.0000 0.0000Ks 0.0000 0.0000 0.0000Ke 0.0000 0.0000 0.0000map_Ka 4096_earth.jpgmap_Kd 4096_earth.jpgmap_Ke 4096_night_lights.jpgmap_bump 4096_bump.jpgbump 4096_bump.jpgnewmtl 02___DefaultNs 10.0000Ni 1.5000d 1.0000Tr 0.0000Tf 1.0000 1.0000 1.0000 illum 2Ka 0.5882 0.5882 0.5882Kd 0.5882 0.5882 0.5882Ks 0.0000 0.0000 0.0000Ke 0.0000 0.0000 0.0000map_Ka 4096_clouds.jpgmap_Kd 4096_clouds.jpgmap_d 4096_clouds.jpgmtl 文件結構說明:
模型加載庫 Assimp
Assimp 全稱為 Open Asset Import Library,可以支持幾十種不同格式的模型文件的解析(同樣也可以導出部分模型格式),Assimp 本身是 C++ 庫,可以跨平臺使用。
Assimp 可以將幾十種模型文件都轉換為一個統一的數據結構,所有無論我們導入何種格式的模型文件,都可以用同一個方式去訪問我們需要的模型數據。
當導入一個模型文件時,Assimp 將加載該模型文件所包含的所有模型和場景數據到一個 scene 對象,為這個模型文件中的所有場景節點、模型節點都生成一個具有對應關系的數據結構,如下圖所示:
一個模型往往是由很多小模型組成,這些小模型在 Assimp 中稱之為 Mesh ,Mesh 進行獨立渲染,Mesh 對象本身包含渲染所需的所有相關數據,比如頂點位置、法向量、紋理坐標以及物體的材質。
編譯模型加載庫 Assimp
Assimp 源代碼地址:https://github.com/assimp/assimp
環境準備:
Windows 7 Android Studio 版本> 2.3.0 (帶有 NDK 和 CMake) Python 3.5D:/AndroidSDK/Sdk/ndk-bundle/build/tools/make_standalone_toolchain.py 需要換成你本地的 Android SDK 中的工具鏈構建腳本。
雙擊腳本,執行完成后,會在當前目錄下(BuildAssimp 文件夾中)生成一個新的文件夾 android-toolchain-24-llvm-arm ,它是我們用于編譯 32 位的 assimp 庫用到的工具鏈。
這里需要配置你的 Android SDK 和 NDK path 。
雙擊腳本,執行完成后,會在 BuildAssimp 文件夾下生成一個新的文件夾 android-toolchain-24-llvm-arm ,編譯通過后會在 android-toolchain-24-llvm-arm/code/ 下生成 32 位的 assimp.so 文件。
下一節中將會使用 assimp.so 去加載 obj 模型文件,然后利用 OpenGL ES 渲染模型。
聯系與交流
總結
以上是生活随笔為你收集整理的NDK OpenGL ES 3.0 开发(二十):3D 模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 向程序发送命令时出现错误 解决办法
- 下一篇: 【uniapp】小程序中输入银行卡号每四