Java OpenGL 3D碰撞

时间:2017-02-20 02:22:27

标签: java opengl 3d collision

一切都运行得很完美,但我无法找到实现碰撞的方法。

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

这是我使用hitbox网格物体碰撞的尝试,概述了真正的网格物体:

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;
    }

}

我宁愿没有一个hitbox系统,如果有另一种(工作)方式,请告诉我。

我的问题的例子。

enter image description here

1 个答案:

答案 0 :(得分:1)

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

  1. 将另一个对象的边界体积相交。这样您可以节省更多昂贵的计算。
  2. 如果是,则表明它是否与实际(碰撞)网格相交。
  3. 如果光线投射不够,您可以对实际网格或边界体积与网格进行交叉检查。这实现起来更昂贵且更复杂。但是,这里似乎有大量资源:Object/Object Intersection