匯入設定

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

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

匯入工作流程

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

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

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

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

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

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

  • 進階匯入設定**對話框,可以透過雙擊檔案系統擴充座中的 3D 場景或按一下匯入擴充座中的 **進階... 按鈕來存取該對話框。這允許您在 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:指定匯入方式。ufbx 會直接處理 FBX 檔,FBX2glTF 則會在匯入時轉為 glTF(需額外安裝設定)。除非有特殊需求,不建議用 FBX2glTF,建議優先用 ufbx 或其他格式。

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

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

使用高級匯入設定對話方塊

你看到的第一個分頁是**場景**分頁。右側面板中的選項與“匯入”面板相同,但是你還可以看到 3D 預覽。按住滑鼠左鍵並拖動滑鼠就能夠旋轉 3D 預覽。縮放可以通過滑鼠滾輪調整。

高級匯入設定對話方塊(場景分頁)

高級匯入設定對話方塊(場景分頁)。作者:Modern Arm Chair 01 - Poly Haven

訊號與屬性

在**場景**分頁中,可以在左側的樹狀視圖中單獨選中構成場景的節點:

在高級匯入設定對話方塊(場景分頁)中選中節點

在高級匯入設定對話方塊(材質分頁)中選中節點

這樣就會出現針對節點的匯入選項:

  • 跳過匯入: 勾選後,該節點不會出現在最終匯入的場景中。啟用這個選項會禁用其他所有選項。

  • 生成 > 物理 :如果勾選,會生成一個 PhysicsBody3D 父節點 , 帶有作為 MeshInstance3D 節點 同級節點 的碰撞形狀。

  • 產生 > 導航網格: 如果勾選,將為 導航 產生一個 NavigationRegion3D 子節點模型 + 導航網格 將保留原始模型可見,而 僅限導航網格 將只匯入導航網格 (沒有視覺表示)。 僅限導航網格 旨在用於當您手動編寫了用於導航的簡化模型時。

  • 如果勾選,會產生一個 OccluderInstance3D 同級 節點用於 遮蔽剔除,並使用網格的幾何體作為遮擋器形狀的基礎。 網格 + 遮擋器 將會保持原始網格可見,而 僅限遮擋器 將僅匯入遮擋器 (不包含視覺表示)。 僅限遮擋器 意在使用於當您已手動製作一個用於遮擋剔除的簡化網格時。

僅當啟用上述某些選項時,這些選項才可見:

  • 物理 > 身體型別: 僅當啟用 生成 > 物理 時才可見。控制應建立的PhysicsBody3D。 Static 建立 StaticBody3D,Dynamic 建立 RigidBody3D,Area 建立 Area3D。

  • 物理 > 形狀型別: 僅在啟用 生成 > 物理 時才可見。 修剪網格**允許精確的每個三角形碰撞,但它只能與**靜態**主體型別一起使用。其他型別不太精確,可能需要手動配置,但可以用於任何體型。對於靜態關卡幾何體,請使用 **Trimesh。對於動態幾何體,如果可能的話使用原始形狀以獲得更好的性能,或者如果形狀較大且複雜,則使用凸分解模式之一。

  • 分解 > 進階: 僅當 物理 > 形狀型別分解凸面 時才可見。如果選中,則允許調整高級分解選項。如果停用,則只能調整預設的**精度**(通常就足夠了)。

  • 分解 > 精確度:僅在**物理 > 碰撞形狀類型**為**分解凸包**時可見。控制用於凸包分解的精確度。值越高會導致更詳細的碰撞,代價是生成速度較慢以及物理模擬期間 CPU 使用率增加。若要提高效能,建議針對您的使用情況,將此值保持在盡可能低的水平。

  • 遮蔽物 > 簡化距離: 僅在 生成 > 遮蔽物 設定為 網格 + 遮蔽物僅遮蔽物 時可見。值越高會產生一個具有較少頂點的遮蔽物網格 (導致 CPU 使用率降低),代價是更多遮蔽剔除問題 (例如誤報或漏報)。如果您遇到當攝影機靠近特定網格時物件不應該消失卻消失了,請嘗試降低此值。

設定外部編輯器

在「進階匯入設定」對話方塊中,有兩種方法可以選擇單一網格或材質:

  • Logo 會顯示在螢幕的最上方。

  • 留在**場景**標籤中,但展開左側樹狀視圖上的選項。選擇網格或材質後,這會顯示與 網格材質 分頁相同的信息,但以樹視圖而不是列表的形式顯示。

如果選擇網格,右側面板中會出現不同的選項:

進階匯入設定對話框(網格分頁)

進階匯入設定對話框(網格分頁)

