如何确定 3-D 射线穿过的第一个三角形(一组三角形中)?

Posted

技术标签:

【中文标题】如何确定 3-D 射线穿过的第一个三角形(一组三角形中)?【英文标题】:How to determine the first triangle (out of a set of triangles) passed through by a 3-D ray? 【发布时间】:2021-11-22 17:17:45 【问题描述】:

我正在尝试在 Python 中解决以下问题。当我使用有限元方法时,问题来自图像处理问题。

在我的问题中,我有一组三角形和一条射线。每个三角形由三个 3-D 点组成,射线是 3-D 点和 3-D 矢量的形式。如何确定光线穿过的第一个三角形?现在我什至没有这个算法。任何意见将不胜感激。

【问题讨论】:

这不是一个数学问题而不是一个编码问题吗?基本上,您需要做的就是计算矢量与三角形跨越的二维平面相交的位置。建议你去数学论坛问问。一旦你知道该做什么,实施应该不会太难。 不确定你的输入和输出是什么,但这个问题听起来像是光线追踪/光线投射的基本概念,所以也许你想阅读更多关于光线跟踪/投射的信息,你甚至可以制作使用现有的图形软件/硬件为您完成。 【参考方案1】:

我要做的第一件事是平移整个数据集,减去 3D 射线原点。然后旋转数据集,使射线的 3D 矢量与 X 轴对齐。见How to find the orthonormal transformation that will rotate a vector to the x axis?。

现在问题已转换为过滤与 X 轴交叉且 X 坐标为非负的三角形,并在其中找到交叉点具有最小 X 坐标的三角形。所以

对于每个三角形,检查其 平面 与 X 轴相交的位置。见Determine point of interesction of plane with axis given points of plane

然后扔掉交叉点(在 X 轴上)不在三角形边界内的三角形(检查三个边中的每一个,该点是否位于它的“内侧”侧)。见Check whether a point is within a 3D Triangle

丢弃交叉点具有负 X 坐标的三角形。

在剩余的三角形中(真正与 X 轴相交的正侧)中,找到与 X 坐标相交点最小的三角形。

【讨论】:

以上是关于如何确定 3-D 射线穿过的第一个三角形(一组三角形中)?的主要内容,如果未能解决你的问题,请参考以下文章

我的射线三角交点代码是不是正确?

3D空间中射线与轴向包围盒AABB的交叉检测算法转

三维空间判断线与三角形相交

1249 三角形 简单递推 / 数论

如何确定一个点是不是在二维三角形中? [关闭]

OpenGL 3D拾取文章(转)