Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

匯入設定

Godot 提供多種方式自訂匯入資料,例如匯入面板、進階匯入設定對話框,以及繼承場景。你可以進一步調整匯入場景內容,像是微調網格、加上物理資訊、或新增節點。也可以撰寫腳本,在匯入結束時自動進行客製化處理。

注意:如果可行,建議優先在原始 3D 檔案中做調整,不要只依賴 Godot 匯入後的場景配置。這能減少 3D 軟體與匯入後場景的落差。更多細節可參考 模型匯出注意事項利用名稱後綴自訂節點型別

匯入工作流程

由於 Godot 只能儲存自己的場景格式(.tscn/.scn),Godot 無法儲存原始 3D 場景檔案(使用不同的格式)。這也是一種更安全的方法,因為它可以避免對原始檔案進行意外更改。

為了允許自訂場景及其材質,Godot 的場景匯入器允許關於資料匯入方式的不同工作流程。

在檔案系統停靠區中選取 3D 場景後,匯入停靠區

在檔案系統停靠區中選取 3D 場景後,匯入停靠區

此匯入過程可根據您的需求使用 3 個獨立的介面進行自訂:

  • 匯入 塢站,在檔案系統塢站中點選一次選擇 3D 場景後。

  • 可透過在檔案系統 Dock 中雙擊 3D 場景,或在匯入 Dock 按下 Advanced… 按鈕開啟 進階匯入設定 對話框。這能在 Godot 內針對各物件自訂選項,並預覽模型與動畫。詳情請參考 進階匯入設定

  • 匯入提示,這是在 3D 建模軟體中新增到物件名稱的特殊後綴。這讓您可以在 3D 建模軟體中針對每個物件自訂匯入選項。

對於基本自訂,使用匯入底座就足夠了。但是,對於更複雜的操作(例如基於每種材質定義材質覆蓋),您需要使用「進階匯入設定」對話方塊、匯入提示或可能同時使用兩者。

使用模組

在檔案系統面板選取 3D 場景後,匯入面板會出現下列可調整選項:

  • 根節點型別: 選擇匯入場景的根節點型別。建議使用繼承自 Node3D 的型別(否則在 3D 編輯器中無法直接移動該節點)。

  • 根節點名稱: 匯入的場景中根節點的名稱。當在編輯器中實例化場景 (或從檔案系統面板拖曳) 時,這通常不會被注意到,因為在這種情況下,根節點會被重新命名以符合檔案名稱。

  • 套用根節點縮放: 如果啟用,根節點縮放 將會直接 套用 在網格和動畫上,同時保持根節點的縮放為預設值 (1, 1, 1)。這表示如果您稍後在匯入的場景中新增一個子節點,它將不會被縮放。如果停用,根節點縮放 將會乘以根節點的縮放作為替代。

網格

  • 確保切線: 如果選中,如果輸入網格沒有切線資料,則使用「Mikktspace <http://www.mikktspace.com/>`__ 產生頂點切線。如果可能,建議讓 3D 建模軟體在匯出時產生切線,而不是依賴此選項。正確顯示法線和高度貼圖以及需要切線的任何材質/著色器功能都需要切線。如果您不需要需要切線的材質特徵,則停用此功能可減少輸出檔案大小,並在來源 3D 檔案不包含切線的情況下加快匯入速度。

  • 產生 LODs: 如果勾選,產生網格的較低細節變體,將會在遠處顯示以提升渲染效能。不是所有網格都能從 LOD 受益,特別是如果它們從未在遠處渲染。停用此選項可以減少輸出檔案大小並加快匯入速度。請參閱 網格的細節級別(LOD) 以了解更多資訊。

  • 建立陰影網格: 如果選中,則可以在匯入時產生陰影網格。這可以透過在可能的情況下將頂點焊接在一起來優化陰影算繪,而不會降低品質。這反過來又減少了算繪陰影所需的記憶體頻寬。陰影網格產生目前不支援使用比來源網格更低的細節等級(但陰影算繪將在相關時使用 LOD)。

  • 光照烘焙: 設定網格在 3D 場景中的 全域照明模式。如果設定為 靜態光照貼圖,將網格的 GI 模式設定為 靜態,並在匯入時產生 UV2 用於 光照貼圖烘焙

  • 光照貼圖紋理像素大小: 僅當 光照烘焙 設定為 靜態光照貼圖 時才可見。控制烘焙光照貼圖上每個紋素的大小。較小的值會產生更精確的光照貼圖,但代價是更大的光照貼圖尺寸和更長的烘焙時間。

