匯入 3D 場景

Godot 場景匯入工具

Godot 有靈活可設定的 3D 資源匯入工具。

Godot 以 場景 來作業。這表示,可以將您慣用的 3D DCC 中整個場景匯入轉換為非常相近的結果。

Godot 支援下列 3D 場景檔案格式

  • glTF 2.0 (recommended). Godot has full support for both text (.gltf) and binary (.glb) formats.

  • DAE (COLLADA),舊型的檔案格式,完整支援。

  • OBJ (Wavefront) format + their MTL material files. This is also fully supported, but pretty limited (no support for pivots, skeletons, animations, PBR materials, ...).

  • ESCN, a Godot-specific format that Blender can export with a plugin.

  • FBX,通過 Open Asset Import 函式庫提供支援。但,FBX 為專屬軟體,因此若工作流程合用的話,我們建議使用上述列表中的其他格式。

只需要將場景檔與紋理一起複製到專案儲存庫中,Godot 就會完整匯入。

有一點很重要的是,匯入後的網格並不會被骨骼變形。請確保在匯入前以您慣用的 3D 編輯器將骨骼重設至 T-Pose 或預設靜止姿勢。

在 Maya 或 3DS Max 中匯出 DAE 檔

Autodesk 在 Maya 與 3DS Max 中新增了內建 COLLADA 支援,但預設就不能用,且不應使用。最好的方法是使用 OpenCollada 外掛。雖然 OpenCollada 沒有即時與 Maya/3DS Max 最新版對應,但效果最好。

在 Blender 中匯出 glTF 2.0 檔案

有三種方法可以在 Blender 中匯出 glTF 檔案。可匯出為 glTF 二進位檔 (.glb 檔案)、glTF 嵌入式檔案 (.gltf 檔案) 以及與紋理一起匯出 (.gltf + .bin + 紋理)。

glTF 二進位檔是三種方法中最小的一種。glTF 二進位檔包含 Blender 中設定的網格與紋理。將 glTF 放入 Godot 後,紋理會變成物件材質檔的一部分。

glTF 嵌入式檔案可以獲得與二進位檔案相同的結果。但在 Godot 中沒有提供額外的功能,而且因為檔案大小比較大,所以也不建議使用。

有兩種情況會需要將 glTF 與紋理分別匯入。其中一種情況是需要讓場景由純文字檔來描述、讓二進位資料保存在獨立的二進位檔案中,這樣子便適用於版本控制系統,可以用基於文字的格式來審閱改動。第二種情況是檔需要將紋理與材質檔分開的時候。若沒有需要這兩種情況的話,則用 glTF 二進位檔即可。

備註

Blender 匯出的 glTF 檔不包含放射紋理 (Emissive Texture)。若模型使用放射紋理,則必須分開匯入。

在 Blender 中匯出 DAE 檔

Blender 內建 COLLADA 支援,但用起來不是很適合遊戲引擎,所以也不建議直接拿來用。

Godot 有提供一個 Blender 外掛 ,會自動校正匯出給 Godot 用的 COLLADA 場景。目前不支援 Blender 2.8 與之後的版本,但未來有計劃要更新。

在 Blender 中匯出 ESCN 檔

godot-blender-exporter ,ESCN 是最強大的一種格式。該匯出工具使用 .escn 檔案,算是 .tscn 的另一個名字 (Godot 場景檔)。ESCN 會儘量將 Blender 中的所有資訊都保存起來,但目前還算實驗性格式。

有關 ESCN 匯出工具的詳細功能與使用方法,都寫在 文件 中。

Exporting textures separately

While textures can be exported with a model in certain file formats, such as glTF 2.0, you can also export them separately. Godot uses PBR (physically based rendering) for its materials, so if a texturing program can export PBR textures, they can work in Godot. This includes the Substance suite, ArmorPaint (open source), and Material Maker (open source).

備註

For more information on Godot's materials, see Spatial Material.

Exporting considerations

Since GPUs can only render triangles, meshes that contain quads or N-gons have to be triangulated before they can be rendered. Godot can triangulate meshes on import, but results may be unpredictable or incorrect, especially with N-gons. Regardless of the target application, triangulating before exporting the scene will lead to more consistent results and should be done whenever possible.

To avoid issues with incorrect triangulation after importing in Godot, it is recommended to make the 3D DCC triangulate objects on its own. In Blender, this can be done by adding a Triangulate modifier to your objects and making sure Apply Modifiers is checked in the export dialog. Alternatively, depending on the exporter, you may be able to find and enable a Triangulate Faces option in the export dialog.

