【问题标题】:How to calculate a rectangular prism using min/max of X, Y, and Z vertices如何使用 X、Y 和 Z 顶点的最小值/最大值计算矩形棱柱
【发布时间】:2016-11-10 20:05:20
【问题描述】:

我想制作一款游戏,让你成为 3D 平面上的玩家,能够与周围的物体发生碰撞。我计划通过用无法输入的不可见矩形包裹游戏中的所有 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;
        }
    }
}

【问题讨论】:

  • 我想我对顶点的含义感到困惑。你谈论一个“顶点”,就像它可以有一个最高点和最低点一样。顶点本身不就是 3D 空间中的一个点吗?
  • 您还需要什么?只需使用八个 (x, y, z) 组合作为您的顶点。
  • 对不起,我不是很清楚,我试图通过遍历顶点数组来找到 3d 模型的最高和最低、最前和最后、左右顶点.我想如果我能找到这些点,我可以在模型本身周围创建一个矩形棱镜。

标签: java opengl 3d lwjgl


【解决方案1】:
  1. min,max的初始值应该是第一个没有硬编码的顶点0,1000!!!
  2. 你会发现min,max 给你边界框,这就是你所说的棱镜。

现在您需要进行碰撞测试。问题是你的对象很可能会移动/旋转......所以你需要先对你的盒子应用转换。所以让我们先构造边界框顶点。在 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 然后只测试其他两个坐标是否在范围内..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2010-10-04
    • 2014-11-20
    • 1970-01-01
    • 2015-10-29
    • 2015-05-13
    相关资源
    最近更新 更多