检测两个3d平面之间的碰撞

时间:2013-07-23 16:02:50

标签: java 3d lwjgl collision

我正在使用lwjgl在java中编写游戏。基本上我有两个计划,我想检查它们是否相互交叉,如下图所示。

enter image description here

我对每架飞机都有4分,有人可以帮助我。

2 个答案:

答案 0 :(得分:2)

如果两个平面平行(并且不是同一平面),则它们不相交。

p1p2p3p4成为定义平面的4个点,将n=(a,b,c)法线向量计算为n=cross(p2-p1, p3-p1) 。平面方程是

ax + by + cz + d = 0

其中d=-dot(n,p1)

你有2架飞机

ax + by + cz + d = 0
a’x + b’y + c’z + d’ = 0

它们是并行的(并且不相同)iff

a/a’ == b/b’ == c/c’ != d/d’

实现此谓词时,必须检查除以0

答案 1 :(得分:1)

我无法证明这已足够,但我相信这三项测试应该足够了:

两架飞机......

  1. 将每个平面投影到x轴上,检查是否有重叠
  2. 将每个平面投影到y轴上,检查是否有重叠
  3. 将每个平面投影到z轴上,检查是否有重叠
  4. 如果这三种情况中没有任何重叠,则平面不相交。除此以外, 飞机相交。

    如果您不确定如何投影到轴上或计算重叠,请告诉我。另外,如果这三项测试都不充分,请告诉我。

    编辑1:

    算法:您实际上不需要投射,而是可以找到最大范围。我们以x轴为例。您可以在平面1上找到最小x值,在平面1上找到最大x值。接下来,您可以找到平面2上的最小x值和平面2上的最大x值。如果它们的范围重叠(例如,[1, 5]与[2,9]重叠,然后与x轴上的投影重叠。请注意,如果平面线段的边缘与x轴不平行,则找到x值的范围可能并不容易。如果你正在处理没有与轴平行边缘的更复杂的平面线段,那么我就无法提供帮助。你可能不得不使用像矩阵这样的东西。

    顺便说一下,测试被称为分离轴测试。我认为x,y和z轴测试应足以测试相交的平面段。

    资料来源:(书)游戏物理引擎开发:如何为你的游戏构建一个强大的商业级物理引擎(第二版)作者:Ian Millington

    编辑2:

    实际上,你需要检查更多的轴。