私は OpenGL 3.2+ を試していて、Obj ファイル/モデルを 3D で読み込んで、それらを操作しようとしています。(このサイトなどのソースからのチュートリアルに従ってください)
サードパーティの物理エンジンなどを使用せずに、2 つの既存の (ロードされた) Obj オブジェクト/モデル間の衝突検出を設定する最も簡単な方法 (可能であれば) を考えていました。
私は OpenGL 3.2+ を試していて、Obj ファイル/モデルを 3D で読み込んで、それらを操作しようとしています。(このサイトなどのソースからのチュートリアルに従ってください)
サードパーティの物理エンジンなどを使用せずに、2 つの既存の (ロードされた) Obj オブジェクト/モデル間の衝突検出を設定する最も簡単な方法 (可能であれば) を考えていました。
基準を満たすことができる最も簡単なアルゴリズムは、球間の衝突を検出し、メッシュを終了します。ここで実装例を見ることができます。
最も単純な衝突モデルは、衝突にバウンディング ボックスを使用することです。原理は単純です。最小点と最大点の 2 つの点で定義されたボックスでオブジェクトを囲みます。次に、これらの点を使用して、2 つのボックスが交差するかどうかを判断します。
私のエンジンでは、境界ボックスの構造と衝突検出方法は次のように設定されています。
typedef struct BoundingBox
{
Vector3 min; //Contains lowest corner of the box
Vector3 max; //Contains highest corner of the box
} AABB;
//True if collision is detected, false otherwise
bool detectCollision( BoundingBox a, BoundingBox b )
{
return (a.min <= b.max && b.min <= a.max);
}
他の簡単な方法は、球体を使用することです。この方法は、すべての次元で同様のサイズのオブジェクトに役立ちますが、そうでない場合は多くの偽の衝突が作成されます。この方法では、半径radius
と中心位置position
を持つ球でオブジェクトを囲み、衝突に関しては、中心間の距離が半径の合計よりも小さいかどうかを確認するだけで、その場合は 2 つの球が交差します。
繰り返しますが、私のエンジンからのコード スニペット:
struct Sphere
{
Vector3 position; //Center of the sphere
float radius; //Radius of the sphere
};
bool inf::physics::detectCollision( Sphere a, Sphere b )
{
Vector3 tmp = a.position - b.position; //Distance between centers
return (Dot(tmp, tmp) <= pow((a.radius + b.radius), 2));
}
上記のコードDot()
では、2 つのベクトルの内積を計算します。ベクトルをそれ自体でドット化すると、(定義により) ベクトルの 2 乗の大きさが得られます。実際の距離を取得するために実際に平方根を計算していないことに注意してください。余分な計算を避けるために、代わりに平方を比較しています。
また、これらの方法はどちらも完全ではなく、(オブジェクトが完全なボックスまたは球である場合を除き) ときどき誤った衝突検出が行われることにも注意してください。ただし、これは単純な実装と計算の複雑さのトレードオフです。それでも、衝突の検出を開始するには良い方法です。