Java/libGDX - 如何检查多边形与矩形或圆形的碰撞
Java/libGDX - how to check Polygon collision with Rectangle or Circle
我是 libGDX 的新手,据我所知,Intersector class 有 Rectangle/Rectangle、Circle/Circle、Circle/Rectangle 的重叠方法,和 Polygon/Polygon,但由于某种原因,它似乎没有任何方法来检查 Polygon/Rectangle 或 Polygon/Circle。
是否有推荐的方法来检查多边形与 rect/circle 之间的碰撞?
此外,是否有某些原因将其排除在交叉区域 class 之外? (即,我应该避免它吗?如果是这样,推荐的替代方案是什么?)
处理这些碰撞的最佳方法是使用像 Box2D 这样已经包含 Libgdx 的物理引擎。当 Box2D 中发生碰撞时,会触发一个事件,您可以轻松处理该事件。所以你应该看看 here。
当然还有其他处理碰撞检测的方法。只需一点点数学知识,您就可以自己弄清楚自己需要什么,而且 Box2D 还具有许多其他对您有益的功能。
我在没有 Box2D 的情况下实现这些检查的解决方案如下..
检查多边形和矩形之间的碰撞:
// Check if Polygon intersects Rectangle
private boolean isCollision(Polygon p, Rectangle r) {
Polygon rPoly = new Polygon(new float[] { 0, 0, r.width, 0, r.width,
r.height, 0, r.height });
rPoly.setPosition(r.x, r.y);
if (Intersector.overlapConvexPolygons(rPoly, p))
return true;
return false;
}
检查多边形和圆之间的碰撞:
// Check if Polygon intersects Circle
private boolean isCollision(Polygon p, Circle c) {
float[] vertices = p.getTransformedVertices();
Vector2 center = new Vector2(c.x, c.y);
float squareRadius = c.radius * c.radius;
for (int i = 0; i < vertices.length; i += 2) {
if (i == 0) {
if (Intersector.intersectSegmentCircle(new Vector2(
vertices[vertices.length - 2],
vertices[vertices.length - 1]), new Vector2(
vertices[i], vertices[i + 1]), center, squareRadius))
return true;
} else {
if (Intersector.intersectSegmentCircle(new Vector2(
vertices[i - 2], vertices[i - 1]), new Vector2(
vertices[i], vertices[i + 1]), center, squareRadius))
return true;
}
}
return false;
}
此处说明的 Poly/Circle 检查是由 Cristiano Santos 在 this thread 中编写的,Poly/Rect 检查是我想出的一个快速自制解决方案。
我是 libGDX 的新手,据我所知,Intersector class 有 Rectangle/Rectangle、Circle/Circle、Circle/Rectangle 的重叠方法,和 Polygon/Polygon,但由于某种原因,它似乎没有任何方法来检查 Polygon/Rectangle 或 Polygon/Circle。
是否有推荐的方法来检查多边形与 rect/circle 之间的碰撞?
此外,是否有某些原因将其排除在交叉区域 class 之外? (即,我应该避免它吗?如果是这样,推荐的替代方案是什么?)
处理这些碰撞的最佳方法是使用像 Box2D 这样已经包含 Libgdx 的物理引擎。当 Box2D 中发生碰撞时,会触发一个事件,您可以轻松处理该事件。所以你应该看看 here。
当然还有其他处理碰撞检测的方法。只需一点点数学知识,您就可以自己弄清楚自己需要什么,而且 Box2D 还具有许多其他对您有益的功能。
我在没有 Box2D 的情况下实现这些检查的解决方案如下..
检查多边形和矩形之间的碰撞:
// Check if Polygon intersects Rectangle
private boolean isCollision(Polygon p, Rectangle r) {
Polygon rPoly = new Polygon(new float[] { 0, 0, r.width, 0, r.width,
r.height, 0, r.height });
rPoly.setPosition(r.x, r.y);
if (Intersector.overlapConvexPolygons(rPoly, p))
return true;
return false;
}
检查多边形和圆之间的碰撞:
// Check if Polygon intersects Circle
private boolean isCollision(Polygon p, Circle c) {
float[] vertices = p.getTransformedVertices();
Vector2 center = new Vector2(c.x, c.y);
float squareRadius = c.radius * c.radius;
for (int i = 0; i < vertices.length; i += 2) {
if (i == 0) {
if (Intersector.intersectSegmentCircle(new Vector2(
vertices[vertices.length - 2],
vertices[vertices.length - 1]), new Vector2(
vertices[i], vertices[i + 1]), center, squareRadius))
return true;
} else {
if (Intersector.intersectSegmentCircle(new Vector2(
vertices[i - 2], vertices[i - 1]), new Vector2(
vertices[i], vertices[i + 1]), center, squareRadius))
return true;
}
}
return false;
}
此处说明的 Poly/Circle 检查是由 Cristiano Santos 在 this thread 中编写的,Poly/Rect 检查是我想出的一个快速自制解决方案。