FABRIK探索之旅 - 一種逆向運動學求解方法

 某天偶然在Youtube上看到一部用程式碼做動畫的技巧教學


看起來非常生動有趣,用對岸用語「絲滑」形容非常貼切。

後面他提到了使用FABRIK這個演算法來讓動物的骨架運動、追蹤目標。我一看到就覺得好興奮啊!一直以來我都沒有真的實作過用數值方法去求解逆向運動學,只會乖乖的去算解析解算到起笑。

FABRIK全名Forward and backward reaching inverse kinematic. 提出這個演算法的作者在他的網站有詳細描述他的原理和應用。下面其中我覺得解釋得很清楚直覺的教學影片

他的程式碼實作方式也非常簡單。一開始提到的動畫作者也有公開他的原始碼。在這裡可以看到他的FABRIK Solver。只是他先做了Forward才做Backward,應該是要為了讓原點移動而不是固定在一點。像他在做蜥蜴腳的那段演示。
  void fabrikResolve(PVector pos, PVector anchor) {
    // Forward pass
    joints.set(0, pos);
    for (int i = 1; i < joints.size(); i++) {
      joints.set(i, constrainDistance(joints.get(i), joints.get(i-1), linkSize));
    }

    // Backward pass
    joints.set(joints.size() - 1, anchor);
    for (int i = joints.size() - 2; i >= 0; i--) {
      joints.set(i, constrainDistance(joints.get(i), joints.get(i+1), linkSize));
    }
  }
  
於是我做了一個有趣的嘗試,我找到了FABRIK的原始論文,把他丟給ChatGPT讀請他給我內容摘要,並請他依據論文的演算法提供p5.js的程式碼做一個五連桿機構的Demo。然後我貼到編譯器裡...烏拉拉~~~竟然直接跟我想得一樣,還讓我可以用滑鼠做互動。查看原始碼確實是使用了FABRIK的演算法沒錯。而且他只有做一次迭代就讓我覺得連桿末端緊緊地跟著我的滑鼠了,誤差非常小。我後來把連桿末端與實際誤差印出來,只要是工作範圍內都是0,不過我想是因為資料格式和解析度的問題。這裡是我跟ChatGPT對話的過程,最後的成品我自己有做一點修改。
這個演算法有幾個很有趣的特性:
  • 當你超出工作範圍,他不會Error,只是讓連桿整個伸直指向你的目標。
  • 沒有奇異點的計算問題。不過你也無法預測伸直後拉回來他會怎麼折就是了。
  • 如果你只有Backward沒有Forward,連桿就會像魚一樣跟著你的滑鼠走,超可愛的~

留言

熱門文章