我想制作一个游戏,你是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;
}
}
}
答案 0 :(得分: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
对于交叉路口本身你需要谷歌方程式(我太懒了导出或搜索它)但在这里首先谷歌命中我发现:
是的,您可以使用三角形与线交叉,因为您面对的是2个连接的三角形...还有另一个选项,即将线转换为另一个bbox的坐标系,然后计算每个线的位置之一x,y,z
= min
和max
,然后测试其他两个坐标是否在范围内。