挑戰完成1/3了~~~
本文開始前先分享一部作品吧~~!
在 Day 9 中,我們探討了**正向運動學(Forward Kinematics, FK)**如何透過設定每個關節的角度,逐層推算出末端的姿態。
今天,我們要了解另一個核心邏輯逆向運動學(Inverse Kinematics, IK)。
它的方向與 FK 相反,是從末端目標位置反推出其他關節角度,而這種運動邏輯在實際 Tutting 舞蹈中同樣非常重要。
已知末端的目標位置與姿態,反推計算各關節的角度與長度變化,使骨架達到該位置的過程。
簡單來說:
現實舞者的動作順序:
1.確定末端目標:例如:手掌與手指的框架要剛好貼住臉的邊線
2.調整末端位置:移動手掌到指定位置
3.自動修正其他關節:肘、肩、甚至脊椎會微調,以符合末端位置與造型的要求
4.完成最終姿態:末端位置正確,同時整體造型依然保持 Tutting 的幾何感
1.設定目標座標與方向:在程式中輸入末端骨架(手掌、手指)的目標位置與朝向
2.IK 演算法開始運算:從末端節點開始,計算與目標位置的距離,嘗試拉近末端位置
3.反向與正向迭代調整:IK(使用FABRIK)依序調整上游關節,確保骨架長度與幾何結構保持不變
4.輸出新骨架角度:將計算後的每個關節角度更新至虛擬角色,生成最終姿態
確定末端目標
↓
設定目標座標與方向
↓
IK 演算法運算(FABRIK)
↓ ↓
Backward pass Forward pass
↓
迭代修正(誤差 < 閾值)
↓
輸出新骨架角度
↓
生成最終姿態
FABRIK 是一種高效率的 IK 演算法,由Andreas Aristidou 與 Joan Lasenby 於2011發表至Graphical Models 的論文,
透過前向與後向的反覆迭代,在目標點與骨架之間尋找合適的關節位置。
它的運算基礎不是直接計算角度,而是用「節點位置的調整」來求解,計算更穩定,收斂速度快。
設定目標:確定末端骨架(手掌/手指)要到達的座標位置與方向。
1.Backward pass(反向傳遞)
從末端開始,沿骨架向根部移動,調整每個關節位置,使它們與下一個關節保持原本的骨骼長度。
在 Tutting 中,這像是先把手放到指定位置,然後往回推手肘、肩膀的位置。
2.Forward pass(正向傳遞)
從根節點(肩膀)出發,沿骨架向末端推進,確保骨骼長度與結構保持不變,同時逼近目標位置。
3.檢查誤差:如果末端位置距離目標小於設定閾值,結束運算;否則重複步驟 2 和 3。
function fabrikIK(selectedJoint, targetX, targetY){
let maxIterations = 5000; // 最大迭代次數
let tolerance = 1; // 允許誤差
// 設定目標關節的位置
joints[selectedJoint].x = targetX;
joints[selectedJoint].y = targetY;
for (let i = 0; i < maxIterations; i++) {
//**Forward Reaching (正向傳播)**
skeleton[selectedJoint].FP.forEach(([startJoint, endJoint, length], index) => {
joints[endJoint] = reachTowards(joints[startJoint], joints[endJoint], length);
});
//**固定末點,不讓它移動**
joints[skeleton[selectedJoint].BP[0][0]] = { x: skeleton[selectedJoint].FX.x, y: skeleton[selectedJoint].FX.y };
// //**Backward Reaching (逆向傳播)**
skeleton[selectedJoint].BP.forEach(([startJoint, endJoint, length], index) => {
joints[endJoint] = reachTowards(joints[startJoint], joints[endJoint], length);
});
// **收斂條件**
let dx = joints[selectedJoint].x - targetX;
let dy = joints[selectedJoint].y - targetY;
if (Math.sqrt(dx * dx + dy * dy) < tolerance) {
break;
}
}
}
最基礎的兩種運動學模式已建立完畢!但舞蹈中有許許多多複雜的動作存在,下一篇將來盤點會出現在Tutting舞蹈中的特殊案例吧~
1.http://www.cs.sjsu.edu/faculty/pollett/masters/Semesters/Spring18/ujjawal/FABRIK-Presentation.pdf
2.http://www.andreasaristidou.com/publications/papers/FABRIK.pdf