To avoid issues with 3D selection in the editor, it is recommended to apply the object transform in the 3D DCC before exporting the scene.

匯入工作流程

Godot 場景匯入工具可依據資料匯入方式的不同使用不同的匯入流程。依據不同選項設定,可以將場景與下列資料一起匯入:

  • 外部材質 (預設):外部材質將各個材質都保存在檔案資源內。對這些材質所做的變更會保留。

  • 外部網格:各個網格會保存至不同的檔案中。許多使用者會偏好直接處理網格。

  • 外部動畫:可保存動畫,以便之後修改或在原始檔更改時合併回去。

  • 外部場景:將匯入場景的各個根節點保存為個別場景。

  • 單一場景:將所有東西都放在單一場景檔案中。

../../../_images/scene_import1.png

由於各個開發者都有不同的需求,所以這個匯入流程可高度客製化。

匯入選項

匯入設定有許多選項,將在稍後說明:

../../../_images/scene_import2.png

節點

Root Type - 根型別

預設情況下,匯入場景的根節點是「Spatial」,但可修改為不同型別。

Root Name - 根名稱

可以指定產生的根節點名稱。

Root Scale - 根縮放

根節點的縮放 (Scale)。

Custom Script - 自定腳本

此處可提供一個腳本來在匯入後處理整個場景。該腳本適合拿來做後處理、用來更改材質、或是對幾何做有趣的處理等等。

建立如下腳本:

tool # Needed so it runs in the editor.
extends EditorScenePostImport


func post_import(scene):
    # Do your stuff here.
    return scene # remember to return the imported scene

post_import 函式會將匯入的場景作為引數 (該參數實際上就是場景的根節點)。必須回傳最終要被使用的場景。回傳的可以是不同場景。

Storage - 儲存

預設情況下,Godot 會匯入單一場景。該選項可以指定根節點下方的節點,並將這些節點做成分別的場景,最後再實體化到匯入的場景中。

當然,也可以手動將匯入場景實體化到其他地方去。

材質

Location - 位置

Godot 支援網格或節點中的材質。預設情況下,材質會被放到各個節點上。

Storage - 儲存

材質可以保存在場景或外部檔案中。預設情況下,材質會保存為外部檔案,所以可以進行編輯。這是因為大多數 3D DDC 並沒有與 Godot 中相同的材質選項。

當使用內建材質,每次原始場景修改與重新匯入後都會遺失這些材質。

備註

如果沒有在重新匯入前移除相應的 .material 檔案,則 Godot 不會重複匯入儲存在外部檔案中的素材。

若要在每次重新匯入 3D 場景後強制重新匯入素材,請更改 3D 場景中的素材儲存模式。要更改素材儲存模式,請先從檔案系統 Dock 中選擇 3D 場景,然後請前往匯入 Dock,並選擇 Material > Storage ,將 Files 改為 Built-In

Keep On Reimport - 重新匯入時保留

編輯材質並使用 Godot 功能後,匯入工具會保留編輯後的材質,往後原始場景更改後都不會再匯入材質。該選項僅在材質保存為檔案時出現。

Meshes - 網格

Compress - 壓縮

在各個網格中的網格多面中使用較不精確的數字以節省空間。

被壓縮的數字為:
  • 變換矩陣 (位置、旋轉與縮放):32 位元浮點數將轉換為 16 位元有號整數。

  • 頂點:32 位元浮點數將轉換為 16 位元有號整數。

  • 法線:32 位元浮點數將轉換為 32 位元無號整數。

  • 切線:32 位元浮點數將轉換為 32 位元無號整數。

  • 頂點色:32 位元浮點數將轉換為 32 位元無號整數。

  • UV:32 位元浮點數將轉換為 32 位元無號整數。

  • UV2:32 位元浮點數將轉換為 32 位元無號整數。

  • 頂點權重:32 位元浮點數將轉換為 16 位元無號整數。

  • 骨架骨骼:32 位元浮點數將轉換為 16 位元無號整數。

  • 陣列索引:依據元素的多寡,將轉換為 32 位元或 16 位元無號浮點數。

額外訊息:
  • UV2 = 用於細節紋理與烘焙光照紋理的副 UV 通道。

  • 陣列索引 = 用來將上述陣列的各元素計數的一組數字陣列。即為頂點或法線的數量。

在某些情況下,壓縮可能會導致精度降低,這是便可能需要禁用該選項。如,若網格非常大或匯入覆蓋巨大區域的多網格,則壓縮匯入的網格可能會導致幾何形狀間有空隙,或是頂點不在應在的位置上。

