ひとことで
速度を持たずに、今の位置と 1 つ前の位置だけを覚えておき、その差を速度とみなして次の位置を決める方法です。位置を直接書き換えても自然に速度へ反映されるので、「点同士の距離を元に戻す」補正をくり返すだけで、ロープ、鎖、布、ラグドールが作れます。
ゲームでの使いどころ
- ロープ・鎖・吊り橋:点を並べて距離の拘束でつなぐだけで、たわみ、揺れ、物が載ると沈むロープになります。
- 布とマント:格子状の点を距離の拘束でつなぐと布になります。
- ラグドール:『ヒットマン』(2000 年)で、Thomas Jakobsen がベルレ積分と距離の拘束でキャラクターの倒れる動きを作ったことで広く知られるようになりました。
- パーティクル:衝突で位置を押し戻すだけで、跳ね返りの速度が自動的に決まるので、大量の粒子の処理にも向きます。
しくみ
位置 だけで運動方程式を差分にすると、次の式になります(位置ベルレ法)。
- が「前のステップで動いた量」、つまり速度 × 時間刻みの代わりです。
- 速度を明示的に持たないので、位置を直接直すと、次のステップの速度も一緒に変わります。例えば衝突で床の上へ押し戻すと、前の位置との差(下向きの速度)が小さくなり、自然に止まります。
距離の拘束でロープを作る
- 動かす:全部の点を上の式で進めます(重力で落ちる)。
- 距離を直す:つながった 2 点の距離が元の長さ と違えば、差の半分ずつ両方の点を動かして に戻します。固定された点は動かさず、相手だけを動かします。
- くり返す:1 本直すと隣がずれるので、全部の拘束を何回も(5〜20 回ほど)くり返し直します。回数が多いほどロープは伸びにくくなります。
- 衝突:球や地面にめり込んだ点は、表面まで押し戻すだけです。
この「位置を動かしてから拘束で直す」考え方を一般化したものが位置ベース物理です。
実装のポイント
- 時間刻みは一定に:式に が入り、前の位置との差を速度として使うので、刻みが変わると速度の意味が変わってしまいます。固定タイムステップで動かします。
- 減衰は差に掛ける: に 0.99 などを掛けると空気抵抗になります。
- 速度が必要なとき:音を鳴らす、ダメージを計算するなど、速度が必要な場合は で求めます。
つまずきやすい点
- 反復が足りないとゴムのように伸びる:拘束の数が多い(長いロープ、細かい布)ほど、少ない反復では誤差が伝わりきらず、全体が伸びて見えます。反復を増やすか、固定点に近い順に処理します。
- 重い物と軽い物をつなぐ:両側を半分ずつ動かすと、重い物まで軽い点と同じだけ動いてしまいます。質量の逆数の比で動かす量を分けます。
- 硬さの調整が難しい:硬さは反復回数と時間刻みで変わってしまいます。物理的な硬さを指定したいときは拡張位置ベース物理を使います。
デモで試すこと
- 赤い球をドラッグして橋に載せると、板が沈み込み、ロープ全体がたわみます。離すと橋が弾んで揺れます。
- 「左のロープを切る」を押すと、左端の固定が外れ、橋が右の崖にぶら下がって振り子のように揺れます。
- 「距離の補正回数」を 1〜2 にすると、ロープがゴムのように伸びてだらりと垂れ下がります。「最大の伸び」の数値も大きくなります。
- 「点と速度を表示」をオンにすると、各点の「今の位置 − 前の位置」(速度の代わり)が青緑の線で見えます。