Metlivi 部落格

角色移動時如何讓 IK 腳部目標保持固定

若要讓 IK 腳部保持固定,移動角色身體控制項時,請讓每個腳部目標的世界位置維持不變。讓腿部求解器調整移動中的身體與固定目標之間的關節。如果目標會繼承身體的移動,請分離這種變換關係,或在 IK 求解前加以補償。

本指南適用於為已綁定骨架的虛擬角色擺姿勢的創作者:角色身體可以上下晃動、傾斜或移動,但雙腳應保持原位。以下工作流程結合已記錄的變換與 IK 行為,以及實用的診斷步驟;文中以 Unity 和 Godot 的術語作為具體參照。

2026年10月29日閱讀時間 7 分鐘作者:Metlivi Editorial Team
第 1 節

為什麼腳部目標會隨身體移動?

目標的局部座標即使沒有改變,在場景中仍可能移動。局部變換描述物件相對於其父節點的位置,因此移動祖先節點也會改變子節點的世界變換。Godot 透過 transform 和 global_transform 說明這項差異。使用 3D 變換 — Godot Engine

先顯示腳部目標控制項,再將身體稍微向側邊移動。觀察目標,不要只看可見的腳。如果目標隨身體移動,請檢查其祖先節點:目標可能位於骨盆、身體控制項或其他會移動的群組之下。

不要只根據局部位置欄位判斷設定。記錄移動前後目標的世界位置。這樣可以分辨兩個重要問題:目標是否離開預定位置,還是腿部未能跟隨靜止的目標?

第 2 節

身體與腳部控制項應如何安排?

將身體動作和固定腳部目標安排在不同的控制分支。實用的安排方式是將骨架和身體控制項放在一個分支,左右腳目標則放在另一個分支,並置於固定的場景控制項之下。關鍵是你操作的身體控制項不能帶動目標分支。

常見的角色總控制項仍可包含這兩個分支,只要你移動的是它底下的身體即可。但移動這個總控制項會同時帶動兩個分支。選擇控制項前,先確認你的操作是要「讓身體移動到固定的雙腳上方」,還是「移動整個角色」。

如果應用程式支援獨立的變換繼承,也可以採用這種方式。例如,Godot 的 Node3D.top_level 會讓節點停止繼承父節點的變換。這是已記錄的變換功能,本身不會設定 IK 求解器。Node3D — Godot Engine

變更目標的父節點或繼承模式時,請保留其原有的世界姿勢。先記錄世界位置和方向,變更關係後再還原該姿勢。確認結果無誤後,再次移動身體。

第 3 節

如果目標必須保留在會移動的父節點之下,該怎麼辦?

獨立記錄腳部固定時的世界姿勢,並根據父節點目前的變換,計算目標所需的局部姿勢。位置的關係式為:目標局部位置 = 目前父節點世界變換的反矩陣 × 已儲存的目標世界位置。Unity 透過 InverseTransformPoint 提供世界座標轉換為局部座標的功能。Transform.InverseTransformPoint — Unity

以下是簡化的平移範例。目標固定在世界 X = 1.0,父節點起初位於 X = 0.0,因此其局部 X 為 1.0。將父節點移至 X = 0.3 後,目標的局部 X 必須改為 0.7,才能維持在世界 X = 1.0。如果局部 X 仍為 1.0,目標就會移至世界 X = 1.3。

這種相減方式只適用於簡化範例。父節點若有旋轉或縮放,就需要進行完整的變換轉換。Unity 的 TransformPoint 會將局部位置轉換為世界座標,並明確納入縮放;因此,位置轉換應使用點運算,而不是方向運算。Transform.TransformPoint — Unity

腳部進入固定狀態時,記錄其固定姿勢。身體移動期間,沿用這個已儲存的值。如果目標已經繼承了移動才重新記錄,就只是把偏移存成新的參照值。如果方向也必須維持不變,請一併保留並轉換目標方向和位置。

第 4 節

如何設定腿部 IK 以跟隨目標?

進行大幅姿勢變更前,先檢查求解器的骨鏈指定。在 Unity Animation Rigging 1.4.1 中,Two Bone IK 使用 Root、Mid 和 Tip 變換、Target,以及可選的 Hint。以簡單的兩節角色腿為例,這些分別對應大腿關節、膝關節和腳踝關節。Hint 用來控制彎曲方向。Two Bone IK — Unity Animation Rigging

