Game Physics - Constraint
Preface
先前2月參加了Unity應用領域舉辦的CJ貓大大的講座,
非常感謝CJ大大的分享跟連大辛苦尋找場地,
想說也將自己吸收學習到的內容整理成文章,與各位的開發者大大們一起參考學習。
文章的內容是參考CJ大大的專案內容與Box2D作者ErinCatto大大的GDC演講所整理,
這兩份資料都在文章最下方的reference中
Constraint
每一個物理系統時常會有一些約束,物體的運動也必須遵守這些約束。例如,簡單擺系統的約束是擺繩的長度是常數,擺錘與支撐點的距離必須是這長度。 (來自維基百科)
基本概念就是:
- 約束是拿來在像是Joint、Motor、Restitution, Friction與Contact等物理模擬中使用
- 像是疊箱子或是ragdoll的四肢的接點等也會運用到約束
- 解約束是透過計算衝量或作用力並且將這些結果貼回受約束物體的過程
地面約束
地面約束是被地板擋住的簡單約束,我們想將物體限制在地面上,
所以位置方程式可以表示成:
可想而知,如果C等於0,他對時間的導數也會為0。
所以速度約束可以表示成:
將速度的y方向做限制,得到:
畢竟真實的物理世界並不是如此僵硬的直接彈回去,為了擬真會再加上一個偏誤值做緩慢修正:
我們就可以得到地面約束的速度數學式:
程式碼實作可以參考CJ大大的repo
通則化
這部分相當的數學,我參考消化花了不少時間,如果有什麼地方寫得不清楚,歡迎留言詢問。
Jacobian矩陣
根據Chain Rule,推導出的速度限制會有如下形式:
J是一個row vector,被稱作Jacobian Matrix,會取決於被限制物體的位置。
根據速度約束,我們最後要得出的結果是:
轉換為Jacobian矩陣的形式,也就是:
由此可知,Jacobian這個向量是與速度垂直的。
(row vector J 內積 column vector v結果為0)
以前面地面約束舉例,可以寫成以下形式:
所以最後通則化的結果:
其中J是Jacobian矩陣,V是速度矩陣,b是偏誤(bias)
Lagrange Multiplier
先從約束的力開始推導:
如上圖:
可以直觀的發現約束力的作用方向是與約束平面的法向量平行的。
而Lagrange Multiplier的定義是
所以可以用前面的通式與牛頓第二運動定律,解出Lagrange Multiplier
以前面的地面約束為例,可以用這個方式推導,解出速度變化的通式:
而最後的速度變化就可以寫成程式進行約束模擬。
Reference
Allen Chou - Physic Constraints
https://github.com/TheAllenChou/unity-physics-constraints
Erin Catto - Box2D
https://box2d.org/