衝突検出に分離軸定理を使用する Java で 2D ゲームを作成しようとしています。2 つのポリゴン間の衝突を解決するには、衝突の最小移動ベクトルを知る必要があり、ポリゴンに対してどの方向を指すかを知る必要があります (1 つのポリゴンにその方向に沿ってペナルティ フォースを与え、他の反対方向へのペナルティ力)。参考までに、ここでアルゴリズムを実装しようとしています。
collide(Polygon polygon1, Polygon polygon2)
衝突検出関数を呼び出して衝突が検出された場合、返される MTV は常にポリゴン 1 から離れてポリゴン 2 を指すことを保証したいと思います。これを行うには、生成する分離軸 (ポリゴン エッジの法線) が、生成元のポリゴンから常に離れていることを保証する必要があります。(そうすれば、MTV として使用する前に、polygon2 の軸を無効にすることができます)。
残念ながら、ポリゴンのエッジに対して生成する法線がポリゴンの内部または外部を指すかどうかは、ポリゴンのポイントが時計回りまたは反時計回りの順序で宣言されているかどうかに依存するようです。ここで説明するアルゴリズムを使用して法線を生成しています。「垂直」法を選択したと仮定すると(x, y) => (y, -x)
、頂点を時計回りに反復処理した場合にのみ、結果の法線がポリゴンから離れた方向を指します。
クライアントに多角形のポイントを時計回りに宣言させることはできないため (x 座標と y 座標の 2 つの配列を公開するだけの java.awt.Polygon を使用しています)、それを保証する数学的な方法はありますか?私が生成する法線ベクトルの方向は、ポリゴンの外側に向かっていますか? 私はベクトル計算が苦手なので、私が見逃している明らかな解決策があるかもしれません。SAT に関するほとんどのインターネット リソースでは、多角形の頂点を常に時計回りに反復できると想定しています。