初次測試時,請將約束影響和目標位置影響都設為全滿,並另外檢查目標旋轉影響。Unity 將這些設定列為不同權重,因此可以分別測試位置跟隨和方向匹配。其 Maintain Target Offset 設定會保留腳尖與目標之間初始的位置或旋轉差異。Two Bone IK — Unity Animation Rigging

啟用約束前,先將目標對齊預定的腳踝姿勢。如果你刻意使用偏移,請記錄它代表的意義。若初始偏移不明,之後就難以比較目標與求解後關節的位置。

使用 Hint 或極向控制項設定預期的膝蓋彎曲方向,再稍微移動身體。測試期間,讓 Hint 的位置容易理解;如果同時改動目標、身體和彎曲控制項,就更難判斷意外結果的原因。

第 5 節

雙腳保持固定時,身體可以移動多遠?

目標固定不代表任何身體姿勢都能達成。對於沒有關節限制且不會伸展的理想兩節骨鏈,幾何條件要求腿部根部到目標的距離介於 |上段長度 − 下段長度| 和 上段長度 + 下段長度 之間。實際關節限制可能會縮小這個範圍。

以兩段長度各為 0.45 場景單位的角色為例,其幾何最大伸展距離為 0.90 單位。如果髖部比腳踝目標高 0.80 單位,水平距離為 0.30 單位,兩者距離為 √(0.80² + 0.30²),約 0.854 單位,仍在理想範圍內。若水平距離增加至 0.50 單位,距離就會變成約 0.943 單位,超出該範圍。

利用這項計算,分辨問題是伸展範圍不足,還是變換設定有誤。如果目標保持固定,但骨鏈無法觸及,就縮小身體位移,或調整身體位置以配合雙腿。分別評估每條腿:向側邊移動可能讓一個目標更近,卻讓另一個目標更遠。

首次調整姿勢時,讓雙腿都保留可見的彎曲,並測試小幅移動。確認每條腿何時接近伸展極限後,再擴大身體的移動範圍。請將此範圍視為特定骨架的結果,不要直接套用其他角色的位移數值。

第 6 節

如何讓整隻腳保持固定,而不只是腳踝?

先定義骨架中「固定」的意思。固定的腳踝目標會確定關節位置,但腳部也需要預定方向。腳底接觸點和腳踝樞紐是不同的參考點;放置控制項時,請保留設計好的偏移。

一種實用的診斷方式是固定腳踝位置,只旋轉身體,然後觀察腳跟和腳趾。如果它們繞著腳踝移動,請檢查腳部方向控制項和任何獨立的腳趾控制項。這項測試能將可見的接觸情況與目標位置分開檢查。

將預定的固定方向和位置一併儲存。身體移動期間,將兩者與已儲存的姿勢比較。Godot 的變換文件說明,變換由原點和代表方向與縮放的基底組成,可作為理解完整姿勢的實用參照。使用 3D 變換 — Godot Engine

第 7 節

如何依照固定順序診斷滑動?

以下步驟是根據上述變換與求解器行為整理出的實用診斷方法。一次只改變一項條件,先使用能重現問題的最小身體位移。

觀察結果 優先檢查項目 下一步
目標隨身體移動 會移動的祖先節點和繼承的變換 分離控制分支,或還原已儲存的世界姿勢
目標固定,但腳踝未對準目標 骨鏈指定、位置影響和伸展範圍 確認設定,再縮小身體位移
腳踝固定,但腳跟或腳趾移動 腳部方向和接觸點偏移 還原預定的固定方向
膝蓋彎曲方向意外改變 Hint 或極向控制項的位置 配合小幅身體移動測試彎曲控制項
拖曳與播放時的結果不同 哪個系統在何時寫入各控制項 檢查播放期間經評估的變換

對動畫或程式控制的設定,請明確安排依賴順序:先設定身體姿勢,再還原或轉換已儲存的目標,最後評估腿部 IK。確認應用程式如何排定這些操作。僅憑回呼名稱,無法確定求解器會在同一次評估中讀取更新後的目標。

最後測試一段短循環:將身體向側邊移動、降低身體、稍微旋轉,再回到起始姿勢。全程將每個目標的世界姿勢與已儲存的參照值比較。目標保持固定後,剩下的調整便會很明確:可達的身體移動範圍、一致的膝蓋方向,以及維持預定接觸所需的腳部方向。

第 8 節

資料來源

相關閱讀

繼續探索這個主題