ポリゴンの変換
最初に、凸多角形 (この場合は正方形) のすべての点を変換して、 の回転を適用して、それらがすべて同じ空間にあるようにする必要がありangle
ます。
スケーリング、変換などの将来のサポートについては、マトリックス変換を使用してこれを行うことをお勧めします。独自のクラスをコーディングするMatrix
か、既にこの機能を備えたライブラリを見つける必要があります (オプションはたくさんあると思います)。
次に、無駄にコードを使用します。
var transform = new Matrix();
transform.appendRotation(alpha);
points = transform.transformPoints(points);
points
オブジェクトの配列などはどこにありPoint
ますか。
衝突アルゴリズムの概要
衝突の問題に取り掛かる前に、これですべてです。衝突アルゴリズムに関しては、次の手順を使用して 2 つの凸多角形 (この場合は正方形) を試して分離するのが標準的な方法です。
- 各ポリゴン エッジ (ポリゴン 0 とポリゴン 1 の両方のエッジ) について:
- 両方のポリゴンをエッジの「前」、「またがる」、または「後ろ」に分類します。
- 両方のポリゴンが異なる側にある場合 (1 つは「前」、もう 1 つは「後ろ」)、衝突は発生せず、アルゴリズムを停止できます (早期終了)。
- ここまで来ると、ポリゴンを分離できるエッジはありません: ポリゴンは交差/衝突します。
概念的には、「分離軸」は、ポリゴンを分類しているエッジに垂直な軸であることに注意してください。
エッジに関するポリゴンの分類
これを行うために、エッジに関してポリゴンのポイント/頂点を分類します。すべてのポイントが片側にある場合、ポリゴンはその側にあります。それ以外の場合、ポリゴンはエッジにまたがっています (部分的に片側、部分的に反対側)。
ポイントを分類するには、まずエッジの法線を取得する必要があります。
// this code assumes p0 and p1 are instances of some Vector3D class
var p0 = edge[0]; // first point of edge
var p1 = edge[1]; // second point of edge
var v = p1.subtract(p0);
var normal = new Vector3D(0, 0, 1).crossProduct(v);
normal.normalize();
上記のコードは、エッジ方向と z ベクトルの外積を使用して法線を取得します。もちろん、代わりにエッジごとにこれを事前に計算する必要があります。
注: 法線は、SAT からの分離軸を表します。
次に、最初にエッジを基準にして任意のポイントを分類し (エッジ ポイントを減算)、法線との内積を使用します。
// point is the point to classify as "in front" or "behind" the edge
var point = point.subtract(p0);
var distance = point.dotProduct(normal);
var inFront = distance >= 0;
現在、ポイントが前または端にある場合、またはinFront
そうでない場合は です。true
false
ポリゴンを分類するためにポリゴンのポイントをループする場合、前に少なくとも 1 つのポイントと後ろに 1 つのポイントがある場合は、早期に終了することもできます。または後ろ)。
ご覧のとおり、まだかなりの量のコーディングを行う必要があります。クラスなどを含むいくつかのjsライブラリを見つけて、それを使用して上記を実装しMatrix
ます。衝突形状 (ポリゴン) をおよびインスタンスVector3D
のシーケンスとして表現します。Point
Edge
うまくいけば、これで始められるでしょう。