常見的使用情景如下:

  • 儲存到檔案: 儲存 Mesh 資源 到外部檔案 (這不是場景檔案)。您通常不需要用這個來將 Mesh 放置在 3D 場景中 — 而是應該直接實例化該 3D 場景。然而,直接存取 Mesh 資源對特定節點很有用,例如 MeshInstance3DMultiMeshInstance3DGPUParticles3DCPUParticles3D。— 您也需要使用啟用 儲存到檔案 後出現的選項來指定輸出檔案路徑。建議使用 .res 輸出檔案副檔名以獲得較小的檔案大小和更快的載入速度,因為 .tres 在寫入大量資料時效率較差。

  • 產生 > 陰影網格: 每個網格的覆寫設定,用於 使用模組 中描述的場景範圍匯入選項 網格 > 建立陰影網格預設 將使用場景範圍的匯入選項,而 啟用停用 可以強制啟用或停用特定網格上的此行為。

  • 產生 > 光照貼圖 UV: 網格 > 光照烘焙 ** 場景範圍匯入選項的每個網格覆蓋,如 :ref:`doc_importing_3d_scenes_using_the_import_dock` 所述。 **預設**將使用場景範圍的匯入選項,而**啟用**或**停用**可以在特定網格上強制啟用或停用此行為。 - 在具有 **靜態 光照烘焙模式的場景中將其設定為 啟用 相當於配置此網格以使用 靜態光照貼圖。在具有 靜態光照貼圖 光照烘焙模式的場景上將其設定為 停用 相當於配置此網格以使用 靜態

  • 生成 > LOD:每網格覆寫 網格 > 生成 LOD 這個場景級別的匯入選項,詳細描述請參閱 使用模組預設 將會使用場景級別的匯入選項,而 啟用停用 則可以在特定的網格上強制啟用或停用此行為。

  • LOD > 法線分割角度: 在網格 LOD 產生中保留幾何邊緣所需的兩個頂點之間的最小角度差。如果在產生 LOD 時遇到視覺問題,降低該值可能會有所幫助(但代價是 LOD 生成效率較低)。

  • LOD > 法線合併角度: 在網格 LOD 產生中保留幾何邊緣所需的兩個頂點之間的最小角度差。如果在產生 LOD 時遇到視覺問題,降低該值可能會有所幫助(但代價是 LOD 生成效率較低)。

如果選擇一種材質,右側面板中只會出現一個選項:

“進階匯入設定”對話方塊(“材質”標籤)

“進階匯入設定”對話方塊(“材質”標籤)

當選取 使用外部 並指定輸出路徑時,您可以使用外部材質而不是原始 3D 場景檔案中包含的材質;請參閱下面的部分。

匯入紋理

雖然 Godot 可以匯入在 3D 建模軟體中編寫的材質,但預設配置可能不適合您的需求。例如:

  • 你想設定 3D 軟體不支援的 Godot 材質功能。

  • 你想調整貼圖過濾方式(Godot 4.0 以後這是設在材質上,不在貼圖資源上)。

  • 你想直接用自訂 shader 或完全不同的其他材質取代原本的材質。

為了能夠在 Godot 編輯器中修改 3D 場景的材質,您需要使用*外部*材質。

在「進階匯入設定」對話方塊的左上角,選擇「操作...> 提取材質

在「進階匯入設定」對話方塊中將所有內建材料提取到外部資源

在「進階匯入設定」對話方塊中將所有內建材料提取到外部資源

選擇此選項後,選擇一個資料夾來擷取素材``.tres``檔案,然後確認擷取:

在「進階匯入設定」子對話方塊中確認材料提取

在「進階匯入設定」子對話方塊中確認材料提取

備註

萃取材質後,3D 場景將自動配置為使用外部材質參考。因此,您無需在每種材質上手動啟用**使用外部**來使外部``.tres``材質生效。

啟用「使用外部」時,請記住「進階匯入設定」對話方塊將繼續顯示網格的原始材質(在 3D 建模軟體中設計的材質)。這意味著您對材質的自訂在此對話方塊中不可見。若要預覽修改後的材質,您需要使用編輯器將匯入的 3D 場景放置在另一個場景中。

重新匯入來源 3D 場景時,Godot 不會覆寫對萃取材質所做的變更。但是,如果來源 3D 檔案中的材質名稱發生更改,則原始材質和提取的材質之間的連結將會遺失。因此,您需要使用「進階匯入設定」對話方塊將重新命名的材質與現有擷取的材質相關聯。

上述操作可以在對話方塊的“材料”標籤中完成,方法是選擇材料,啟用“儲存到檔案”,然後使用啟用“儲存到檔案”後出現的“路徑”選項指定儲存路徑**。

使用匯入腳本實作自動化

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

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

@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 函式會將匯入的場景作為參數 (該參數實際上就是場景的根節點)。必須回傳最終要被使用的場景。回傳的可以是不同場景。

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

動畫樹

從 Godot 4.0 開始,可以選擇僅從 glTF 檔中匯入動畫。在某些素材管道中,使用動畫和模型分開的方式,比如,給多個角色使用一套動畫,而每個角色不必有重複的動畫資料。

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

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

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

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

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

篩選腳本

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

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

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

儲存

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

最佳化器

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

動畫片段

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

場景繼承

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

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

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

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

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

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

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

除此之外,可以任何事。