一、介紹
? ? ? ?分離軸算法(簡稱SAT)通常用于檢查兩個(gè)簡單多邊形(凸邊形)之間或多邊形與圓之間的碰撞。本質(zhì)上,如果您能夠繪制一條線來分隔兩個(gè)多邊形,則它們不會(huì)發(fā)生碰撞,如果找不到一條線來分割兩個(gè)多邊形,則它們發(fā)生碰撞。
如圖:
?
? ? ? ? 具體做法是遍歷兩個(gè)多邊形的所有邊,求得每條邊的法向軸,再求出每個(gè)多邊形在法向軸上的投影,求出投影的最大值點(diǎn)和最小值點(diǎn),通過比較兩個(gè)多邊形的最值點(diǎn)的關(guān)系得出是否碰撞。
演示:
?
?
?
?
?
?運(yùn)行代碼:
獲取在法向軸上投影的函數(shù):
public void ProjectPolygon(Vector2 axis, Polygon polygon, ref float min, ref float max)
{
//要在軸上投影一個(gè)點(diǎn),使用點(diǎn)積
float dotProduct = Vector2.Dot(axis, polygon.Points[0]);
min = dotProduct;
max = dotProduct;
for (int i = 0; i < polygon.Points.Count; i++)
{
dotProduct = Vector2.Dot(polygon.Points[i], axis);
if (dotProduct < min)
{
min = dotProduct;
}
else
{
if (dotProduct > max)
{
max = dotProduct;
}
}
}
}
?判斷是否相交函數(shù):、
public float IntervalDistance(float minA, float maxA, float minB, float maxB)
{
if (minA < minB)
{
return minB - maxA;
}
else
{
return minA - maxB;
}
}
檢測函數(shù):
public bool CollisionDetection(Polygon polygonA, Polygon polygonB)
{
int edgeCountA = polygonA.Edges.Count;
int edgeCountB = polygonB.Edges.Count;
Vector2 edge;
// 循環(huán)遍歷兩個(gè)多邊形的所有邊
for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++)
{
if (edgeIndex < edgeCountA)
{
edge = polygonA.Edges[edgeIndex];
}
else
{
edge = polygonB.Edges[edgeIndex - edgeCountA];
}
//查找多邊形當(dāng)前是否相交
// 找出垂直于當(dāng)前邊的軸
Vector2 axis = new Vector2(-edge.y, edge.x);
axis.Normalize();
// 求多邊形在當(dāng)前軸上的投影
float minA = 0; float minB = 0; float maxA = 0; float maxB = 0;
ProjectPolygon(axis, polygonA, ref minA, ref maxA);
ProjectPolygon(axis, polygonB, ref minB, ref maxB);
// 檢查多邊形投影當(dāng)前是否相交
if (IntervalDistance(minA, maxA, minB, maxB) > 0)
return false;
}
return true;
}
結(jié)果演示:
碰撞檢測算法-分離軸算法
參考鏈接:
https://code.tutsplus.com/collision-detection-using-the-separating-axis-theorem--gamedev-169t
How 2D Game Collision Works (Separating Axis Theorem) - YouTube文章來源:http://www.zghlxwxcb.cn/news/detail-764576.html
Collision Detection with SAT (Math for Game Developers) - YouTube文章來源地址http://www.zghlxwxcb.cn/news/detail-764576.html
到了這里,關(guān)于碰撞檢測算法——分離軸算法在Unity中實(shí)現(xiàn)(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!