雷三角交叉口

时间:2010-05-29 17:46:40

标签: intersection computational-geometry

如何测试光线和三角形,如果存在,如何获得光线原点到交点的距离? 我可以使用什么优化,如果在我的程序中我必须检查1射线到~10000三角形

2 个答案:

答案 0 :(得分:5)

单个多边形光线相交测试是微不足道的,只需要确保光线至少穿过它的一侧(单独检查)或跨越由它的两侧之间的三角形定义的平面。优化进入不检查光线完全没有机会穿越的多边形。根据您工作的维度有多高,区域有多大,以及您处理最常见优化的多边形数量为quadtreesoctrees和{{3} }。这也大致是实现难度的顺序(尽管四边形和八边形非常相似)。

答案 1 :(得分:1)

可能是我第一次需要实现它时,我查看了这些幻灯片,我发现这些幻灯片非常有用。

http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld016.htm

首先确保您了解它是如何工作的,然后您可以进行许多不同的优化。例如:

if (dot(V, N) >= 0)     // no intersection - ray points away from the triangle face
if (dot(P0, N) + d < 0) // no intersection - ray origin is behind the triangle face

我曾经想到的另一个想法是,一旦我找到了光线和脸部的交点。我曾经在2D中检查三角形内部的点,而我正在将轴归零,具有正常的最大绝对值...如果abs(N.x)&gt; abs(N.y)&gt; abs(N.z)我会在YZ飞机上进行检查。

我可以建议另一个简单的实现优化找到外接圆的中心和半径(很好地取决于你是否经常需要这样做,你可以选择像质心一样的缓动中心)。现在,此点和半径定义了三角形周围的边界球体。现在你可以做更快的射线球体剔除。

http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld012.htm

不要解决整个多项式,你不需要光线/球体的交点只检查现有的根。

您可以执行许多其他优化:例如,如果您的顶点和法线可以安排在更友好的SSE结构中,您可以一次执行4次检查。大概可以快2.5倍左右。

相关问题