3

JavaScript の分離軸定理を使用して、衝突する 2 つの正方形 (1 つは回転し、もう 1 つは回転していない) を検出しようとしています。どんなに頑張っても、これが JavaScript でどのように見えるかわかりませんし、JavaScript の例も見つかりません。助けてください。単純な数字または JavaScript コードによる説明が最も役立ちます。


更新: 多くの幾何学と数学の理論を調査した後、GitHub リポジトリで単純化された SAT 実装を展開することにしました。JavaScript の SAT の作業用コピーは、https ://github.com/ashblue/canvas-sat にあります。

4

1 に答える 1

4

ポリゴンの変換

最初に、凸多角形 (この場合は正方形) のすべての点を変換して、 の回転を適用して、それらがすべて同じ空間にあるようにする必要があり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そうでない場合は です。truefalse

ポリゴンを分類するためにポリゴンのポイントをループする場合、前に少なくとも 1 つのポイントと後ろに 1 つのポイントがある場合は、早期に終了することもできます。または後ろ)。

ご覧のとおり、まだかなりの量のコーディングを行う必要があります。クラスなどを含むいくつかのjsライブラリを見つけて、それを使用して上記を実装しMatrixます。衝突形状 (ポリゴン) をおよびインスタンスVector3Dのシーケンスとして表現します。PointEdge

うまくいけば、これで始められるでしょう。

于 2012-05-01T17:34:51.763 に答える