想象一个巨大的 3D 网格(程序定义,并且可能是无限的;至少,每边 10^6 个坐标)。在每个网格坐标处,都有一个图元(例如,球体、盒子或其他一些简单的、易于数学定义的函数)。
我需要一种算法来与网格的元素相交,原点在网格之外,方向进入它。即,光线可能穿过这个巨大的网格的一半,然后击中一个图元。由于网格的范围,迭代方法 [编辑:(如光线行进)] 的速度慢得令人无法接受。我需要的是一些封闭形式的[编辑:常数时间]解决方案来寻找原始命中。
我想到的一种可能的方法是确定光线在每个时间步向基元收敛的量,这些坐标围绕在 x、y 和 z 中的每个模算术空间中的网格单元周围的八个坐标中的每个坐标上,然后除以由光线的方向,并采取最小的距离。除了直觉,我没有其他证据认为这可能有效,而谷歌也无济于事;“与网格相交”是指与网格的面相交。
笔记:
- 我真的只关心基元的表面法线(我可以很容易地找到相交的距离,但我不关心距离本身)。
- 在这一点上,相交的基元类型并不重要。理想情况下,它将是一个盒子。第二个选择,球体。但是,我假设使用的任何算法都可以推广到其他原语,并且如果最坏的情况出现在最坏的情况下,无论如何对于这个应用程序来说并不重要。
谢谢,
伊恩