3D 骨架動畫重定向

讓多個骨架共用動畫

Godot 的 3D 骨架動畫是用「Transform 軌道」(位置、旋轉、縮放)並以 NodePath 指到骨骼。這代表你不能只靠骨頭名稱一樣,就讓多個骨架直接共用動畫。

Godot 的每根骨頭都有父子關係(階層),每根骨頭會記錄自己的位置、旋轉、縮放,所以即使骨頭名稱一樣,不同骨架的骨頭 Transform 也常常不一樣。

骨架會把預設靜止姿勢(T-Pose 或 A-Pose)記成 Bone Rest(骨頭休息狀態)。如果 Bone Pose 等於 Bone Rest,代表骨架在預設姿勢。

備註

Godot 3.x 和 4.x 的 Bone Pose 行為不同:3.x 時 Bone Pose 是相對於 Bone Rest 的變化,4.x 則是直接包含 Bone Rest。詳見這篇文章:<https://godotengine.org/article/animation-data-redesign-40>。

不同 3D DCC 匯出的模型骨架,Bone Rest 狀態常常不一樣。例如 Blender 輸出的 glTF,Bone Rest 會用「編輯骨頭方向」作為旋轉基準;但 Maya 輸出的 glTF 常常沒有 Bone Rest 旋轉。

要讓 Godot 骨架共用動畫,通常要讓 Bone Rest 和骨頭名稱盡量一致,有些情況還要過濾掉不需要的動畫軌道。Godot 4.x 支援在場景匯入器做這些設定。

重定向可用選項

骨骼對應(Bone Map)

在場景進階匯入設定選擇 Skeleton3D 節點時,右邊會出現「重定向」區塊,裡面有一個 bone_map 屬性。

../../_images/retargeting1.webp

選取 Skeleton 節點後,先建立一份新的 BoneMapSkeletonProfile 。Godot 內建 SkeletonProfileHumanoid (人形骨架 Profile)可直接用於 SkeletonProfileHumanoid ,本教學以下以此為例。

備註

如果你需要的骨架 profile 跟 SkeletonProfileHumanoid 不同,可以在 Godot 編輯器選 Skeleton3D 後,從 3D 視窗工具列的 Skeleton3D 選單匯出自訂 SkeletonProfile

當您使用 SkeletonProfileHumanoid 時,當 SkeletonProfile 設定時將會自動進行對應。如果自動對應效果不佳,您可以手動對應骨骼。

../../_images/retargeting2.webp

如果有骨頭沒對應、重複對應、或父子階層不正確,會在面板顯示洋紅色或紅色警示(依編輯器配色)。這不會擋下匯入,但代表動畫可能無法正常共用。

備註

自動對應是靠骨頭名稱的模式比對,所以建議骨頭名稱用常見英文命名規則。

設定好 bone_map 後,下方會有更多細部選項可調整。

../../_images/retargeting3.webp

移除動畫軌道

如果你要把動畫匯入成 AnimationLibrary 來共用,建議開啟這些選項。若是匯入場景(Scene)用,有時建議關掉,像角色有附加動畫配件時,開啟這些選項可能會讓配件不會動。

只保留骨架變換(Except Bone Transform)

移除所有非骨架 Transform(位置/旋轉/縮放)軌道,只留下骨架動畫。

忽略非必要位移軌道

移除動畫中定義在 SkeletonProfile 中的 Position 軌道,除了 root_bone 和 scale_base_bone 之外。在 SkeletonProfileHumanoid 中,這表示移除除了「Root」和「Hips」之外的 Position 軌道。自 Godot 4.0+ 以來,動畫在 Transform 值中包含骨架靜態姿勢。如果您停用此選項,動畫可能會不可預測地改變身體形狀。

未對應骨頭

移除所有沒有對應到骨架 Profile 的骨頭動畫軌道。

骨頭自動命名

重新命名骨頭

會自動把已對應的骨頭重新命名。

唯一節點命名

將 Skeleton 節點命名為你指定的 skeleton_name,讓動畫路徑(NodePath)無論場景階層如何都能對應正確。

Rest 修正器

SkeletonProfileHumanoid 預設參考姿勢有以下規則:

  • 人形骨架採 T-Pose

  • 人形朝 +Z(Godot 右手 Y-Up)方向

  • 人形骨架節點本身不該有 Transform

  • +Y 軸方向從父骨頭指向子骨頭

  • +X 旋轉代表彎曲(像收縮肌肉)

這些規則是為了混合動畫與反解(IK)方便。如果模型不符這些規則,建議用下列選項修正。

套用節點變換

有些資源匯出沒特別處理時,Skeleton 節點本身會帶 Transform(例如 Blender 匯出 glTF 沒有 Apply Transform)。看起來模型方向正確,但骨架內部實際 Transform 跟標準不同。這選項會在匯入時直接把 Transform 套進骨架,修正這問題。

備註

若場景裡有骨架以外的物件,開這選項有可能出現其他問題。

標準化位移軌道

Position 軌道多半用於角色移動,但如果不同身高的模型共用同一套動畫,移動距離/步幅會出現滑動感。這選項會根據 scale_base_bone``(通常是 Hips)的高度自動標準化位移,Skeleton 會記錄 ``motion_scale,播放時會自動依比例調整。關掉這選項時,Position 軌道不會標準化,motion_scale 會固定為 1.0。

SkeletonProfileHumanoid 預設下,scale_base_bone 就是「Hips」,所以 motion_scale 會用 Hips 高度計算。

覆寫軸向

透過覆寫模型的骨骼靜態姿勢,以符合定義在 SkeletonProfile 中的參考姿勢。

備註

這是 Godot 4.x 共用動畫最關鍵的選項,但如果你的原始模型 Bone Rest 很重要(例如特殊綁定),開這選項有可能會讓模型崩壞。若要保留原始 Bone Rest 又想共用動畫,建議改用 Realtime Retarget Module

修正外型(Silhouette)

嘗試使模型的輪廓符合定義在 SkeletonProfile 中的參考姿勢,例如 T 型姿勢。這無法修正差異過大的輪廓,且可能無法用於修正骨骼捲動。

若使用 SkeletonProfileHumanoid ,T-pose 模型不需啟用此選項,但 A-pose 模型則應啟用。不過這種情況下,固定腳部的結果可能因模型的腳跟高度而不佳,因此可能需要將不希望固定 SkeletonProfile 的骨骼名稱加到 filter 陣列(如下例)。

../../_images/retargeting4.webp

如果角色膝蓋或腳掌本來就彎曲,可能要調整 scale_base_bone 的高度,可用 base_height_adjustment 參數調整。