在上一篇中,我們介紹了如何在 Three.js 中加載 .OBJ
模型。如果你沒看過,建議先閱讀一下基礎內容。然而你很快會發現,.OBJ
雖然入門簡單,卻并不是 Web3D 場景中的最佳格式。
.OBJ
是什么?
.OBJ
是最早期的3D交換格式之一,目的是讓各類 3D 編輯器(如 Maya、3ds Max)之間傳輸模型數據:
是文本格式,人可以讀懂,機器也能簡單處理;
文件由
.obj
(幾何數據)和.mtl
(材質)組成;沒有層級結構(Scene Graph),所有對象都變成一個大 Mesh;
不支持動畫、骨骼、燈光等高級功能;
貼圖路徑容易丟失,材質兼容性差;
加載慢、數據體積大,不利于 Web 性能優化。
.glTF
(GL Transmission Format)是 Khronos Group 推出的 3D 圖形傳輸標準,專為 Web 而生:
? 體積小:二進制數據(
.glb
)極度壓縮,適合網絡加載;? 結構清晰:包含場景、層級、材質、貼圖、動畫等;
? 渲染友好:三角面、貼圖、PBR 材質都是 WebGL/Three.js 可直接使用的;
? 加載簡單:沒有額外材質文件,One file,One loader;
? 跨平臺標準:被 Blender、Unity、Unreal、Three.js 等現代工具廣泛支持;
一句話總結:
📦 glTF 是 Web 3D 世界的 JPEG,旨在成為“3D 模型的通用圖像格式”。
.glTF
比.OBJ
強在哪?
特性 .OBJ
.glTF
文件結構 僅包含幾何 + 材質 場景圖 + 動畫 + 燈光 + 材質 + 相機 材質支持 簡單材質,貼圖易丟失 標準 PBR 材質,貼圖內嵌 動畫支持 ? 不支持 ? 支持骨骼/關鍵幀動畫 加載速度 較慢(文本解析) 快(直接傳入 GPU) 文件體積 較大(3~5 倍) 極小,優化傳輸 渲染兼容性 需要手動調整 開箱即用
使用 Three.js 加載 .glTF 示例
一行代碼即可加載完整模型,包括材質、動畫、燈光!
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';const loader = new GLTFLoader(); loader.load('/models/model.glb', (gltf) => {scene.add(gltf.scene); });
總結:什么時候選
.glTF
?如果你面向 Web 顯示 / 動畫 / PBR 材質 / 性能優化,請選擇
.glTF
或.glb
!
.OBJ
仍然適用于快速測試或簡單模型,但在現代 Web3D 項目中,.glTF
幾乎是唯一推薦的格式。
1. 「沒有層級結構(Scene Graph),所有對象都變成一個大 Mesh」是什么意思?
假設你原始模型是一個風扇,它在 Blender 中是這樣的結構
風扇(Fan) ├── 機身(Body) ├── 支架(Stand) └── 葉片(Blade)
每個部分是一個單獨的對象(Object),你可以單獨操作它們,比如給葉片加動畫、旋轉它。
但
.OBJ
格式不支持層級結構它導出后,所有這些部分可能被「扁平化」成一個單一的大模型(一個 Mesh),像這樣:
Fan.obj └── 一個包含全部頂點的網格,沒有結構信息
所以你在加載
.obj
后,想單獨拿到blade
部分旋轉?要么靠child.name.includes('blade')
模糊查找,要么就沒法單獨控制。
.glTF
格式則保留原始的「場景層級結構」?gltf.scene.getObjectByName('blade').rotation.z += 0.01;
「一行代碼即可加載完整模型,包括材質、動畫、燈光!」是真的不用額外加載
.mtl
文件嗎?? 是的,
.glTF/.glb
不需要.mtl
材質文件,材質是內嵌進去的!這點是
.glTF
相比.OBJ
最大的優勢之一。
.OBJ
加載過程:const mtlLoader = new MTLLoader(); mtlLoader.load('model.mtl', (materials) => {const objLoader = new OBJLoader();objLoader.setMaterials(materials);objLoader.load('model.obj', (object) => {scene.add(object);}); });
?
.glTF
加載過程:const loader = new GLTFLoader(); loader.load('model.glb', (gltf) => {scene.add(gltf.scene); });
特性 .OBJ + .MTL
.glTF / .glb
材質 需要額外加載 .mtl
內嵌在模型中 層級結構 無,全部是一個大 Mesh 有,保留父子結構 動畫 ? 不支持 ? 支持骨骼動畫 燈光、相機 ? 不支持 ? 支持 代碼加載方式 至少兩段 Loader 一行搞定 ?