Physics & constraints

Extended PBD / XPBD

拡張位置ベース物理

柔らかさの時間刻み依存を軽減する。

6 / 10

Interactive demo

Preparing the demo…

Extended PBD / XPBD

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

位置ベース物理(PBD)の弱点だった「硬さが反復回数や時間刻みで変わってしまう」問題を解消した方法です。各拘束に「コンプライアンス(伸びやすさ、硬さの逆数)」という物理的な値を持たせ、拘束ごとに累積した力 λ\lambda を覚えておくことで、何回反復しても、何分割で計算しても、同じ硬さのゴムや布になります。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 では、拘束 CC の補正量を「誤差 CC × 硬さ kk(0〜1)」で決めていました。この kk は 1 回の補正の割合にすぎないので、反復を 10 回すれば 10 回分、刻みを半分にすれば 2 倍の回数だけ補正がかかり、どんどん硬くなってしまいます。

XPBD では、拘束にコンプライアンス α\alpha(硬さの逆数、単位は m/N など)を持たせ、次のように補正します。

α~=αΔt2,Δλ=−C−α~ λ∑iwi ∣∇iC∣2+α~,Δpi=wi ∇iC Δλ\tilde{\alpha} = \frac{\alpha}{\Delta t^2}, \qquad \Delta\lambda = \frac{-C - \tilde{\alpha}\,\lambda}{\sum_i w_i\,|\nabla_i C|^2 + \tilde{\alpha}}, \qquad \Delta\mathbf{p}_i = w_i\,\nabla_i C\,\Delta\lambda
  • λ\lambda は、その拘束がこのステップで及ぼした力の累積(ラグランジュ乗数)です。ステップの始めに 0 に戻し、反復のたびに Δλ\Delta\lambda を足していきます。
  • 分子の −α~λ-\tilde{\alpha}\lambda が「すでにこれだけの力で引っ張っているので、それに見合った伸びは許す」という項です。これがあるため、反復を重ねても、ばねの硬さに見合った伸びのところで補正が止まります。
  • α=0\alpha = 0 なら PBD の k=1k = 1 と同じで、完全に伸びない拘束になります。
  • λ/Δt2\lambda / \Delta t^2 は拘束が及ぼした力そのものなので、力の大きさが分かるのも利点です(ロープが切れる、関節が壊れる、といった判定に使えます)。

実装のポイント

  • PBD のコードにほぼ 3 行足すだけ:λ の配列と、補正式の分母・分子に α~\tilde{\alpha} の項を足すだけで移行できます。
  • サブステップと組み合わせる:Small Steps(2019)で、反復を増やすより 1 フレームを細かいステップに分け、各ステップで 1 回だけ反復するほうが、同じコストでずっと正確になることが示されました。現在の XPBD 実装の多くはこの形です。
  • 減衰:コンプライアンスだけでは振動が残るので、拘束の方向の相対速度を弱める減衰項を加えます。

つまずきやすい点

  • 反復が足りない場合は PBD と同じく柔らかくなる:XPBD の硬さは「収束すれば」反復回数に依存しません。反復やサブステップが極端に少ないと、収束しきれずに柔らかく見えます。
  • コンプライアンスの単位:時間刻みの 2 乗で割るので、非常に小さい値(1e-6 など)を使います。硬すぎる値にすると、PBD の k=1k = 1 と見分けがつかなくなります。
  • 重さの差が大きい物をつなぐ:軽い点で重い物を吊ると収束が遅くなります(デモのゴムひもとおもりがその例です)。サブステップを増やすのが最も効果的です。

デモで試すこと

  1. 最初は、左の PBD(黄)と右の XPBD(青緑)が同じ高さで釣り合うよう、PBD の補正の割合を調整してあります。点線は、ばねの法則から計算した理論上の釣り合いの位置です。
  2. 「拘束の反復回数」を 40 に上げると、PBD のおもりは上へ持ち上がり(ゴムが硬くなる)、XPBD は点線の位置に留まります。1〜3 に下げると、PBD は大きく伸びます。
  3. 「1 フレームの分割数」を変えても同じで、PBD だけが硬さを変えます。
  4. 「ゴムの柔らかさ」を変えると、XPBD は理論値どおりに伸び縮みし、左下の「理論値」と「XPBD の長さ」がほぼ一致し続けます。
  5. 「引っ張って離す」を押すと、ゴムが縮みながら弾んで、それぞれの釣り合いの位置に落ち着きます。

References

Macklin et al. — XPBD ↗