2

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

在此处输入图像描述

我每架飞机都有四个点,有人可以帮我吗?

4

2 回答 2

2

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

p1p2和成为定义平面的 4 个点和p3计算为 的法线向量。平面方程为p4n=(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

于 2013-07-23T19:47:40.187 回答
1

我不能证明这已经足够了,但我相信这三个测试就足够了:

对于两架飞机...

  1. 将每个平面投影到 x 轴上,检查是否有任何重叠
  2. 将每个平面投影到 y 轴上,检查是否有任何重叠
  3. 将每个平面投影到 z 轴上,检查是否有任何重叠

如果这三种情况中的任何一种都没有重叠,则平面不会相交。否则,平面相交。

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

编辑1:

算法:您实际上不必进行投影,而只需找到最大范围即可。我们以 x 轴为例。您在平面 1 上找到最小 x 值,在平面 1 上找到最大 x 值。接下来,您在平​​面 2 上找到最小 x 值,在平面 2 上找到最大 x 值。如果它们的范围重叠(例如, [1 , 5] 与 [2 , 9] 重叠),然后与 x 轴上的投影重叠。请注意,如果平面段的边缘与 x 轴不平行,则查找 x 值的范围可能并不容易。如果您正在处理没有与轴平行的边缘的更复杂的平面段,那么我真的无能为力。您可能必须使用其他东西,例如矩阵。

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

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

编辑2:

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

于 2013-07-23T16:27:01.280 回答