我正在制作3D Java游戏,但是在旋转命中箱时我遇到了问题。在这一点上,我只使用了一种检测Vector3f是否在框中的方法。
但是在我的游戏中,我想要旋转房屋,以便这种方法不会起作用。我可以使用circulair hitboxes,但这对每个对象都不起作用。
到目前为止,我已经使用这个简单的计算来检测位置是否在命中框中。
public boolean isinbox(Vector3f pos) {
Vector3f entPos = ent.getPosition();
float x1 = entPos.x + xOffset;
float z1 = entPos.z + zOffset;
float y1 = entPos.y + yOffset;
float x2 = entPos.x - xOffset;
float z2 = entPos.z - zOffset;
float y2 = entPos.y;
return pos.x < x1 && pos.x > x2 && pos.z < z1 && pos.z > z2 && pos.y > y2 && pos.y < y1;
}
这在很多方面都有效,但我无法弄清楚如何旋转它们仍然能够检测到它。 xOffset是中心的a侧和中间的负侧b。
如何旋转命中箱并检测其中是否包含Vector?
答案 0 :(得分:2)
有几种方法可以解决这个问题以及解决此问题的一种(或多种)方法:
SAT代表分离轴定理。 TutsPlus和MetaSoftware是了解其工作原理以及如何实施的绝佳网站。
分离轴定理(简称SAT)基本上说明了如果能够绘制一条线来分隔两个多边形,那么它们就不会发生碰撞。就这么简单。 (gamedevelopment.tutsplus.com)
这是基本的想法:
这是通过假设碰撞只发生在X / Y轴上(从不在由任意线定义的轴上)来完成的。
以下是这样的示例:
因此,您必须使用最小X和Y值以及原始框的最大X和Y值来定义此轴对齐的命中框。
这是一个更简单的碰撞检查,它只检测两个物体彼此在一定距离内的情况。
以下是这样的例子:
这种方法的工作方式是,如果两个物体之间的距离小于每个圆的半径之和,则物体会发生碰撞。