java - LWJGL Java 碰撞

标签 java opengl 3d lwjgl

我正在尝试制作 3D 游戏,但我在碰撞方面遇到了困难。我曾经开发过一个系统,但它并不是很好。我已经有一个与地形碰撞的系统,但它不能用于与实体碰撞(因为地形只有高度可以碰撞)。我正在使用 blender 模型,它们由三角形组成。 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 位置,因此非常不准确。在玩家级,我称之为:

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

        }
    }

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

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

最佳答案

您可以轻松地将 Y 值带入检查中,以使其更加精确。尽管如此,这只是在对象周围创建了一个 3D 边界框,而不是可能应该使用的 3D 凸包。这是一些接近java的伪代码,其中lX - X轴长度hlX - X轴一半长度 ,考虑到我们使用实体的中心点来定义它们的位置。

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 - 可碰撞实体的数量

关于java - LWJGL Java 碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31500625/

相关文章:

c# - Silverlight 真的不支持 OpenGL 吗?

java - OpenGL 3 (LWJGL) LookAt 矩阵混淆

c++ - 在框架上获得所有不同颜色的最快方法?

r - 在R中绘制多个不同尺寸和坐标的3D框

java - 从字符串数组中获取特定部分

java - 如何使用onSavedInstance?

3d - 如何计算点云中点的平均距离

c++ - 计算 gluLookAt、glOrtho 和 glFrustum

java - 使用 JLabel 绘制 JPanel 渐变背景时出现问题

java - 帮助 Web 服务 vector Java Glassfish