【问题标题】:Java OpenGL 3D CollisionJava OpenGL 3D 碰撞
【发布时间】:2017-02-20 19:39:13
【问题描述】:

一切都运行得很完美,但我找不到任何方法来实现碰撞。

我已经制作了一个边界框碰撞系统,但是,我还需要一个完美的碰撞系统(基于每个顶点的碰撞)。

这是我使用碰撞框网格进行碰撞的尝试,它勾勒出真实网格的轮廓:

String[] faceName = entity.getHitboxFaces(); //Gets all the faces from the mesh******
Vector3f[] verts = entity.getHitboxVertices(); //Gets all the vertices******

//Compiles each cube into a list******

for (int i = 0; i < faceName.length;) {
    List < Vector3f > tmpVerts = new ArrayList < Vector3f > ();

    for (int z = 0; z < 6; z++) {
        String[] currentFace = faceName[i].split(",");
        tmpVerts.add(verts[Integer.parseInt(currentFace[0]) - 1]);
        tmpVerts.add(verts[Integer.parseInt(currentFace[1]) - 1]);
        tmpVerts.add(verts[Integer.parseInt(currentFace[2]) - 1]);
        tmpVerts.add(verts[Integer.parseInt(currentFace[3]) - 1]);
        i++;
    }

    xmin = 0;
    ymin = 0;
    zmin = 0;
    xmax = 0;
    ymax = 0;
    zmax = 0;
    //Gets the bounding boxes of each cube******
    for (Vector3f v: tmpVerts) {
        if (v.x < xmin) {
            xmin = v.x;
        }
        if (v.y < ymin) {
            ymin = v.y;
        }
        if (v.z < zmin) {
            zmin = v.z;
        }
        if (v.x > xmax) {
            xmax = v.x;
        }
        if (v.y > ymax) {
            ymax = v.y;
        }
        if (v.z > zmax) {
            zmax = v.z;
        }
    }
    //Scales it to the objects scale******
    xmin *= scale;
    ymin *= scale;
    zmin *= scale;
    xmax *= scale;
    ymax *= scale;
    zmax *= scale;
    //Checks if the point is in the cube******
    if (px >= xmin + (entity.getPosition().x) && px <= xmax + (entity.getPosition().x) && py >= ymin + (entity.getPosition().y) && py <= ymax + (entity.getPosition().y) && pz >= zmin + (entity.getPosition().z) && pz <= zmax + (entity.getPosition().z)) {
        hit = true;
    }

}

我宁愿没有碰撞箱系统,所以如果有其他(工作)方式,请告诉我。

我的问题示例。

【问题讨论】:

    标签: java opengl 3d collision


    【解决方案1】:

    通常,您要做的是创建模型的低多边形版本,称为碰撞网格(但您的模型似乎相当低多边形,因此它可能会按原样工作)。 然后,一种方法是使用ray casting。向你的角色发送一条(或多条)射线,看看他们是否先发

    1. 与另一个对象的包围体相交。这样您就可以节省更昂贵的计算。
    2. 如果是,您可以查看它是否与实际(碰撞)网格相交。

    如果光线投射还不够,您可以对实际网格或边界体积与网格进行相交检查。这更昂贵且实施起来更复杂。不过,这里似乎有大量资源:Object/Object Intersection

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多