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

我想做一个游戏,你是一个 3D 平面上的玩家,能够与周围的物体发生碰撞。我计划通过将游戏中的所有 3D 模型与无法进入的不可见矩形进行包装来进行碰撞。我已经编写代码来计算每个顶点的 X,Y 和 Z 的最小 / 最大值,以找到每个顶点的最高点和最低点。

我想做一个游戏,你是一个 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;
        }
    }
}
1

min,max的初始值应该是第一个非硬编码的顶点0,1000!!!

您会发现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

对于交集本身,你需要谷歌方程(我太懒了,无法为你推导或搜索它),但在这里首先谷歌打我发现:

line- intersection

是的,你可以使用三角形与线相交,因为你面对的是 2 个连接的三角形...还有另一种选择,那就是将线转换为另一个 bbox 的坐标系,然后计算每行的点,其中一个x,y,z=minmax,然后测试其他两个坐标是否在范围内。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(762)
无法在RailsWeb应用程序中播放.wav文件:RoutingError/404
上一篇
使用xaml在WPF应用程序(Windows11)中设置触摸虚拟键盘布局 /大小
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(78条)