LWJGL Java 碰撞

LWJGL Java collision

我正在尝试制作 3D 游戏,但遇到碰撞时遇到了困难。我在一个系统上工作过,但它并不是很好。我已经有一个与地形碰撞的系统,但它不能用于与实体碰撞(因为地形只有高度可以与之碰撞)。我正在使用搅拌机模型,它们由三角形组成。 100% 准确的碰撞将对每个三角形使用某种形式的碰撞检测,但有太多三角形,因此游戏将失去它的性能。大多数代码都基于 YouTube 上的 ThinMatrix 教程,除了一些我自己创建的代码。这是我用于当前碰撞的一些代码:

public boolean collision(Entity e1, Entity e2){


    if(e1.getPosition().x >= e2.getPosition().x && e1.getPosition().x < e2.getPosition().x + e2.getWidth()){
        if(e1.getPosition().z >= e2.getPosition().z && e1.getPosition().z < e2.getPosition().z + e2.getWidth()){
            System.out.println("XXX||&&&||ZZZ");
            return true;
        }
    }

    return false;


}

此方法为碰撞法。它基于 X 和 Z 位置,因此非常不准确。在播放器-class中,我称之为:

    public void tick(){
        for(Entity e : entities){
            if(super.collsion(this, e)){
                I haven't gotten to this
            }

        }
    }

这个系统有效,但它有很多问题,其中之一就是它不准确。

编辑: 我一直致力于使用一个新的矢量(我制作的),我称之为 Vector6f。使用多个值,应该更容易存储和获取值。它采用参数 x、y、z、xwidth、zwidth、height。 有了这些,我创建了一个名为 getBounds 的新方法,returns 实体边界。如果实体没有边界,则不会发生碰撞

您可以轻松地将 Y 值带入检查中,以使其更精确一些。虽然,这只是在对象周围创建了一个 3d 边界框,而不是可能应该使用的 3d 凸包。这是一些接近 java 的伪代码,其中 lX - length in X axishlX - half length in X axis,考虑到我们使用实体的中心点来定义它们的位置。

boolean isColliding(Entity other) {
if (center.y + hlY < other.center.y - other.hlY ||
    center.y - hlY > other.center.y + other.hlY)
    return false;

Rectangle r1 = { center.x - hlX, center.z - hlZ, lX, lZ };
Rectangle r2 = { other.center.x - other.hlX, other.center.z - other.hlZ, other.lX, other.lZ };

return r1.intersects(r2);
}

关于碰撞的更新标记:

    for (int i = 0; i < collidables.size(); i++) {
        Entity e1 = collidables.get(i);

        for (int j = i + 1; j < collidables.size(); j++) {
            Entity e2 = collidables.get(j);

            if (e1.isColliding(e2)) {
                CollisionHandler handler = ... // get handler if registered for type of e1 vs type of e2
                if (handler != null)
                    handler.onCollision(e1, e2);
            }
        }
    }

这给你 n * (n - 1) / 2 个循环,其中 n - 可碰撞实体的数量