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