Ensure Tangents - 確保切線

若使用到有法線映射的貼圖,則網格必須要有切線陣列。該選項可以確保當原始場景中沒有時產生切線陣列。Godot 使用 Mikktspace 來產生,但最好能在匯出工具中產生。

Storage - 儲存

除了內建網格,也可以將網格保存在獨立的檔案 (資源) 中。但除非有需要使用獨立網格來建立物件外,沒什麼實際用途。

該選項主要是提供給偏好直接處理網格而不是場景的使用者。

Light Baking - 光照烘焙

即網格是否用於烘焙的光照圖中。

  • Disabled - 禁用: 網格不用於烘焙的光照圖中。

  • Enable - 啟用: 網格用於烘焙的光照圖中。

  • ** Gen Lightmaps - 產生光照圖:** 網格有在烘焙的光照圖中使用,並為光照圖展開副 UV 層。

備註

更多有關光照烘焙的資訊,請參考 Baked lightmaps

External Files - 外部檔案

可選擇將產生的網格與材質以場景名稱保存在子資料夾中。

Animation - 動畫選項

Godot 中提供了數種選項來控制要如何處理動畫資料。有些匯出工具 (如 Blender 中的) 可以將多個動畫產生在單一檔案中。其他的匯入工具,如 3DS Max 或 Maya 的,則需要將多個動畫放在同一個時間軸上,最糟的情況則會將各個動畫放在個別檔案中。

../../../_images/scene_import3.png

預設有開啟動畫匯入。

注意

To modify animations from an imported 3D scene, you need to change the animation storage option from Built-In to Files in the Import dock. Otherwise, changes made to animations from Godot will be lost when the project is run.

FPS

多數 3D 匯出格式都將動畫時間軸保存為秒而非影格。為了儘量確保動畫能按照原本的樣子匯入,請設定編輯時用的 FPS。若未設定則可能導致動畫不穩定。

Filter Script - 過濾腳本

也可以指定一個特殊格式的過濾腳本,用來判斷哪些動畫中的哪些軌道要保留。

過濾腳本會依據每個匯入的動畫上執行。腳本的格式由兩種陳述式組成,第一種陳述式是用來選擇要過濾哪些動畫,第二種則是用在符合的動畫上過濾個別軌道。名稱的模式使用不區分大小寫的表示式來配對,使用 ?* 字元作為萬用字元 (內部使用 String.matchn() )。

腳本必須以動畫過濾陳述式來開頭 (表示為以 @ 為首的行)。舉例來說,若要套用過濾到所有名稱以 "_Loop" 結尾的匯入動畫:

@+*_Loop

同樣地,也可以在同一行中加上其他模式,並以逗號來分隔。下列修改後的範例也會 包含 所有以 "Arm_Left" 開頭的動畫,但同時 排除 所有名稱以 "Attach" 結尾的動畫:

@+*_Loop, +Arm_Left*, -*Attack

緊接著用來選擇動畫的過濾陳述式之後,要寫的便是用來判斷哪些軌道要保留,哪些要放棄的過濾模式。若沒有指定過濾模式,則相符動畫中的所有軌道都會被放棄!

有一點需要注意的是軌道過濾陳述式會依據動畫中各個軌道的順序來套用,這表示一行選擇了保留軌道的陳述式之後可能出現另一個規則來放棄保留軌道。同樣地,若先前的規律條件排除了一個軌道,過濾腳本後方的規則仍然可以將該軌道重新包含進來。

舉例來說:包含動畫中所有名稱以 "_Loop" 結尾的動畫,但放棄所有以 "Control" 結尾且會對 "Skeleton" 造成效果的動畫,除非名稱中有 "Arm"

@+*_Loop
+*
-Skeleton:*Control
+*Arm*

在上述例子中,如 ”Skeleton:Leg_Control" 軌道會被放棄,而如 "Skeleton:Head""Skeleton:Arm_Left_Control" 軌道則會被保留。

不以 +- 開頭的軌道過濾規則會被忽略。

Storage - 儲存

預設情況下,動畫會以內建形式保存。也可以將動畫儲存於檔案中。這樣即使重新匯入後,在動畫中新增的自定軌道也能被保留。

Optimizer - 最佳化工具

動畫匯入後會執行最佳化工具。最佳化工具能有效降低動畫的大小。一般來說,應該維持開啟最佳化工具,除非遇到動畫疑似因為最佳化而損壞的情況。

Clips - 剪輯

