如何知道线段是否与 3d 空间中的三角形相交?

Joe*_*ool 1 c++ math 3d polygon

我有一个由 3d 空间中的 3 个点定义的三角形。我还有一个由 3d 空间中的 2 个点定义的线段。我想知道它们是否相交。我真的不需要知道交点。

我不会任何微积分,但我知道一些三角函数。我对矩阵有一些了解,但我很了解向量(特别是 3d 向量)。请保持简单。

你能带我完成示例问题吗:

三角形:

一:-4, 3, 0

b: 4, 3, 0

c: -3, -5, 4

线段:

d: 1, -2, 0

e: -2, 6, 2

编辑:

我将在 c++ 物理引擎中使用它。

一个答案涉及从 4 个顶点计算四面体体积。请提供公式或在代码中显示。

更新:

正如 meowgoesthedog 指出的那样,我可以尝试使用Moller-Trumbore交叉算法。有关替代解决方案,请参阅下面的答案。

Jos*_*rke 5

这是解决您的问题的一种方法。计算四面体的体积 Td = (a,b,c,d) 和 Te = (a,b,c,e)。如果 Td 或 Te 的体积任一为零,则线段 de 的一个端点位于包含三角形 (a,b,c) 的平面上。如果 Td 和 Te 的体积符号相同,则 de 严格偏向一侧,不存在交集。如果 Td 和 Te 的符号相反,则 de 穿过包含 (a,b,c) 的平面。

从那里有几种策略。一种是计算 de 与该平面相交的点 p。然后向下投影到 2D,并解决 2D 中的三角形点问题。

另一种方法是计算四面体 (a,b,d,e)、(b,c,d,e) 和 (c,a,d,e) 的体积。那么只有当所有三个具有相同的符号时,de 才与三角形 (a,b,c) 相交。

如何从四面体的角坐标计算四面体的体积遍布网络,也在C中的计算几何中