This explanation is currently available in Japanese.
ひとことで
位置ベース物理(PBD)の弱点だった「硬さが反復回数や時間刻みで変わってしまう」問題を解消した方法です。各拘束に「コンプライアンス(伸びやすさ、硬さの逆数)」という物理的な値を持たせ、拘束ごとに累積した力 を覚えておくことで、何回反復しても、何分割で計算しても、同じ硬さのゴムや布になります。Macklin、Müller らが 2016 年に発表しました。
ゲームでの使いどころ
- 調整した硬さを保つ:布やロープの硬さを一度決めれば、フレームレートや品質設定(反復回数)を変えても見た目が変わりません。
- 物理的な値で指定できる:コンプライアンスはヤング率などから換算できるので、「このゴムは 1 N で 1 mm 伸びる」という指定ができます。
- 剛体と柔らかい物体を同じ枠組みで:Müller らの「Detailed Rigid Body Simulation with Extended Position Based Dynamics」(2020)で剛体の関節や接触にも拡張され、Unreal Engine の Chaos Physics などで使われています。
- ソフトボディ・筋肉・肉:有限要素の拘束(体積保存、変形のエネルギー)を XPBD で解くと、安定した柔らかい物体になります。
しくみ
PBD では、拘束 の補正量を「誤差 × 硬さ (0〜1)」で決めていました。この は 1 回の補正の割合にすぎないので、反復を 10 回すれば 10 回分、刻みを半分にすれば 2 倍の回数だけ補正がかかり、どんどん硬くなってしまいます。
XPBD では、拘束にコンプライアンス (硬さの逆数、単位は m/N など)を持たせ、次のように補正します。
- は、その拘束がこのステップで及ぼした力の累積(ラグランジュ乗数)です。ステップの始めに 0 に戻し、反復のたびに を足していきます。
- 分子の が「すでにこれだけの力で引っ張っているので、それに見合った伸びは許す」という項です。これがあるため、反復を重ねても、ばねの硬さに見合った伸びのところで補正が止まります。
- なら PBD の と同じで、完全に伸びない拘束になります。
- は拘束が及ぼした力そのものなので、力の大きさが分かるのも利点です(ロープが切れる、関節が壊れる、といった判定に使えます)。
実装のポイント
- PBD のコードにほぼ 3 行足すだけ:λ の配列と、補正式の分母・分子に の項を足すだけで移行できます。
- サブステップと組み合わせる:Small Steps(2019)で、反復を増やすより 1 フレームを細かいステップに分け、各ステップで 1 回だけ反復するほうが、同じコストでずっと正確になることが示されました。現在の XPBD 実装の多くはこの形です。
- 減衰:コンプライアンスだけでは振動が残るので、拘束の方向の相対速度を弱める減衰項を加えます。
つまずきやすい点
- 反復が足りない場合は PBD と同じく柔らかくなる:XPBD の硬さは「収束すれば」反復回数に依存しません。反復やサブステップが極端に少ないと、収束しきれずに柔らかく見えます。
- コンプライアンスの単位:時間刻みの 2 乗で割るので、非常に小さい値(1e-6 など)を使います。硬すぎる値にすると、PBD の と見分けがつかなくなります。
- 重さの差が大きい物をつなぐ:軽い点で重い物を吊ると収束が遅くなります(デモのゴムひもとおもりがその例です)。サブステップを増やすのが最も効果的です。
デモで試すこと
- 最初は、左の PBD(黄)と右の XPBD(青緑)が同じ高さで釣り合うよう、PBD の補正の割合を調整してあります。点線は、ばねの法則から計算した理論上の釣り合いの位置です。
- 「拘束の反復回数」を 40 に上げると、PBD のおもりは上へ持ち上がり(ゴムが硬くなる)、XPBD は点線の位置に留まります。1〜3 に下げると、PBD は大きく伸びます。
- 「1 フレームの分割数」を変えても同じで、PBD だけが硬さを変えます。
- 「ゴムの柔らかさ」を変えると、XPBD は理論値どおりに伸び縮みし、左下の「理論値」と「XPBD の長さ」がほぼ一致し続けます。
- 「引っ張って離す」を押すと、ゴムが縮みながら弾んで、それぞれの釣り合いの位置に落ち着きます。