3D 模型準備與優化
本文將詳細講解如何準備符合 EasyAR 要求的 3D 模型,涵蓋格式規範、工具推薦及常見問題排查,幫助開發者從源頭提升跟蹤成功率。
模型格式與規範
EasyAR 3D 物體跟蹤僅支持 Wavefront OBJ 格式。使用時需遵循以下要求和規範。
模型文件結構
一個完整的 3D 模型必須包含以下文件:
- .obj文件:幾何模型數據(包含頂點、面、UV 座標等)。
- .mtl文件:材質定義(顏色、紋理貼圖路徑)。
- 紋理貼圖:至少一張 JPEG 或 PNG 格式的圖片(建議分辨率512×512至2048×2048)。
文件要求
- 所有文件必須放在同一文件夾內,且使用相對路徑引用(如
texture.jpg),禁止絕對路徑(如C:\Models\texture.jpg)。 - 文件名以及文件內部的路徑禁止包含空格,建議使用英文或數字。
- 文件編碼格式必須爲 UTF-8(避免亂碼導致加載失敗)。
OBJ(.obj)文件最低要求
- 必須包含
vertex
幾何頂點,用 \((x, y, z [, w])\) 座標表示。\(w\) 爲可選項,默認爲1.0。頂點的色彩參數不是必須的,如果提供了色彩參數系統並不會加載。 - 必須包含
texture coordinates
紋理座標,用 \((u, v [,w])\) 座標表示,\(w\) 爲可選項,默認爲0。通常情況下,\(u\) 和 \(v\) 的取值應該是在0至1之間。對於小於0或者大於1的情形,系統默認會以REPEAT模式進行處理,即座標的整數部分被忽略,然後構建一個無限複製的模式(與OpenGL中的GL_REPEAT處理方式相同)。 - 必須包含
face
面元素,應當至少包含頂點的索引,以及頂點的紋理座標的索引。超過3個頂點的多邊形(如四邊形)面片結構同樣支持。 - 必須包含
mtllib
材質文件的引用,要求至少指定一個外部 MTL 材質文件,文件路徑必須是相對路徑,不能是絕對路徑。 - 必須包含
usemtl
模型元素所引用的材質需指定材質名字,這個材質名字應當與外部 MTL 材質文件中定義的材質名字保持一致。
MTL(.mtl)文件最低要求
- 一個 MTL 文件中應當定義至少一個材質。
- 紋理貼圖是必須的。
通常情況下,只需要指定環境光或者漫反射的紋理貼圖(map_Ka、map_Kd);
紋理貼圖的路徑必須是相對路徑,不能是絕對路徑; - 紋理貼圖的其他可選參數不是必須的,如果提供了系統並不會採用。
模型準備
您可以通過多種方式來準備符合規範的 OBJ 格式模型文件。
從已有模型中導出
使用 Autodesk Maya / 3ds Max 等專業工具,導入現有 FBX 或其他格式的模型,導出時選擇 “OBJ Export”,並確保 “Materials” 和 “UVs” 選項啓用。創建全新的模型
使用 Autodesk Maya / 3ds Max 等建模工具創建/繪製 3D 模型並輸出爲 OBJ 格式。掃描真實物體並進行 3D 重建
使用 Autodesk ReCap、Bentley ContextCapture 等三維掃描建模軟件,或者激光掃描儀對真實物體進行 3D 重建,並將重建結果導出爲 OBJ 格式。
重要事項
模型貼圖必須準確還原真實物體的視覺特徵,否則識別與跟蹤功能將無法正常工作。
模型最佳實踐
以下列出一些常見的在準備模型時會遇到的問題和例子,供您快速參考以便檢查。
確保豐富的紋理細節
模型的貼圖應當具有豐富的紋理細節。
參考圖左:可以被 EasyAR 檢測和跟蹤。參考圖右: 無法檢測和跟蹤,紋理太少。
模型的形狀
模型支持不同的形狀,但主體結構是凸的。
這兩個物體都可以被 EasyAR 檢測和跟蹤。
檢查文件內引用路徑
模型文件內引用的路徑必須是相對路徑,不能是絕對路徑。
右側的模型無法被加載,因爲 EasyAR 找不到使用了絕對路徑的文件。
模型文件內引用的路徑不能有空格或特殊字符。
右側的模型無法被加載,因爲引用的路徑中包含了空格。
檢查文件的編碼格式
模型文件應該使用 UTF-8 編碼格式。
右側的模型無法被加載,因爲其文件編碼的問題導致讀取時解碼錯誤。
檢查模型法向
模型面片的法向量的正向應遵循右手準則。
第二個立方體中陰影部分的面片的法向量是負值取向。這種面片在 EasyAR 中會當成不可見面處理。如果從模型內部看出去,會顯示成第三個立方體的樣子。
模型應當避免一切法向量負值取向的面片。模型面片數量
模型面片的數量在保證物體幾何形狀的前提下應儘可能少,通常不應超過 100,000 個三角面片。過多的面片數量會導致:- 模型加載時間過長,影響應用在啓動的用戶體驗
- 面片紋理投影的計算量增加,影響應用在跟蹤時的幀率
3D 模型的質量直接決定跟蹤成功率。開發者需嚴格遵循格式規範,重點優化紋理細節,並確保文件格式無誤。