一、gltf格式說明
1、 asset
asset屬性是每一個gltf資源的必要屬性,也是區分json和gltf的關鍵屬性。
參數:
|
類型 |
描述 |
是否必須 |
copyright |
string |
版權信息 |
No |
generator |
string |
生成該資源的工具 |
No |
version |
string |
當前版本 |
Yes |
minVersion |
string |
最下的目標版本 |
No |
extensions |
object |
屬性拓展 |
No |
extras |
any |
附加信息 |
No |
案例:
2、 scenes
scene是glTF的入口。一個glTF可能包含多個scene,但是大多數情況下,只包含一個。每個scene包含一個nodes數組,形成場景的root節點,nodes數組中可以存在多個node,讓一個場景有多個root,但一般情況下只有一個root node。
參數:
類型 |
描述 |
是否必須 |
|
nodes |
|
節點的下標 |
必須為根節點 |
name |
|
名字 |
No |
extensions |
|
屬性拓展 |
No |
extras |
|
附加信息 |
No |
案例:
3、 Nodes形成場景圖(層次)結構
每個node可以包含一個叫children的數組,所以每個node都是一個具有層級關系的,所有的節點共同構成了場景的層級結構(類似OSG)。
參數:
類型 |
描述 |
是否必須 |
|
camera |
|
攝像機節點,跟着攝像機矩陣。 |
No |
children |
|
子節點列表 |
No |
skin |
|
蒙皮節點 |
No |
matrix |
|
矩陣 |
No, default: |
mesh |
|
物體節點 |
No |
rotation |
|
四元數旋轉 |
No, default: |
scale |
|
縮放比 |
No, default: |
translation |
|
位置信息 |
No, default: |
weights |
|
mesh的權重數組 |
No |
name |
|
名字 |
No |
extensions |
|
屬性拓展 |
No |
extras |
|
附加信息 |
No |
案例:
4、 mesh結構
每個mesh結構代表一個在場景中出現的真實的幾何實例,mesh本身不包含任何屬性,只包含一個mesh.primitive圖元數組對象,作為模型的組成部分。每個圖元包含一個對mesh幾何數據的描述。
圖元中有一個attributes數組,描述了mesh幾何對象的頂點屬性。此處只有Position屬性用來描述頂點位置。通過indices屬性,可以知道該mesh是一個索引幾何。例子中indices為1,表示使用第二個accessor來解析該mesh。
默認情況下,mesh primitive的渲染模式為三角形。但是通過mode屬性,可以指定其他渲染模式。glTF支持的渲染模式有
5、 buffer、bufferview和accessor
這三個屬性提供了mesh圖元的幾何數據信息。
(1) buffers:定義了一個原始的數據塊
1) buffer包含一個uri,通過這個uri,可以指向一個外部的二進制文件(.bin文件),或者也可以在json文件中直接包含二進制數據塊
2) 此外還有要給byteLength屬性,定義了數據的長度
(2) bufferviews:bufferview是buffer的“塊”或“切片”,target可以是一個常量指示數據是用於頂點屬性(34962,表示ARRAY_BUFFER),或者該數據被用於頂點索引(34963,表示ELEMENT_ARRAY_BUFFER)。
(3) accessor通過描述數據類型和布局,來描述bufferview中的數據應如何解讀。一個accessor對應一個bufferview,用來定義bufferview的數據類型、數據格式和布局。
1) bufferview字段描述該訪問器是針對哪個bufferview。
2) bufferoffset屬性,用來表明bufferview的數據從什么地方開始讀取。
3) count屬性,描述數據長度。
4) type屬性,數據類型(標量(SCALLAR)、矢量(VEC3)還是矩陣(MAT4))。
5) componentType描述的是變量類型(如float)。--BYTE = 5120,UNSIGNED_BYTE = 5121,SHORT = 5122,UNSIGNED_SHORT = 5123,UNSIGNED_INT = 5125,FLOAT = 5126
6) min、max,每種類型的屬性數據的最大最小值,在頂點position情況下,min和max屬性定義了幾何對象的包圍盒邊界,這對碰撞檢測和視錐體裁剪非常有用。
6、 materials
name:材質名稱
baseColorFactor:RGBA顏色
7、 texture:
定義了一個sampler對象和一個image對象。sampler對象定義了image對象在3D對象上的張貼方式。
8、 Images:
9、 samplers
二、數據示例:

1 { 2 "asset": { 3 "version": "2.0" 4 }, 5 "scenes": [{ 6 "nodes": [0] 7 } 8 ], 9 "nodes": [{ 10 "children": [1, 2, 3], 11 "name": "rootNode" 12 }, { 13 "name": "M5", 14 "extras": { 15 "elementGuid": "006b92a5-80f6-4bdc-b1de-f09bb713e4c5" 16 }, 17 "mesh": 0 18 }, { 19 "name": "F2-外牆-空心磚-240mm", 20 "extras": { 21 "elementGuid": "00d5d5cb-1968-4d80-ae22-da15c6176eef" 22 }, 23 "mesh": 1 24 } 25 ], 26 "meshes": [{ 27 "primitives": [{ 28 "mode": 4, 29 "indices": 1, 30 "material": 0, 31 "attributes": { 32 "POSITION": 0 33 } 34 } 35 ] 36 }, { 37 "primitives": [{ 38 "mode": 4, 39 "indices": 3, 40 "material": 1, 41 "attributes": { 42 "POSITION": 2 43 } 44 } 45 ] 46 } 47 ], 48 "buffers": [{ 49 "byteLength": 18624, 50 "uri": "\\B91DCCD0-9768-4EF9-BD8C-158BF461A7ED.bin" 51 }, { 52 "byteLength": 3264, 53 "uri": "\\7CCD787D-F469-4515-9016-C7D1AE4CA3D2.bin" 54 } 55 ], 56 "bufferViews": [{ 57 "buffer": 0, 58 "byteLength": 13968, 59 "byteOffset": 0, 60 "target": 34962 61 }, { 62 "buffer": 0, 63 "byteLength": 4656, 64 "byteOffset": 13968, 65 "target": 34963 66 }, { 67 "buffer": 1, 68 "byteLength": 2448, 69 "byteOffset": 0, 70 "target": 34962 71 }, { 72 "buffer": 1, 73 "byteLength": 816, 74 "byteOffset": 2448, 75 "target": 34963 76 } 77 ], 78 "materials": [{ 79 "name": "木材-刨花板", 80 "pbrMetallicRoughness": { 81 "metallicFactor": 0.0, 82 "roughnessFactor": 1.0, 83 "baseColorFactor": [0.85490197, 0.6784314, 0.14509805, 1.0] 84 }, 85 "alphaMode": "BLEND" 86 }, { 87 "name": "米黃色塗料", 88 "pbrMetallicRoughness": { 89 "metallicFactor": 0.0, 90 "roughnessFactor": 1.0, 91 "baseColorFactor": [0.2784314, 0.28627452, 0.2901961, 1.0] 92 }, 93 "alphaMode": "BLEND" 94 } 95 ] 96 }