与kd树的交叉测试

时间:2018-06-04 19:28:53

标签: data-structures geometry raytracing

我目前对kd树的理解是;在每个节点上,我们将点分成两个同样大的组,用于一个轴。

我们遍历各个轴,直到树饱和。

这种数据结构当然对光线追踪应用很有意思,因为我们不必搜索每个三角形面来测试我们与光线的交点,我们只知道三角形可能在哪里会与我们的光线相交。

我对如何做到这一点有疑问。

我们如何处理奇怪的三角形,我们无法轻松拆分(与其他三角形或三角形相交的三角形跨越整个?

我们是否在三角形上拆分或者在顶点上拆分?

我们究竟如何测试从相机发出的光线的交叉点?

我看到了几种方法。首先,我们可以从场景和分割平面构建边界框并测试与这些框的交叉点,或者我们可以测试与分割平面的交点并查看交叉点相对于摄像机的位置

1 个答案:

答案 0 :(得分:1)

简短的回答是:这完全取决于您的申请。 kd-tree有几种变体。

我们如何处理奇怪的三角形,我们无法轻松拆分?

我相信你指的是给定一组三角形的分裂平面的选择。这是一个非常困难的优化问题,通常用启发式方法解决。例如,您可以沿一个轴对三角形的质心进行排序,并选择中值作为分割平面。没有什么能阻止你实施更智能的标准。

如果您发现分割平面穿过基元,则有两种选择。拆分原语或将其添加到两个子树。你应该做什么取决于你的申请。

我们甚至在三角形上分割还是在顶点上分割?

这取决于您要添加到树中的基元。如果您想使用树进行光线投射,那么在树中使用三角形是有意义的。 kd-tree是一个非常通用的概念,适用于任何类型的基元。例如,它们也被广泛用于点云。

我们究竟如何测试从相机发出的光线的交叉点?

您可以通过遍历树来完成此操作。因此,从根节点开始,检查光线是否与关联的边界框(整个空间)相交。然后检查两个子树中的哪一个首先与光线相交并继续到此。然后重复一遍:测试与节点的AABB(从分裂平面逐步构建)的交集。如果光线不与AABB相交,则立即返回父节点。如果是,继续第一个孩子。当你从第一个孩子回来时,去第二个孩子(除非你已经找到了一个十字路口)。

有关更多详细信息,我建议您查看特定于应用程序的kd-tree实例。