成千上万的光线在3D空间中与三角形交叉

时间:2009-12-23 09:29:36

标签: algorithm math 3d space-partitioning

有数以千计的光线和三角形。我们需要得到所有的交叉点。如果我们使用正常的两级循环,我们需要O(m n)时间复杂度。有没有办法将时间复杂度从O(m n)降低到O(m * logn)或O (10gm的* N)?

最诚挚的问候,

6 个答案:

答案 0 :(得分:8)

您可能想要看的是某种空间分区技术。这允许您快速排除三角形集合。

我可能会考虑使用球形Bounding Volume Hierarchies的一些方法。但您可能还想查看的其他技巧包括BSP (Binary Space Partitioning) Trees / KD Trees或使用Octree

答案 1 :(得分:2)

没有。 原因很简单:实际上可能有O(m * n)个交点。只是创建它们的列表是O(n * m)。

答案 2 :(得分:2)

此问题的经典解决方案是基于三角形构建KD树,并针对每条光线进行查询。您可以根据预期的查询优化树;如果您的光线是随机分布的,则命中的概率与所讨论的表面积成正比。

即使您实际上没有进行光线跟踪,这个问题目前是光线跟踪的主要性能瓶颈,所以您应该查看相关文献。

答案 3 :(得分:0)

在2D中有SweepLine算法。在我看来,它可以推广为3D。

答案 4 :(得分:0)

您可以将多边形中的三角形分组。然后对于每条射线:如果它没有击中立方体,你确定它没有击中立方体内的一个三角形,所以你可以跳过所有这些特定射线的三角形的交叉计算。

答案 5 :(得分:0)

显然,如果必须迭代并计算光线与每个三角形之间的交点,则复杂度为O(mn)。 但是,如果您只对那些可能与特定光线相交的三角形感兴趣,则可以尝试使用空间分区网格的变体,例如分层四叉树网格(http://graphics.stanford.edu/courses/cs468-06-fall/Slides/steve.pdf)。