物理エンジンの構築に関する本を読んでいます。私は現在、コードを完全に理解していないため、リジッドボディ間の貫通を解決する方法である非線形投影に固執しています。
ここでは、私の理解の範囲内で簡単に説明します。非線形投影は、線形投影に回転を追加するため、線形投影よりも信頼性が高くなります。この本では、次のアルゴリズムを使用しています。
- 全慣性を計算します。オブジェクトの逆質量である線形慣性と、オブジェクトの慣性モーメントから計算される角度慣性があります。
- 線形慣性に比例する接触法線 ( ベクトル ) に沿って、各オブジェクトを線形に移動します。それは [接触法線ベクトル] * ペネトレーション * (線形慣性) / (総慣性) となります。
- 各オブジェクトを角慣性に比例して回転させます。それは [ある回転方向] * ペネトレーション * (角慣性) / (総慣性) となります。
線形慣性: 線形慣性の部分は完全に理解しています。
角度慣性: この本では、次のアルゴリズムを使用してオブジェクトの角度慣性を計算していますが、説明がなく、すべてのステップが同じ変数 angularInertiaWorld に割り当てられているため、理解できません。
- 相対的な接触位置を決定します。これは、接触の位置 (ベクトルとして) から重心 (別のベクトル) の位置、またはオブジェクトの位置を差し引いたものです。したがって、相対的な接触位置はオブジェクトに相対的です。
- 次の計算を行います: (相対接触位置) (クロス積) (接触法線)。接触法線は、接触面に垂直なベクトルです。
- ステップ 2 で取得したものをオブジェクトの逆慣性テンソルで変換して、ステップ 2 の結果をワールド座標に変換します。
- 次の計算を行います: (ステップ 3 の結果) (クロス積) (相対的な接触位置)
- 次の計算を行います: (ステップ 4 の結果) (dotproduct) (接触法線)
アルゴリズムの各ステップで何が起こっているのだろうと思っています。私が理解できるのは、いくつかの値から始めて、オブジェクトの角度慣性であるはずの値で終わることだけです。
線形射影: 非線形射影アルゴリズムの線形部分を完全に理解しています。
角度回転: この本では、このアルゴリズムを使用して、オブジェクトをどれだけ回転させるかを計算しています。ここにはもっと意味のある変数名がいくつかあります。これは、物事をもう少し理解するのに役立ちます。
- 衝撃トルクを計算します。これは、衝撃の単位から生成される回転量であると私は信じています。これは (相対接触位置) (クロス積) (接触法線) によって計算されます。
- 1 単位の運動に必要なインパルスの量を計算します。これは、逆慣性テンソルによって衝撃トルクを変換することによって行われます。
- 単位運動あたりの回転量を計算します。これは、単位運動あたりのインパルスを角慣性で割ることによって行われます。
- 体を回転させたい量を計算します。これは、単位移動 (ベクトル) あたりの回転量に (貫通量) * (角度慣性) / (全慣性) を掛けることによって行われます。
- 回転する量は、私が理解しているクォータニオンに追加されます。
本が回転量を得るために行うすべての単位分析とインパルスを取得します。私がよく理解していないのは、逆慣性テンソルの使用法です。
多分私はそれを完全に理解していませんでした。私は当初、物体のスカラー慣性モーメントのようなものだと考えていたので、トルク = I * alpha で使用しました。ここで、I は慣性モーメント、alpha は角加速度です。次に、トルクを加えると、アルファ = トルク / I が得られるので、トルクに逆慣性モーメントを掛けるとアルファが得られます。その結果、それが逆慣性テンソルの目的だと思いました。
ここでどのように使用されているかを誰かに説明していただければ幸いです。
最後に、最後までお読みいただきありがとうございました。角慣性および/または角回転部分に関する説明をいただければ幸いです。