2

私はプロジェクトの衝突検出コードに取り組んでおり、オブジェクト間の衝突を検出するために使用する方法を理解しようとしています。楕円体を使用してレベルジオメトリをテストしているので、オブジェクト間の衝突にも楕円体を使用したいと思います。問題は、正確な方法を理解することです。私が見た1つの方法は、楕円体を球体と軸に沿った楕円体に変換します。これは優れたソリューションのように見えますが、この方法では、固有ベクトルや、私が(まだ)理解しておらず、むしろ理解していないその他の高度なものを見つける必要があります。実装する必要があります。

一連のアフィン変換を適用することで、楕円体を球体と傾斜した楕円体に簡単に変換できるはずです。傾斜した楕円はまだ楕円形であるため、傾斜は回転とスケーリングに相当し、同じ原理が楕円体にも当てはまると思います。ただし、新しい楕円の回転と軸の長さを決定する方法がわかりません。それを知っていれば、楕円体を軸に揃えるのは簡単でしょう。その後、スイープテストを実行できるようにしたいと思っていますが、どれだけ効率的に実行できるかわかりません。また、使用する方程式をまだ理解していません。ちょっとした仕事。

楕円体が機能しない場合は、他の衝突形状を使用することも検討していますが、オブジェクトとオブジェクトの衝突に同じ形状を使用できると非常に便利です。

4

2 に答える 2

1

そうです、それは複雑です。

楕円体の連続衝突検出への代数的アプローチというタイトルの論文があります

このサイトから、アルゴリズムを数学的に説明する別の論文(アーカイブ)があります。

Matlabスクリプト2つの楕円体が接触していますか?、前述の論文を参照しています。

于 2013-03-29T07:28:41.410 に答える
1

免責事項:この方法は、特定の状況では機能しません。私は自分の答えを投稿した後にこれを見つけました。ただし、結果は単純なユースケースには十分である可能性があるため、この回答をここに残します。

次の画像に示すように、この場合、私のメソッドはfalseを返します。

ここに画像の説明を入力してください

元の回答:

私はこの質問を何度も見ましたが、非常に簡単な解決策を思いつくことができました。

2つの球の間の衝突をチェックするには、通常、それらの半径を使用して、2つの球の間の距離よりも小さいかどうかを確認します。

楕円体を使用すると、同じことを試みることができます。ただし、半径は楕円体全体で異なります。しかし、これはかなり簡単に達成できます。半径を取得する方向を知る必要があります。

float EllipsoidRadius(VECTOR ellipsoidRadius, VECTOR direction)
{
    direction /= ellipsoidRadius;
    normalize(direction);
    return length(direction * ellipsoidRadius);
    // The * is just a multiplication
}

方向はわかっています。これは、楕円体の1つの位置から他の楕円体の位置を引いたものです。この方向を使用して、両方の楕円体の半径を取得できます。これは、半径が常に反対側で等しいためです(軸が整列した楕円体がある場合)。

bool EllipsoidIntersects(POINT positionA, VECTOR sizeA, POINT positionB, VECTOR sizeB)
{
    VECTOR direction = positionA - positionB;
    float distance = length(direction);

    float radiusA = EllipsoidRadius(sizeA, direction);
    float radiusB = EllipsoidRadius(sizeB, direction);

    return distance < radiusA + radiusB;
}

2つの楕円体の半径がわかったので、古き良き球の衝突チェックを使用して、それらが衝突するかどうかを確認できます。

于 2017-03-27T12:29:54.877 に答える