2 glTF的基礎結構
glTF的核心是JSON文件。此文件描述三維場景的全部內容。它包括了 場景(scene)結構本身,該描述由定義場景樹(scene graph)的節點層次(node hierarchy)。場景中出現的三維對象是使用附着到節點的網格(Mesh)定義的。材質定義對象的外觀。動畫描述了隨着時間的推移,三維對象是如何變換的(例如:旋轉,平移),而皮膚定義了基於骨架姿勢的對象幾何體是如何變形的。攝影機描述渲染器的視圖配置。
JSON結構
場景對象存儲在JSON文件的數組中。可以使用數組中相應對象的索引來訪問它們:
"meshes" :
[
{ ... }
{ ... }
...
],
這些索引還用於定義物體(object)之間的關係。上面的示例定義了多個網格,一個節點可以使用網格索引引用其中一個網格,以指示網格應附加到此節點:
"nodes":
[
{ "mesh": 0, ... },
{ "mesh": 5, ... },
...
}
The following image (adapted from the glTF concepts section) gives an overview of the top-level elements of the JSON part of a glTF asset:
下圖(改編自glTF概念部分)概述了glTF文件中JSON部分的 頂層(top-level)元素:
這裏將快速總結這些元素並提供概述,並鏈接到glTF規範的各個部分。以下章節將對這些元素之間的關係進行更詳細的解釋。
scene
(場景 )是存儲在glTF中的場景描述的入口點。它是指定義場景圖(scene graph)的節點(node)。node
(節點),是場景圖層次中的一個節點。它可以包含一個矩陣轉換(例如,旋轉或平移),並且可以引用其他(子)節點。此外,它還可以“附加”上(通過引用節點的網格或攝影機實例),或指描述網格變形的蒙皮(skin)。camera
攝影機定義用於渲染場景的視圖配置。mesh
網格描述出現在場景中的幾何對象。它指用於訪問實際幾何數據的accessor
訪問器對象,以及在渲染物體時定義其外觀的材質。skin
蒙皮定義頂點蒙皮所需的參數,該參數允許基於虛擬角色的姿勢變形網格。這些參數的值是從accessor
訪問器獲取的。animation
動畫描述特定節點的變換(例如旋轉或平移)如何隨時間變化。accessor
訪問器用作任意數據的抽象源。它被網格mesh
、蒙皮skin
和動畫animation
使用,並提供幾何體數據、蒙皮參數和與時間相關的動畫值。它指向bufferView
,它是包含實際原始二進制數據的buffer
一部分。material
材質包含定義物體外觀的參數。它通常指將應用於渲染幾何體的紋理對象。texure
紋理 由採樣器和圖像定義。採樣器sampler
將定義如何將紋理圖像放置在物體上。
引用外部數據
二進制數據,如3D物體的幾何樣貌和紋理,通常不包含在JSON文件中。相反,它們存儲在專用文件中,JSON部分只包含指向這些文件的鏈接。這允許二進制數據以非常緊湊的形式存儲,並且可以通過web高效地傳輸。此外,數據可以以一種可以直接在渲染器(renderer)中使用,而無需解析、解碼或預處理數據。
如上圖所示,有兩種類型的對象可能包含到外部資源的鏈接,buffers
緩衝區和 images
圖像。稍後將更詳細地解釋這些對象。
讀取和管理外部數據
讀取和處理glTF格式首先要解析JSON結構。解析結構後,頂層緩衝區 buffers
和 images
圖像數組中的緩衝區buffer
和圖像 image
對象可用。這些對象中的每一個都可以引用二進制數據塊。爲了進一步處理,這些數據被讀入存儲器。通常,數據將存儲在一個數組中,以便可以使用用於引用它們所屬的緩衝區buffer
和圖像 image
對象的相同索引來查找它們。
二進制數據在buffers緩衝區中
buffer
緩衝區包含了一個鏈接 URI ,指向了包含原始,緩衝區數據的二進制數據。
"buffer01": {
"byteLength": 12352,
"type": "arraybuffer",
"uri": "buffer01.bin"
}
二進制數據只是從緩衝區的URI讀取的原始內存塊,沒有內在的含義或結構。Buffers
、BufferViews
和Accessors
部分將顯示如何使用有關數據類型和數據佈局的信息擴展此原始數據。例如,數據的一部分可以被解釋爲動畫數據,而另一部分可以被解釋爲幾何數據。將數據存儲爲二進制格式可以使其在web上傳輸比JSON格式高效得多,並且二進制數據可以直接傳遞到渲染器(renderer),而無需對其進行解碼或預處理。
圖像數據在images
image
可以指向外部的圖像文件,這個圖像文件可以作爲被渲染對象的紋理。
"image01": {
"uri": "image01.png"
}
該引用以通常指向PNG或JPG文件的URI形式給出。這些格式顯著地減小了文件的大小,因此可以通過web高效地傳輸。在某些情況下,image
圖像對象可能不是指向外部文件,而是指存儲在緩衝區中的數據。這個沒那麼直接的細節將在紋理、圖像和採樣器部分中解釋。
二進制數據在 數據URI中
通常, URIs 被包括在 buffer
和 image
對象中,這個URI會指向包含實際數據的文件。
作爲替代方案,可以使用數據URI將數據以二進制格式嵌入JSON。