如何使用X,Y和Z顶点的最小值/最大值计算矩形棱镜

时间:2016-11-10 20:05:20

标签: java opengl 3d lwjgl

我想制作一个游戏,你是3D平面上的玩家,能够与周围的物体发生碰撞。我计划通过在游戏中包装无法输入的不可见矩形来进行碰撞。我编写了代码来计算每个顶点的X,Y和Z的最小值/最大值,以找到每个顶点的最高点和最低点。我怎么把它变成矩形棱镜?

到目前为止,这是我的代码:

public CollisionModel(List<Vector3f> vert) {
    float xLow = 1000;
    float xHigh = 0;
    float yLow = 1000;
    float yHigh = 0;
    float zLow = 1000;
    float zHigh = 0;
    for(Vector3f v : vert) {
        if(v.x > xHigh) {
            xHigh = v.x;
        } else if(v.x < xLow) {
            xLow = v.x;
        }
        if(v.y > yHigh) {
            yHigh = v.y;
        } else if(v.y < yLow) {
            yLow = v.y;
        }
        if(v.z > zHigh) {
            zHigh = v.z;
        } else if(v.z < zLow) {
            zLow = v.z;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  1. min,max的初始值应该是第一个没有硬编码的顶点0,1000
  2. 您发现min,max为您提供边界框,这就是您所谓的棱镜。
  3. 现在您需要进行碰撞测试。问题是你的对象最有可能移动/旋转......所以你需要先将变换应用到你的盒子里。因此,首先构造边界框顶点。在 3D 中,它是8分:

    p0 = ( xLow  , yLow , zLow  )
    p1 = ( xHigh , yLow , zLow  )
    p2 = ( xHigh , yHigh, zLow  )
    p3 = ( xLow  , yHigh, zLow  )
    p4 = ( xLow  , yLow , zHigh )
    p5 = ( xHigh , yLow , zHigh )
    p6 = ( xHigh , yHigh, zHigh )
    p7 = ( xLow  , yHigh, zHigh )
    

    现在将对象transformations应用于每个对象。最后你需要添加碰撞测试。所以你很可能想测试2个边界框是否发生碰撞。为此,如果bbox1(q0..q7)的任何边线与bbox2(p0..p7)的任何面相交,则需要测试。面孔是:

    p0,p1,p2,p3
    p4,p5,p6,p7
    p0,p1,p5,p4
    p1,p2,p6,p5
    p2,p3,p7,p6
    p3,p0,p4,p7
    

    和边线是:

    q0,q1
    q1,q2
    q2,q3
    q3,q0
    q4,q5
    q5,q6
    q6,q7
    q7,q4
    q0,q4
    q1,q5
    q2,q6
    q3,q7
    

    对于交叉路口本身你需要谷歌方程式(我太懒了导出或搜索它)但在这里首先谷歌命中我发现:

    是的,您可以使用三角形与线交叉,因为您面对的是2个连接的三角形...还有另一个选项,即将线转换为另一个bbox的坐标系,然后计算每个线的位置之一x,y,z = minmax,然后测试其他两个坐标是否在范围内。