這有點複雜:AutoPolygon給你一堆三角形 - PhysicsBody :: createPolygon需要一個凸多邊形順時針纏繞...所以這些是兩個不同的東西。頂點數甚至可能是有限的。我認爲Box2d對於1多邊形的最大數量是8.
如果您想嘗試此操作,則必須合併三角形以形成多邊形。一個選項可以是從一個三角形開始,只要整個事物保持凸起就可以增加更多。如果不能添加更多的三角形,請重新開始一個新的多邊形。將所有多邊形作爲PhysicsShapes添加到物理主體以形成一個複合對象。
我建議,因爲
- Autopolygon被渲染優化你不走這條道路 - 不是最適合的 物理學 - 這是有區別的。自動多邊形跟蹤的多邊形將始終比原始精靈大 - 否則,您會看到渲染僞像。
- 你必須接近對生成多邊形
- 跟蹤形狀在應用程序中沒有控制會增加你的啓動時間
- 三角網格和物理輪廓是2件不同的事情
我會嘗試一些不同方法:離線生成碰撞形狀。這給你一堆優勢:
- 你可以在可視化編輯器中生成和調整多邊形,例如,通過使用PhysicsEditor
- 加載的準備多邊形的方式更快
- 您可以設置類似質量等其他參數
- 的解決方案是戰鬥證明和開箱
,但如果你想知道多邊形如何相交。你可以看看這段代碼。
// Calculate the projection of a polygon on an axis
// and returns it as a [min, max] interval
public void ProjectPolygon(Vector axis, Polygon polygon, ref float min, ref float max) {
// To project a point on an axis use the dot product
float dotProduct = axis.DotProduct(polygon.Points[0]);
min = dotProduct;
max = dotProduct;
for (int i = 0; i < polygon.Points.Count; i++) {
flaot d = polygon.Points[i].DotProduct(axis);
if (d < min) {
min = dotProduct;
} else {
if (dotProduct> max) {
max = dotProduct;
}
}
}
}
// Calculate the distance between [minA, maxA] and [minB, maxB]
// The distance will be negative if the intervals overlap
public float IntervalDistance(float minA, float maxA, float minB, float maxB) {
if (minA < minB) {
return minB - maxA;
} else {
return minA - maxB;
}
}
// Check if polygon A is going to collide with polygon B.
public boolean PolygonCollision(Polygon polygonA, Polygon polygonB) {
boolean result = true;
int edgeCountA = polygonA.Edges.Count;
int edgeCountB = polygonB.Edges.Count;
float minIntervalDistance = float.PositiveInfinity;
Vector edge;
// Loop through all the edges of both polygons
for (int edgeIndex = 0; edgeIndex < edgeCountA + edgeCountB; edgeIndex++) {
if (edgeIndex < edgeCountA) {
edge = polygonA.Edges[edgeIndex];
} else {
edge = polygonB.Edges[edgeIndex - edgeCountA];
}
// ===== Find if the polygons are currently intersecting =====
// Find the axis perpendicular to the current edge
Vector axis = new Vector(-edge.Y, edge.X);
axis.Normalize();
// Find the projection of the polygon on the current axis
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);
// Check if the polygon projections are currentlty intersecting
if (IntervalDistance(minA, maxA, minB, maxB) > 0)
result = false;
return result;
}
}
該功能可以採用這種方式
boolean result = PolygonCollision(polygonA, polygonB);
據我所知,現在是不可能的。我在論壇上看過一些他們想要在AutoPolygons之間添加碰撞檢測的地方。現在我想你必須使用物理。 – Makalele