我正在用 lwjgl 用 java 编写游戏。基本上我有两个计划,我想检查它们是否相互交叉,如下图所示。
我每架飞机都有四个点,有人可以帮我吗?
如果两个平面平行(而不是同一平面),则它们不相交。
让p1
、p2
和成为定义平面的 4 个点和p3
计算为 的法线向量。平面方程为p4
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:
算法:您实际上不必进行投影,而只需找到最大范围即可。我们以 x 轴为例。您在平面 1 上找到最小 x 值,在平面 1 上找到最大 x 值。接下来,您在平面 2 上找到最小 x 值,在平面 2 上找到最大 x 值。如果它们的范围重叠(例如, [1 , 5] 与 [2 , 9] 重叠),然后与 x 轴上的投影重叠。请注意,如果平面段的边缘与 x 轴不平行,则查找 x 值的范围可能并不容易。如果您正在处理没有与轴平行的边缘的更复杂的平面段,那么我真的无能为力。您可能必须使用其他东西,例如矩阵。
顺便说一下,该测试称为分离轴测试。我认为 x、y 和 z 轴测试应该足以测试相交的平面段。
资料来源:(书籍)游戏物理引擎开发:如何为您的游戏构建强大的商业级物理引擎(第二版),作者:Ian Millington
编辑2:
实际上,您需要检查更多轴。