これは、ビデオゲームの物理に関する3部構成のシリーズのパートIIIです。このシリーズの残りの部分については、以下を参照してください。
パートI:剛体力学の概要
パートII:固体オブジェクトの衝突検出
このシリーズのパートIでは、剛体の自由運動をシミュレートする方法を説明しました。パートIIでは、衝突テストと近接テストを通じて、ボディがお互いを認識できるようにする方法を説明しました。ただし、これまでのところ、オブジェクトを真に相互作用させる方法はまだわかっていません。たとえば、衝突を検出してそれらに関する多くの有用な情報を決定する方法を知っていても、何をすべきかまだわかりません 行う この情報で。
言い換えれば、私たちは説明しただけです 制約のないシミュレーション 。リアルでソリッドなオブジェクトをシミュレートするための最後のステップは、適用することです。 制約 、剛体の動きに対する制限を定義します。制約の例は次のとおりです。 関節 (ボールジョイントやヒンジジョイントなど)、および 非浸透制約 。この最後のタイプは、 衝突を解決する 、ボディが相互侵入するのを防ぎ、代わりに現実的な方法でボディを互いに跳ね返らせる動作を強制することによって。
この記事では、ビデオゲームの物理学における等式制約と不等式制約について説明します。最初に、修正力が計算される力ベースのアプローチの観点から説明し、次に、代わりに修正速度が計算されるインパルスベースのアプローチの観点から説明します。最後に、不要な作業を排除して計算を高速化するための巧妙なトリックについて説明します。
この記事では、パートIまたはパートIIよりも強力な計算が必要になるため、注意が必要です。微積分をブラッシュアップする必要がある場合は、 ここカーンアカデミーで 。線形代数の基礎のレビューについては、を参照することができます パートIの付録 、および行列乗算などのより複雑な線形代数については、カーンアカデミー 再びお届けします 。ウィキペディアにも素晴らしい記事があります 微積分 そして 線形代数 。
制約は基本的に、シミュレーション中に満たす必要のあるルールです。 「これら2つの粒子間の距離は2を超えてはなりません」 または 「この剛体のペアのこれらの2つの点は、常に一致している必要があります」 。言い換えれば、制約は削除します 自由度 剛体から。シミュレーションの各ステップで、物体に適用されたときにそれらを引き寄せたり引き離したりする修正力または衝撃を計算できるため、それらの動きは制限され、制約によって課される規則は満たされたままになります。
実際には、制約は次の観点から定義されます。 行動関数 または 制約関数 C 、これは、ボディのペアの状態をパラメーター(位置や方向など)として受け取り、スカラー数を出力します。この関数の値が許容範囲内にある場合、制約は満たされます。したがって、シミュレーションの各ステップで、剛体に力またはインパルスを適用して、の値を維持しようとする必要があります。 C 許容範囲内。
制約の一般的なクラスは、 等式制約 。等式制約は、の唯一の許容値が C はゼロです。したがって、シミュレーションの各ステップで、 C 可能な限りゼロに近づけます。言い換えれば、私たちはしたい 最小化 C 。等式制約は、パーティクルまたはポイントの位置が常に事前定義された条件と正確に一致する必要がある場合に使用されます。良い例はボールジョイントです。ボールジョイントでは、2つのリジッドボディを常にジョイントの位置で接続する必要があります。
簡単な例を見てみましょう。位置のある2次元の粒子を考えてみましょう p (( t )=( pバツ (( t )、 pY (( t ))、これは、一度にパーティクルの位置を与える時間の関数です。 t 。ドット表記を使用して時間微分を表現します。したがって、 ṗ の最初の導関数です p 粒子の速度である時間に関して v (( t )、および ḥ は2回目の微分、つまり加速です。
制約を定義しましょう。しましょう C 次の動作関数になります。
この関数は、パーティクルの位置をパラメータとして受け取り、原点からの距離からマイナスを出力します。 l 。パーティクルと原点の間の距離が次の場合は常にゼロになります l 。したがって、この制約の効果は、パーティクルを一定の距離に保つことです。 l 原点に取り付けられた振り子のように、原点から。の値 p 満足する C (( p )= 0は 法的地位 粒子の。
この例では、 C はスカラーを出力する2つの変数のみの関数であるため、簡単にプロットしてそのプロパティの一部を調べることができます。拘束距離を2に設定すると(つまり、 l = 2)、次にのグラフ C このように見えます:
逆さまのコーンです。青いリングには、 C = 0、のルーツです C 。この一連のポイントは、 制約 超曲面 、そしてそれは私たちの粒子のすべての法的位置を含んでいます。制約超曲面はs-次元の表面、ここでsの変数の数です C 。
緑の矢印は グラデーション の C 、超曲面の周りで評価され、への方向を示します 違法な立場 私たちの粒子の、ここで C ≠0。パーティクルがこれらの線に沿って正の方向(原点から離れる方向)または負の方向(原点に向かう方向)に移動すると、制約が解除されます。したがって、粒子を合法的な位置に押し込むために生成する力は、これらの線に平行になります。
この単純な例には2つの変数しかありませんが、ほとんどの制約関数にはそれ以上の変数があるため、それらがどのように見えるかを想像するのは困難です。しかし、原則は同じままです。各ステップで、の勾配に平行な拘束力を生成する必要があります。 C 超曲面で。
簡単に設定するといいでしょう p そのような C 常に正確にゼロです。実際には、パーティクルが超曲面の周りでジャンプしてジッターするため、これは非現実的な動作になります。保つ C 現実的な動作を維持しながら、可能な限りゼロに近づける、直感的なアプローチは 力ベースのダイナミクス 、およびニュートンの運動の法則に違反することなく拘束を満たすように、粒子に適用するために必要な力を計算します。
拘束力を計算するには、粒子の許容加速度と速度を把握する必要があります。このためには、次の導関数を取得する必要があります。 C 時間に関して。
の価値を確実にしたい C ゼロに等しいままで、シミュレーション全体を通して変更されません。これは、最初の導関数が C。 、もゼロでなければなりません。
同様に、 C。 二次導関数であるゼロに固定されたままにするため、 Ĉ 、もゼロでなければなりません。
のさらなる導関数を制約する必要はありません C 、2次導関数は、拘束力が適用される場所であるためです。
これらの導関数を決定しましょう。私たちの現在の定義 C 平方根が含まれているため、微分が少し難しくなります。書き直すことができます C ただし、距離の2乗を使用します。
これはプロパティを変更しません C パーティクルと原点の間の距離が次の場合、ゼロになります l 。これから、一次導関数を得ることができます C に関して t :
の法的立場を考えると p 、すべての速度 ṗ 満足する C。 (( p )= 0法定速度です。この例では、これらは上の画像の超曲面に接する速度のみである必要があります。
の二次導関数 C に関して t は:
同様に、法的な位置と速度が与えられると、すべての加速度 ḥ 満足する Ĉ (( p )= 0法的な加速です。この例では、これらは原点に直接向かう、または原点から離れる加速度のみである必要があります。
ニュートンの第2運動法則を使用して、加速度を力で表すことができます。粒子に作用する力は2つあると考えることができます。すべての外力の組み合わせです。 f 内線 、重力、風、ユーザーが加える力、拘束力など f C。後者は私たちが決定したいものです。粒子に質量があると仮定する m 、その加速度は次のとおりです。
これをに代入する Ĉ = 0我々が得る:
これは次のように再配置できます:
1つの方程式と2つの未知数(の2つの座標 f C)、したがって、それを解決することはできません。もう1つの条件を導入する必要があります。
直感的に、拘束力をに適用する必要があることがわかります 反対する 私たちがしたい方向に 防ぐ パーティクルが移動するのを防ぎます。この例では、拘束力は常に半径の円に垂直な方向を指します。 l 、パーティクルがこの円の外側に移動することは許可されていないためです。これらの垂直な力は、パーティクルが離れようとするたびにパーティクルを円形パスに押し戻します。これにより、これらの方向を指す速度成分がゼロになります。したがって、拘束力は常に粒子の速度に垂直です。
したがって:
制約の一次導関数の方程式は、 p ・ ṗ = 0。以来 f C・ ṗ = 0、両方あります f Cそして p に直交している ṗ 、 など f Cそして p 並列です。したがって、一方を他方の倍数として書くことができます
もうすぐです!スカラー λ を表す 適用する必要のある拘束力の大きさ システムを有効な状態にします。システムが有効な状態から離れるほど、大きくなります λ 有効な状態に戻すためになります。この時点で λ 私たちの唯一の未知数です。上記を前の式に代入すると、次のようになります。
今、私たちは計算することができます λ 直接取得します f Cそれを掛けることによって p 。次に、単に適用します f Cパーティクルに追加し、パートIで説明したシミュレーションで残りを実行します。
λ としても知られています ラグランジュ乗数 。どのような制約の場合でも、計算には力ベクトルの方向とその大きさの決定が含まれます。 λ 。
この例から、拘束力を計算するには、他のすべての力が必要であることがわかります。 f 内線 すでに知られています。そしてもちろん、結果として生じるモーションをシミュレートする前に、拘束力を適用する必要があります。したがって、各シミュレーションステップの一般化されたシーケンスは次のようになります。
これは、単一のエンティティが関与する非常に基本的な制約の比較的単純な例でした。実際には、シミュレーションで多くの制約と多くのオブジェクトを使用できるようにしたいと考えています。ある拘束によって適用される力が別の拘束によって適用される力に影響を与える可能性があるため、拘束を単独で処理することはできません。これは、回転ジョイントで接続された剛体のチェーンの例ではっきりとわかります。そのため、連立方程式で制約を全体として解く必要があります。
次に、シミュレーションのすべてのエンティティの状態を含むベクトルと行列を操作し、それらを使用して、単一粒子の例で行ったのと同様の方法でグローバル方程式を作成します。 2次元の剛体のこれらの方程式を作成してみましょう。
状態ベクトル
メモリリークがあるかどうかを確認する方法
私たちが持っていると言う n シミュレートしているリジッドボディ。しましょう 何 である 状態ベクトル すべてのリジッドボディの位置と角度があります。
どこ p 私 の位置を表す2次元ベクトルです。 私 -剛体、および a 私 はその角度であり、スカラーです。したがって、 何 持っている3n要素。
ダイナミクス:ニュートンの第2法則
しましょう M 次のように3n沿って3n対角行列:
どこ m 私 の質量です 私 -剛体、および 私 私 はその慣性モーメントです。
しましょう F 各物体に作用する力とトルクを含むグローバルな力ベクトルである。これは、外力と拘束力の合計です。
そして:
F また持っています 3n 要素、それぞれ以来 f 私 2次元のベクトルです。
これで、1つの式で、物体のセット全体に対するニュートンの第2運動法則を記述できます。
制約
最後に、動作関数を設定しましょう。あると言う m 拘束。それぞれが剛体のチェーン内のリンクを表します。すべての動作関数を1つの関数にグループ化します C (( 何 ):
C (( 何 )を取る3n-次元ベクトル 何 入力として、出力 m -次元ベクトル。上記と同様のプロセスを使用して、この出力を可能な限りゼロベクトルに近づけたいと考えています。
必要がないため、ここでは各動作関数の定義については説明しませんが、Webには優れたチュートリアルがあります。 関節の拘束を回転させる 。
のデリバティブ C 時間とともに
前と同じように、1回目と2回目の導関数も必要です。 C ゼロベクトルになります。これらの方程式を作成してみましょう。
の導関数 C 時間に関しては、次のように与えることができます。
連鎖律の使用に注意してください。定義することにより、この方程式をさらに発展させることができます J なので:
これは ヤコビ行列 、 または のヤコビアン C 。ヤコビアンは勾配の一般化であり、それ自体が勾配の一般化です。各行が各動作関数の勾配であることに注意することも興味深いです。ヤコビアンは、すべての動作関数がすべての状態変数に関する変更にどのように反応するかを示しています。
チェーンの場合、各制約にはその制約によってリンクされた2つの剛体のみが含まれるため、スパース行列になります。他のすべてのボディの状態は、そのリンクに直接影響を与えません。
これで、の時間微分を表すことができます。 C なので:
綺麗な。
の二次導関数 C になります:
どこ:
ニュートンの第2法則の表現を置き換えると、次のようになります。
拘束力ベクトルの計算
の二次導関数が欲しい C ゼロになるので、ゼロに設定して再配置しましょう。
この方程式は、単一の制約に対して以前に開発した方程式に類似しています。
繰り返しますが、未知数の数は方程式の数よりも多く、また、拘束力が速度に直交しているという事実を使用して、解を見つけることができます。
また、の1次導関数が必要です C ゼロになる。から C。 = 0私たちはそれを持っています:
したがって、拘束力ベクトルを書くことができます F C の倍数として J :
ベクトル λ 持っている m スカラー成分、およびこの行列-ベクトル乗算では、各成分 λ 私 の行を乗算します J (これはの勾配です 私 -番目の制約関数)そしてそれらを合計します。あれは
F C したがって、 線形結合 の行の J 、これは制約関数の勾配です。このシステムは複雑すぎて超曲面を簡単に視覚化できませんが、粒子の例で行ったように、その例とまったく同じように動作します。勾配は制約の超曲面に直交し、システムが進む方向です。移動は許可されていません。したがって、これは禁止された方向を指すベクトルの線形結合です。つまり、拘束力はこれらの方向に制限され、拘束によって課せられた有効な状態に向かって物体を押し出します。
解決しなければならないのは λ 拘束力の大きさを決定するベクトル。主な方程式に戻り、そこで最後の式を代入してみましょう。
これは 線形方程式系 ここでのみ λ 不明です。よく知られているものがたくさんあります メソッド このような線形システムを効率的に解くために。それが解決されたら λ 、計算できます F C 、結果を剛体に適用し、パートIに示すように結果のモーションをシミュレートします。
これらの方程式の詳細な導出については、AndrewWitkinの 拘束されたダイナミクス 、 の一部 物理ベースのモデリング:原則と実践 カーネギーメロン大学でのコース。
これまで、制約が満たされるためには、動作関数が常にゼロに等しくなければならないと想定していました。ただし、ある程度の柔軟性を必要とするタイプの制約があり、修正力はのより広い範囲の値に適用されません。 C ただゼロより。そのような制約の1つの例は、 非浸透制約 、これは、剛体シミュレーションで最も重要なタイプの拘束であることがよくあります。 衝突の解決 、2つのボディが非現実的に相互侵入しないようにし、自然な固体動作を提供します。
パートIIで説明したように、衝突がによって検出された後 GJKアルゴリズム 、両方のボディに接触点があり、接触点の表面法線があります。 GJKは衝突テストと近接テストの両方であり、2つの物体が実際に接触していなくても「衝突」していると見なされる場合がありますが、それらの間の距離は非常に小さいことに注意してください。この場合、2つのボディの接触点は、互いに最も近い点と見なされます。
非貫通拘束は、物体を引き離す矯正力を適用することにより、物体を分離した状態に保つように努めますが、 体が衝突している場合のみ 。
2次元の物体のペアを考えてみましょう に そして B 衝突しています。連絡の瞬間、 に 位置があります p に と角度 a に 、および B 位置があります p B と角度 a B 。電話しましょう r に の中心から行くベクトル に の接点へ に 、そして定義しましょう r B 同様に。しましょう n から指す接触法線である に に B 。
標準の2D回転行列を見てみましょう R (( θ )与えられた角度でベクトルを回転させます θ :
これを使用してベクトルを回転させることができます r に そして r B 角度によって a に そして a B 、それぞれ。これにより、動作関数を定義できます。 C 、 なので:
この動作関数は気が遠くなるように見えますが、アクションは単純です。上の接触点間のベクトルを取ります に との接点 B 、法線ベクトルに投影します n 、およびこの射影ベクトルの長さを出力します。つまり、法線方向の侵入深さを決定します。場合 C がゼロ以上の場合、ボディが貫通していないため、力を加えないでください。したがって、強制する必要があります 不平等 C ≥0。
方程式を分析すると、次の値を制限するだけでよいことがわかります。 λ 制約ごとに。前の例の等式制約では、 λ 任意の値を取ることができます。つまり、拘束力は、動作勾配に沿って正または負の方向になります)。ただし、非浸透制約などの不等式制約では、 λ ゼロ以上である必要があります。これは、押すことしかできない拘束力を表します。 離れて 衝突する物体 離れて 互いに。
この変更により、連立一次方程式が、と呼ばれるまったく異なる(そしてより複雑な)ものに変換されます。 混合線形相補性問題 、またはMLCP。この問題を直接解決できる優れたアルゴリズムがいくつかあります。 Lemkeのアルゴリズム 。ただし、ここでは詳細をスキップし、ゲーム物理学で非常に人気のある制約への別のアプローチについて説明します。
これまでに、 力ベース 制約を適用するためのアプローチ。拘束力を計算し、これらの力を外力と一緒にボディに適用し、パートIで説明した方法を使用してそれらを統合して、結果として生じるモーションをシミュレートします。ただし、ゲーム物理エンジンで非常に人気のある別の手法があります。 インパルスベース アプローチ、力や加速度ではなく、物体の速度に基づいて動作します。これは、拘束ソルバーが、修正力を計算して適用し、積分に依存して速度を変更する代わりに、物体の直線速度と角速度の直接変更を計算して適用することを意味します。
インパルスベースのダイナミクスの目標は、制約を解決する速度をもたらすインパルスを見つけることです。これは、拘束を解決する加速をもたらす力を見つけるという力ベースの目標にいくぶん類似しています。ただし、私たちはより低い桁数で作業しているため、計算はそれほど複雑ではありません。
インパルスベースのアプローチは、BrianMirtichによって普及しました。 1996年からの彼の博士論文 、これはまだこのトピックに関する最も重要な参考資料の1つです。ヤンベンダー et。で。 一連の この主題に関する重要な論文 。
インパルスベースのダイナミクスを使用したシミュレーションステップの一般的なシーケンスは、力ベースのエンジンのシーケンスとは多少異なります。
おそらく、力ベースのアプローチなどに対するインパルスベースのダイナミクスの最大の利点は、アルゴリズムが比較的単純であることです。また、直感的に理解しやすくなります。ほとんどの場合、計算効率も高く、リアルタイムのパフォーマンスが優先されることが多いゲームにとってより魅力的です。ただし、考慮すべき欠点があります。たとえば、安定した接触を現実的に処理するのが難しい(箱の静止スタックなど)、接触摩擦をモデル化する際の複雑さが増すなどです。それでも、後で説明するように、いくつかの方法でこれらの問題を回避できます。
物理学の用語では、 インパルス 時間に関する力の積分です。あれは:
これは の変化 勢い その間。
一定の力の場合 F 一定時間適用されます h 、その場合、衝動は単純です:
2つの剛体が衝突すると、それらは非常に短い時間接触したままになり、その間に変形して、互いに等しく反対の力を加えます。この短い相互作用の後、彼らの速度は劇的に変化したかもしれません、そしてそれ故に彼らの勢いもそうかもしれません。オブジェクトが完全に剛体である場合、オブジェクトが接触している時間は非常にゼロに近く、衝突直後に速度が変化します。完全に剛体は実際には存在しませんが、単純化を使用して、非常に剛体のオブジェクトの動作をリアルにシミュレートできます。
私たちの目標は、シミュレーションの現在のタイムステップの制約を解決するインパルスを見つけることです。 シーケンシャルインパルス これらの衝動を見つけるために使用できる手法です。それは、著者のエリン・カットによって普及しました。 Box2D 物理エンジン 。これは反復アルゴリズムであり、各反復で剛体にインパルスを適用することによって拘束速度に焦点を合わせ、結果の速度誤差が非常に小さくなるまで、つまり、 C。 ゼロに非常に近いです。
ソフトウェア開発者はどこにいますか
シーケンシャルインパルスでは、以前のように1つのモノリシック連立方程式と不等式を作成しません。実際には、1つのパーティクルの最初の例で行ったのとほぼ同じように、各制約を個別にモデル化して解決します。アルゴリズムは、次の3つのステップに要約されます。
パートIのように、半陰的オイラーを使用して加えられた力を統合し、暫定的な速度を生成します。これらの速度は制約に違反する可能性があるため、適用する前に修正する必要があります。
速度エラーを修正するために、すべての拘束に順番にインパルスを適用します。インパルスが小さくなるまで、または最大反復回数に達した後、数回の反復を繰り返します。
新しい速度を使用してモーションをシミュレートし、位置を更新します。これも半暗黙のオイラーを使用します。
これらのステップは、上記のインパルスベースの時間ステップの一般的なシーケンスのステップ2から4に対応することに注意してください。
速度の計算
方程式を調べてみましょう。しましょう q̇ 1= q̇ (( t 私 -1)そして q̇ 2= q̇ (( t 私 )。あれは、 q̇ 1そして q̇ 2は、それぞれ前のタイムステップの速度と現在のタイムステップの速度(決定したい)です。半暗黙的なオイラー統合スキームを使用して、暫定的に、 制約なし 現在のステップの速度(アスタリスクで示されている)は次のとおりです。
この速度は制約に違反する可能性があり、その場合はインパルスで修正する必要があります。
しましょう P C 制約の衝動になります。それを質量で割ると、速度の変化が得られ、それを暫定速度に適用して、制約を満たす目的の速度が得られます。
では、どのように決定するのですか? P C ?インパルスがそれを生成する瞬間的な力と同じ方向に適用されることを認識した場合、力の場合と同じように、拘束力が動作関数の勾配に平行でなければならないという事実を再び使用できます。ベースの制約。したがって、次のように書くことができます。
どこ λ 再び大きさのベクトルです。
インパルスベースのアプローチは、ニュートンの第2法則をバイパスするショートカットを表しています。力とその結果生じる加速度の計算をスキップすることにより、シミュレーションのジッターを望ましくないものにする可能性のある、目立つ瞬間的な速度変化を生成する可能性があります。これらの影響を軽減するために、 バイアス 速度の制約を考慮して、効果を和らげます。
それを観察する J q̇ 2+ b = 0、以来 q̇ 2有効な速度である必要があります。次に、有効な速度方程式を代入して再配置すると、次のようになります。
この方程式を解いた後 λ を使用して制約インパルスを計算できます P C = J T λ 、最後にベロシティを更新します。
すべての制約を個別に解決し、インパルスを適用して物体の速度を更新し、収束が達成されるか、最大反復回数に達するまで、この手順を複数回繰り返す必要があります。つまり、 蓄積する 繰り返すときの衝動。タイムステップを完了するには、最終速度を使用して位置を更新する必要があります。
スタートアップでCFOは何をするのか
不等式の制約
不等式制約の場合、制約が望ましくない方向や強さにインパルスを適用しないように、インパルスを制限し、それらを累積するときに許容値に維持する必要があります。この境界手順は、min
/ max
を適用するほど簡単ではありません。最終的に蓄積されたインパルスを制限したいだけなので、関数 ない 蓄積中に生成された中間インパルス。チェックアウト エリンカットのGDC2009 詳細についてはプレゼンテーション。
ウォームスタート
アルゴリズムの精度を大幅に向上させる1つの小さな手法は、 ウォームスタート 。アルゴリズムは、次の初期推定から始まります。 λ 、そしてそこから上に向かって進みます。物理シミュレーションには多くの時間的および空間的コヒーレンスがあることを考えると、 λ 前のステップで開始点として見つかりました。それがウォームスタートです。多くの場合、ボディはステップ間をあまり移動しないため、前のステップで計算したインパルスは、現在のステップでもほぼ同じになる可能性があります。そこからアルゴリズムを開始すると、より正確なソリューションにすばやく収束します。これにより、特にジョイントやボディ間の永続的な接触などの制約に対して、シミュレーションの安定性が向上します。
インパルスベースの制約を解決するための別の手法は、MLCPとしてモデル化することもできるという事実に由来します。 投影されたガウス・ザイデル (PGS)は、MLCPを解くための反復アルゴリズムであり、インパルスベースのダイナミクスに適しています。それは本質的に線形システムを解きます に バツ = b 、境界付き バツ 。 PGSはの拡張です ガウス・ザイデル法 、ここで、 バツ 各反復で、目的の範囲に維持します。
速度に取り組んでいるので、現在のタイムステップの速度変化とデルタ時間の比率として加速度の近似値を書き込むことで、加速度を排除できます。しましょう q̇ 1= q̇ (( t 私 -1)そして q̇ 2= q̇ (( t 私 )、その後:
ここでも、 q̇ 1は前のステップで計算された速度であり、 q̇ 2は、現在のステップで見つけたい速度です。ニュートンの第2法則から、次のようになります。
近似値を代入して F C = J T λ 、 我々が得る:
以来 C。 = 0、私たちはそれを持っています J q̇ 2= 0 、なぜなら q̇ 2これが解決された後、法定速度になります。を並べ替えて乗算する J 両側で、次のようになります。
このMLCPは、おおよその加速度を使用するため、力ベースのアプローチの場合とは少し異なります。 PGSを使用して解決すると、次のようになります。 λ 、 その後 q̇ 2前の式を使用して計算できます。
更新された位置と方向は、半暗黙的なオイラースキームから簡単にたどります。
興味深いことに、綿密な調査により、PGSはシーケンシャルインパルスと同等であることが明らかになりました!ここでも基本的に同じことをしています。ウォームスタートが再び使用できます。 λ 前のステップで開始点として計算されます。違いは、シーケンシャルインパルスの定式化がより直感的であるということですが、PGSの定式化はより一般的であり、より柔軟なコードが可能です。たとえば、MLCPを解決するために他のツールを使用して実験することができます。
インパルスベースのシミュレーションでPGSを使用する方法の詳細については、以下を参照してください。 ErinCattoの2005年のGDCプレゼンテーションと論文 。
ザ・ クーロン摩擦モデル シンプルでうまく機能します。これは、2つの固体表面が互いに接触している場合の2つの異なるケースを定義します。
摩擦力は法線力に比例します。法線力は、接触面の法線ベクトルの方向の正味の力成分です。言い換えると、摩擦力は2つのオブジェクトを互いに押し付ける力に比例します。次のように表すことができます。
どこ F f 摩擦力です、 F n 法線力であり、 μ それは 摩擦係数 (静摩擦と動摩擦では異なる場合があります)。
拘束モデルを使用して摩擦をシミュレートするには、速度拘束を直接記述する必要があります。
どこ v p は接触点での相対速度ベクトルです p 、および t は、サーフェスに接する単位ベクトルです。接線速度をゼロにします。
摩擦方程式に従って、摩擦インパルスの値を通常のインパルスに摩擦係数を掛けた値に制限する必要があります。これは、私たちが λ の間に- μ λ nそして μ λ n、 どこ λ n法線インパルスの大きさです。
したがって、摩擦は不等式制約のもう1つの例です。
三次元では、物事は少し複雑になります。彼の中で 2005GDCプレゼンテーション 、Erin Cattoは、2つの接線ベクトルと1対の制約を使用するアプローチを示します。ただし、この場合、摩擦インパルスを通常のインパルスの倍数で制限すると、2つの制約が結合され、解決が困難になります。彼は、代わりに、物体の質量と重力加速度に比例する一定の値でそれを制限することによって、それを回避します。
拘束を適用するために、剛体に適用する力または力積を決定するためのいくつかの方法について説明しました。いずれの場合も、計算にはかなりの手間がかかります。ここで、必要のないときにこの作業の一部を切り取るための巧妙な最適化戦略を見てみましょう。
制約付きの物理シミュレーションでは、一部のオブジェクトが他のオブジェクトのモーションに影響を与える一方で、影響を与えないオブジェクトがあることを確認できます。
上の画像では、ボックス B 移動しない静的オブジェクトです。床です。左側のオブジェクトは、互いに接触して積み重ねられています。それらのいずれかがまったく移動した場合、それらの間には接触の制約があるため、他の部分も移動する可能性があります。これらの物体のいずれかに加えられる力または衝撃は、他の物体全体に伝播する可能性があります。ただし、真ん中の三角形は固定ボックスに一人で座っているだけです B 。左側の積み重ねられたオブジェクトに加えられた力は、積み重ねられたオブジェクトと三角形の間に接続がないため、三角形の動きに影響を与えることはありません。右側のボックスのチェーンについても同じことが言えます。それらはすべて回転ジョイントによって接続されているため、それらのいずれかの動きが拘束に沿って反作用を生成し、チェーンの一部である他のすべてのボックスの動きに影響を与える可能性があります。ただし、これらのいずれかの間に新しい制約が作成されない限り、三角形の状態や左側の積み重ねられたオブジェクトに影響を与えることはありません。たとえば、それらの動きによって他のオブジェクトと衝突するため、接触/非貫通の制約が作成されます。オブジェクト。
この単純な観察に基づいて、これらのオブジェクトを私たちが呼ぶものにグループ化することができます 島々 、は自己完結型のボディグループであり、拘束力/インパルスを介してグループ内の相互の動きに影響を与えることができますが、他の島に属するオブジェクトの動きには影響を与えません。
この分離により、物理学の世界全体で1つの大きなシステムではなく、より小さなシステムを作成して、より小さなグループの制約を解決できます。これにより、コンピューターが実行しなければならない潜在的に膨大な量の無駄な作業が排除されます。
ボディがノードで制約がエッジであるグラフとして世界を見ると、を使用して島を構築できます。 深さ優先探索 このグラフで。グラフ理論では、私たちの島はとして知られています 接続されたコンポーネント 。
Box2D その中でこれを行います b2World::Solve
それぞれのすべての制約を解決する責任があるメソッド ステップ 。それは島を構築し、次に呼び出します b2Island::Solve
それらのそれぞれに。この方法は、シーケンシャルインパルスを使用してその島の制約を解決します。
シミュレーション中に物体が静止すると、外力によって物体が再び移動するまで、シミュレーションの後続のすべてのステップで物体の位置は自然に変化しません。これは、別の可能な最適化への注意を呼びかけます。すべてのボディの直線速度と角速度が短時間、特定の許容範囲を下回ったときに、特定の島のシミュレーションを停止できます。この状態はと呼ばれます 睡眠 。
島がスリープ状態になった後、そのボディは、衝突検出を除くシミュレーションのすべてのステップから除外されます。島の外の物体がこの島のいずれかの物体と衝突すると、島は「目覚め」、再びシミュレーションに戻ります。他の外力または衝撃がその体のいずれかに加えられると、それも目覚めます。
これは、多くのオブジェクトを含むシミュレーションのパフォーマンスを大幅に向上させることができる、かなり単純な手法です。
これで、3部構成のシリーズは終わりです。 テレビゲーム 物理。ゲームをダイナミックで楽しいものにするのに十分な物理シミュレーションの基本的なサブセットである剛体シミュレーションに焦点を当てて、ゲームで物理をシミュレートする方法を見てきました。剛体の動きをシミュレートする方法、剛体間の衝突を検出して解決する方法、および剛体間のその他の相互作用をモデル化する方法を確認しました。
私たちが見た技術は、次のような人気のあるゲーム物理エンジンで使用されています。 Box2D 、 チップマンク物理学 そして 弾丸物理学 。これらのメソッドを使用すると、オブジェクトが動き回ったり衝突したりする、リアルでダイナミックな動作のゲームを作成できます。また、さまざまな種類のジョイントを介してオブジェクトをさまざまな方法で相互に接続できます。これらの同じ方法が、ロボット工学など、ゲーム以外の他の領域でもアプリケーションを見つけることに注意することは興味深いかもしれません。
いつものように、物事は理論的には美しいかもしれませんが、実際には別の話であることがわかります。特に制約されたダイナミクスに関して、安定した効率的な実装を得るには、多くの巧妙な単純化が必要です。衝突検出、衝突時間の計算、MLCPの解決などに関して、過去数年間に多くの素晴らしい開発が行われてきましたが、まだ改善できることがたくさんあります。ザ・ 弾丸物理フォーラム ゲームと剛体物理シミュレーションの世界で何が起こっているかを最新に保つのに適した場所です。 衝突検出と物理シミュレーションに関する研究開発の議論 メンバーがあらゆる種類の現代物理シミュレーション技術について議論するセクション。