我在实现窄相位碰撞检测时遇到了一些问题。 Broadphase工作得很好。
我有一组多边形,它们的顶点按顺时针顺序有一个stl :: vector数组点。每个周期,我都会检查它们是否发生碰撞。
我从here借用了多边形测试中的以下Point,并使用我的Point数据结构对其进行了更改:
int InsidePolygon(std::vector <Point> poly, Point p) {
int i, j, c = 0;
int nvert = poly.size();
for (i = 0, j = nvert-1; i < nvert; j = i++) {
if ( ((poly[i].y> p.y) != (poly[j].y> p.y)) && (p.x < (poly[j].x-poly[i].x) * (p.y-poly[i].y) / (poly[j].y-poly[i].y) + poly[i].x) )
c = !c;
}
return c;
}
我已将其扩展为包含一个PolygonPolygon函数,该函数检查1个多边形的所有点与另一个多边形,然后将其反转以检查相反的方式。
int PolygonPolygon(std::vector <Point> polygon1, std::vector <Point> polygon2) {
for(int i=0; i<polygon1.size();i++) {
if(InsidePolygon(polygon2, polygon1[i])) {
return 1;
}
}
for(int j=0; j<polygon2.size();j++) {
if(InsidePolygon(polygon1, polygon2[j])) {
return 1;
}
}
return 0;
}
奇怪的是我的PolygonPolygon函数总是返回1.所以我有几个问题:
我搞砸了某个地方的逻辑吗?我应该以不同的方式编写PolygonPolygon函数吗?
对于PolygonPolygon测试是否有更好的方法,多边形本身不保证是凸的,这就是我在多边形方法中寻找点的原因。我也希望确定哪一点最终会发生冲突,如果我能够超越这一点。
我应该按照InsidePolygon测试的特定顺序展示我的观点吗?
答案 0 :(得分:2)
您可能需要将trying to draw a line between polygons视为替代碰撞检测方法。
[edit] 哎呀,我错过了你也有非凸多边形的事实。也许“Determining if a point lies on the interior of a polygon”会更好吗?或者你可以先将非凸多边形破坏成凸多边形。
此外,StackOverflow上至少有one similar question。
答案 1 :(得分:-3)
感谢您的帮助!但我已经设法自己解决了。
将顶点平移到世界空间并旋转它们的重要性不应该被忽视,特别是如果你碰撞它们的话。