天空:

  • 使用命名皮膚: 如果選中,則使用命名 Skins 進行動畫。 MeshInstance3D 節點包含 3 個相關屬性:指向 Skeleton3D 節點的骨架 NodePath(通常為``..``)、網格和皮膚:

    • Skeleton3D 節點包含骨骼列表,其中包含名稱、姿勢和休息、名稱和父骨骼。

    • 網格是顯示網格所需的所有原始頂點資料。就網格而言,它知道如何對頂點進行權重繪製,並使用通常從 3D 建模軟體匯入的一些內部編號。

    • 皮膚包含將此網格物件綁定到此 Skeleton3D 上所需的資訊。對於 3D 建模軟體選擇的每一個內部骨骼 ID,它都包含兩件事。首先,一個矩陣,稱為綁定姿勢矩陣、逆綁定矩陣,簡稱 IBM。其次,皮膚包含每個骨骼的名稱(如果啟用了**使用命名皮膚**),或者骨骼在 Skeleton3D 列表中的索引(如果禁用了**使用命名皮膚**)。

總而言之,這些資訊足以告訴 Godot 如何使用 Skeleton3D 節點中的骨骼姿勢來算繪每個 MeshInstance3D 的網格。請注意,每個 MeshInstance3D 可以共享綁定,這在從 Blender 匯出的模型中很常見,或者每個 MeshInstance3D 可以使用單獨的 Skin 對象,這在從其他工具(例如 Maya)匯出的模型中很常見。

動畫

  • 匯入: 如果選中,則從 3D 場景匯入動畫。

  • FPS: 用於透過線性內插將動畫曲線烘焙為一系列點的每秒影格數。建議配置此值以符合您在 3D 建模軟體中用作基線的值。較高的值會導致更精確的動畫和快速的運動變化,但代價是檔案大小和記憶體使用量更大。由於插值,超過 30 FPS 通常不會有太大好處(因為動畫在更高的算繪影格速率下仍然會顯得平滑)。

  • 修剪: 如果沒有關鍵影格更改,則修剪動畫的開頭和結尾。這可以減少某些 3D 場景的輸出檔案大小和記憶體使用量,具體取決於其動畫軌道的內容。

  • 刪除不可變軌道: 刪除僅包含預設值的動畫軌道。這可以減少某些 3D 場景的輸出檔案大小和記憶體使用量,具體取決於其動畫軌道的內容。

Import Script

  • 路徑: 匯入腳本的路徑,這個腳本可以在匯入過程完成 之後 執行程式碼來進行自訂處理。請參閱 使用匯入腳本實作自動化 以獲取更多資訊。

glTF

  • 嵌入紋理處理: 控制如何處理嵌入到 glTF 場景中的紋理。 放棄所有紋理 不會匯入任何紋理,如果您希望在 Godot 中手動設定材質,這會很有用。 提取紋理 將紋理提取到外部圖像,從而縮小檔案大小並更好地控制匯入選項。 嵌入為基礎通用嵌入為未壓縮 將紋理嵌入到匯入的場景中,分別使用和不使用 VRAM 壓縮。

FBX

  • Importer Which import method is used. ubfx handles fbx files as fbx files. FBX2glTF converts FBX files to glTF on import and requires additional setup. FBX2glTF is not recommended unless you have a specific reason to use it over ufbx or working with a different file format.

  • Allow Geometry Helper Nodes :啟用或停用幾何輔助節點

  • 嵌入式紋理處理: 控制如何處理嵌入在 FBX 場景中的紋理。 捨棄所有紋理 將不會匯入任何紋理,如果您希望改為在 Godot 中手動設定材質,這會很有用。提取紋理 將紋理提取到外部圖片,導致較小的檔案大小以及對匯入選項有更多控制。 嵌入為 Basis Universal嵌入為未壓縮 將紋理保留嵌入在匯入的場景中,分別為有和沒有 VRAM 壓縮。

Blender 專用選項

僅在 .blend 檔案可見。

節點

  • Visible:All 會匯入所有物件(包含不可見者)。選 Visible Only 只匯入可見物件。選 Renderable 則只匯入在 Blender 中被標記為可渲染的物件,無論其實際是否可見。在 Blender 中,可渲染性由大綱視圖中物件旁的相機圖示切換,可見性則由眼睛圖示切換。

  • Active Collection Only: 勾選時,只匯入 Blender 目前作用集合中的節點。

  • Punctual Lights: 勾選時,會匯入 Blender 的光源(方向光、全域光、聚光燈)。「Punctual」並非「positional」之意,因此方向光也包含在內。

  • Cameras: 勾選時,匯入 Blender 的攝影機。

  • Custom Properties: 勾選時,將 Blender 的自訂屬性以 glTF extras 匯入。這些資料可由使用 GLTFDocument.register_gltf_document_extension() 的編輯器外掛於匯入時設定節點中繼資料等用途。

  • Modifiers: 設為 No Modifiers 會在匯入時忽略物件的修改器。設為 All Modifiers 則在匯入時套用所有修改器。

網格

  • Colors: 勾選時,匯入 Blender 的頂點色。

  • UVs: 勾選時,匯入 Blender 的頂點 UV1 與 UV2。

  • Normals: 勾選時,匯入 Blender 的頂點法線。

  • Export Geometry Nodes Instances: 勾選時,匯入 Blender 的 Geometry Nodes 實例。

  • GPU Instances If checked, imports instances and particle systems as GLTF's buffer/accessor data instead of numerous singular Mesh3D object. This does not include Geometry Nodes instancing.

  • Tangents: 勾選時,匯入 Blender 的頂點切線。

  • Skins:None 會略過從 Blender 匯入骨架 Skin 資料。選 4 Influences (Compatible) 以與所有渲染器相容為目標匯入(部分裝配精度較低)。選 All Influences 則匯入所有影響(Godot 最多 8 個),精度較高,但可能不相容於所有渲染器。

  • Export Bones Deforming Mesh Only: 勾選時,只匯入會影響網格變形的骨骼。

