iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
佛心分享-SideProject30

用 GenAI 創造虛擬 Tutting 舞者的 30 天冒險系列 第 10

Day 10 | Tutting 舞蹈與逆向運動學(IK)的關係

  • 分享至 

  • xImage
  •  

挑戰完成1/3了~~~

本文開始前先分享一部作品吧~~!
/images/emoticon/emoticon01.gif

TUTAT TUTTING IN TOKYO


在 Day 9 中,我們探討了**正向運動學(Forward Kinematics, FK)**如何透過設定每個關節的角度,逐層推算出末端的姿態。

今天,我們要了解另一個核心邏輯逆向運動學(Inverse Kinematics, IK)

它的方向與 FK 相反,是從末端目標位置反推出其他關節角度,而這種運動邏輯在實際 Tutting 舞蹈中同樣非常重要。

什麼是逆向運動學(IK)

定義

已知末端的目標位置與姿態,反推計算各關節的角度與長度變化,使骨架達到該位置的過程。

簡單來說:

  • 舞者先想好「手或手肘要放到哪個位置」
  • 再讓身體自動找出一組合適的關節角度,完成動作

Tutting 舞蹈與 IK 的對應

現實舞者的動作順序

現實舞者的動作順序:
1.確定末端目標:例如:手掌與手指的框架要剛好貼住臉的邊線
2.調整末端位置:移動手掌到指定位置
3.自動修正其他關節:肘、肩、甚至脊椎會微調,以符合末端位置與造型的要求
4.完成最終姿態:末端位置正確,同時整體造型依然保持 Tutting 的幾何感

對應到數位化 IK 運動學的方式

1.設定目標座標與方向:在程式中輸入末端骨架(手掌、手指)的目標位置與朝向
2.IK 演算法開始運算:從末端節點開始,計算與目標位置的距離,嘗試拉近末端位置
3.反向與正向迭代調整:IK(使用FABRIK)依序調整上游關節,確保骨架長度與幾何結構保持不變
4.輸出新骨架角度:將計算後的每個關節角度更新至虛擬角色,生成最終姿態

確定末端目標
       ↓
設定目標座標與方向
       ↓
IK 演算法運算(FABRIK)
       ↓                 ↓
Backward pass       Forward pass
       ↓
迭代修正(誤差 < 閾值)
       ↓
輸出新骨架角度
       ↓
生成最終姿態

FABRIK(Forward And Backward Reaching IK)介紹

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 模擬中的好處:

  • 能快速求解複雜手臂姿態:適合舞蹈動作中快速變換的框架。
  • 容易加入幾何限制:可套用 Tutting 特有的「框線對齊」、「垂直/水平」等造型條件。
  • 穩定性高:減少 IK 演算法常見的角度爆炸(gimbal lock)或抖動問題。

結論

最基礎的兩種運動學模式已建立完畢!但舞蹈中有許許多多複雜的動作存在,下一篇將來盤點會出現在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


上一篇
Day 9 | Tutting 舞蹈與正向運動學(FK)的關係
下一篇
Day 11 | Tutting 舞蹈的進階動作模式
系列文
用 GenAI 創造虛擬 Tutting 舞者的 30 天冒險29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言