轉化多邊形
首先,你必須改變你的凸多邊形(在這種情況下,正方形)的所有點,使他們都在同一個空間,通過應用angle
的旋轉。
爲了將來對縮放,翻譯等的支持,我建議通過矩陣轉換來實現這一點。你必須編寫你自己的Matrix
類,或者找到一些已經具備此功能的庫(我確定有很多選項)。
然後你會的徒勞使用代碼:
var transform = new Matrix();
transform.appendRotation(alpha);
points = transform.transformPoints(points);
哪裏points
是Point
對象左右的數組。
碰撞算法概述
所以這就是你得到任何碰撞的東西全部之前。至於衝突算法,這是標準的做法,嘗試和分離2個凸多邊形使用以下步驟(你的情況正方形):
- 對於每個多邊形邊緣(包括多邊形0和多邊形1的邊緣):
- 將兩個polgyons分爲「前面」,「跨越」或「後面」邊緣。
- 如果兩個多邊形都在不同的側面(前面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
實例的序列。
希望這會讓你開始。
沒有機會嘗試這個,希望在未來幾周。 O和所有的矩陣轉換庫都很慢,盡我所知。希望我不必從頭開始寫。 –
有機會審查您的解決方案,它是完成實施的良好開端。對於那些想要使用它的人來說,還有很多事情要做。 –