材質

  • Unpack Enabled: 勾選時,會將原始影像解包至 Godot 檔案系統並使用它們,便於調整影像匯入設定(如 VRAM 壓縮)。未勾選時,允許由 Blender 轉換原始影像,例如將粗糙度與金屬度重新打包成一張粗糙度+金屬度貼圖。多數情況建議維持勾選;但若 .blend 內影像格式不正確,為了正確行為需停用本選項。

  • Export Materials: 設為 Placeholder 時不匯入材質,但保留表面插槽以便之後為不同表面指派材質。設為 Export 時按原樣匯入材質(注意 Blender 程式化材質可能無法正確運作)。設為 Named Placeholder 時會匯入材質,但不匯入打包在 .blend 內的影像,需在匯入後的材質中手動重新指定貼圖。

動畫

  • Limit Playback: 勾選時,動畫匯入將限制在 Blender 定義的播放範圍內(Blender 動畫時間軸右側的 StartEnd)。這可避免包含未使用的動畫資料,使匯入場景更小、載入更快。但若 Blender 中播放範圍設定不正確,可能導致動畫資料遺漏。

  • Always Sample: 勾選時,匯入會強制進行動畫取樣,以確保 Blender 與 glTF 的插值行為一致,但會增加檔案大小。未勾選時,因兩者插值語意不同,你在 Blender 與 Godot 匯入後場景所見的插值可能有差異。

  • Group Tracks: 勾選時,會將動畫(包含目前作用與 NLA 上的)分別匯入為獨立軌道。未勾選時,所有目前指派的動作會合併成單一 glTF 動畫。

使用匯入腳本實作自動化

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

透過右鍵點選檔案系統停靠欄並選擇 新建 > 腳本…,建立不附加到任何節點的腳本。在腳本編輯器中,編寫以下內容:

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

# This sample changes all node names.
# Called right after the scene is imported and gets the root node.
func _post_import(scene):
    # Change all node names to "modified_[oldnodename]"
    iterate(scene)
    return scene # Remember to return the imported scene

# Recursive function that is called on every node
# (for demonstration purposes; EditorScenePostImport only requires a `_post_import(scene)` function).
func iterate(node):
    if node != null:
        print_rich("Post-import: [b]%s[/b] -> [b]%s[/b]" % [node.name, "modified_" + node.name])
        node.name = "modified_" + node.name
        for child in node.get_children():
            iterate(child)

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

要套用匯入腳本,請於匯入面板「匯入腳本」區塊的「路徑」指定腳本檔案。

動畫樹

You can also choose to import only animations from a glTF file and nothing else. This is used in some asset pipelines to distribute animations separately from models. For example, this allows you to use one set of animations for several characters, without having to duplicate animation data in every character.

那麼,請在檔案系統欄目中選擇 glTF 檔,然後在匯入欄中更改匯入模式為動畫庫:

在匯入欄目中將匯入型別更改為動畫庫

在匯入欄目中將匯入型別更改為動畫庫

按一下 重新匯入 ,並根據提示重啟編輯器。重啟後, glTF 檔將作為 AnimationLibrary 匯入,而不是 PackedScene 。然後,可以使用 AnimationPlayer 節點引用此動畫庫。

更改匯入模式為動畫庫後,可見的匯入選項與使用場景匯入模式時相同。有關更多資訊,請參閱 使用模組

篩選腳本

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

過濾腳本會對每個匯入的動畫執行。語法包含兩種陳述式,第一種用於選擇要過濾哪些動畫,第二種用於過濾符合的動畫中的個別軌道。所有名稱樣式都使用不區分大小寫的表達式比對執行,支援 ?* 萬用字元 (底層使用 String.matchn())。

腳本必須以動畫過濾陳述式開頭(以 @ 起首的一行)。例如,若要對所有名稱以 "_Loop" 結尾的匯入動畫套用過濾:

@+*_Loop

同樣地,可以在同一行用逗號分隔加入更多樣式。以下範例另外會 包含 所有名稱以 "Arm_Left" 開頭的動畫,但也會 排除 所有名稱以 "Attack" 結尾的動畫:

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

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

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

例如:包含所有名稱以 "_Loop" 結尾的動畫內的所有軌道,但丟棄任何影響 "Skeleton" 且名稱以 "Control" 結尾的軌道,除非其名稱中包含 "Arm"

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

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

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

場景繼承

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

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

在編輯器中開啟匯入的 3D 場景時的對話框

在編輯器中開啟匯入的 3D 場景時的對話框

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

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

  • 子資源無法編輯。相反地,您需要如上所述將它們儲存到外部。

除此之外,可以任何事。