可以指定來自單一時間軸中的多個動畫作為剪輯。模型必須只能有一個命名為 default 的動畫才能建立剪輯。要建立剪輯,請將剪輯數量調整為大於零的任意數。接著便能為剪輯命名、選擇開始與結尾的影格、以及選擇動畫是否要循環。

場景繼承

許多情況下我們會希望能更改匯入的場景。但在預設情況下無法更改,因為若修改了原始素材 (重新從 3D 模型程式中匯出的原始 .dae, .gltf, .obj 檔案),Godot 會重新匯入整個場景。

但,我們可以通過 場景繼承 來建立區域修改。試著打開匯入場景,會顯示下列視窗:

../../../_images/scene_import4.png

繼承場景中,修改只有下列限制:

  • 節點無法移除 (但可以在任何地方新增節點)。

  • 子資源無法編輯 (可以使用上面說明的方法將子資源保存在外部)

除此之外,可以對繼承場景做任何事!

匯入小提示

編輯完場景後,我們往往會需要在匯出後執行下列常見任務:

  • 為物件加上碰撞偵測。

  • 將物件設為導航網格。

  • 刪除遊戲引擎中未使用到的節點 (如用於建模的特定光照)。

為了簡化此一工作流程,Godot 提供了一些可以在 3D 建模軟體中放在物件名稱後的後置詞。匯入時,Godot 會偵測出這些名稱後置詞並自動執行操作。

備註

下方介紹的所有後置詞都 有區分大小寫

刪除節點 (-noimp)

無論是什麼型別的物件,匯入時,名稱中有 -noimp 後置詞的節點都會被移除。這些節點不會出現在匯入的場景中。

建立碰撞 (-col, -convcol, -colonly, -convcolonly)

-col` 選項只適用於網格 (Mesh) 物件。若偵測到該選項,則會加上子靜態碰撞節點,並使用相同的幾何體作為網格。這個選項會建立三角網格碰撞區域,建立過程很慢,但作為碰撞偵測來說時很精準的選項。該選項通常適用於等級幾何 (也請一併參考下方的 ``colonly)。

-convcol 會建立 ConvexPolygonShape 而非 ConcavePolygonShape 。與三角網格不同,三角網格可以是凹型的 (Concave),凸型 (Convex) 只能在形狀沒有凸角時精準地呈現形狀 (金字塔是凸型,而空心盒 (Hallow Box) 是凹形)。因此,凸型碰撞區域通常不適合等級幾何。當要呈現比較簡單的網格時,凸型比起三角碰撞區域有更佳的效能。該選項適合用於需要精準碰撞偵測的簡單或動態的物件。

然而,在這兩種情況,通常視覺幾何要拿來作為碰撞形體都太複雜且太不平滑了。這樣會造成物理故障並不必要地降低引擎的速度。

-colony 修飾詞就是為了解決這個問題,使用該後置詞會在匯入時將網格移除,並改而建立 StaticBody 碰撞區域。如此便有助於分開視覺化網格與實際的碰撞區域。

使用 -convcolonly 選項會改而建立 ConvexPolygonShape

-colonly 也可與 Blender 的空體一起使用。匯入時,會建立一個有碰撞子節點的 StaticBody。不同繪製型別的 Blender 空體所建立的碰撞節點會是數種預定義形狀之一:

../../../_images/3dimp_BlenderEmptyDrawTypes.png

如果可能的話, 請儘量使用初形碰撞區域 來代替三角網格或凸型。初形通常有較好的效能並較可靠。

備註

為了提高 Blender 編輯器中的可見性,可以開啟碰撞空體的「X-Ray」選項,並於 [使用者偏好設定] / [主題] / [3D 視圖] / [空體] 中為空體設定不同的顏色。

也參考

有關碰撞區域更全面的概覽,請參考 Collision shapes (3D)

建立導航 (-navmesh)

-navmesh 後置詞的網格節點會被轉換為導航網格。原始的網格物件將會在匯入時被刪除。

建立 VehicleBody (-vehicle)

-vehicle 後置詞的網格節點會被匯入為 VehicleBody 節點的子節點。

建立 VehicleWheel (-wheel)

-wheel 後置詞的網格節點會被匯入為 VehicleWheel 節點的子節點。

剛體 (-rigid)

-rigid 後置詞的網格節點會被匯入為 RigidBody 節點的子節點。

動畫循環 (-loop, -cycle)

在 COLLADA 文件中以 loopcycle 結尾的動畫片段會被匯入為開啟循環旗標的 Godot Animation。於這裡介紹的其他後置詞不同,這個後置詞不需要加減號

在 Blender 中,需要使用 NLA 編輯器,並以 loopcycle 前置或後置詞來命名動作。