旋转命中框并在计算中检测该旋转

时间:2017-06-20 08:33:12

标签: java lwjgl

我正在制作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?

1 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题以及解决此问题的一种(或多种)方法:

解决它

SAT碰撞

SAT代表分离轴定理。 TutsPlusMetaSoftware是了解其工作原理以及如何实施的绝佳网站。

  

分离轴定理(简称SAT)基本上说明了如果能够绘制一条线来分隔两个多边形,那么它们就不会发生碰撞。就这么简单。 (gamedevelopment.tutsplus.com)

这是基本的想法:

enter image description here

它也可用于更复杂的形状: enter image description here

绕过它

AABB碰撞

这是通过假设碰撞只发生在X / Y轴上(从不在由任意线定义的轴上)来完成的。

以下是这样的示例: enter image description here

因此,您必须使用最小X和Y值以及原始框的最大X和Y值来定义此轴对齐的命中框。

圆形碰撞

这是一个更简单的碰撞检查,它只检测两个物体彼此在一定距离内的情况。

以下是这样的例子:
enter image description here

这种方法的工作方式是,如果两个物体之间的距离小于每个圆的半径之和,则物体会发生碰撞。

使用外部库