【问题标题】:Intersection test with kd-tree与 kd-tree 的交集测试
【发布时间】:2018-06-04 19:28:52
【问题描述】:

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

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

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


我对这是如何完成的有一些疑问。

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

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

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

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

【问题讨论】:

  • 我会在不同的帖子上询问您的每个问题(显然,这些问题可能没有微不足道的解决方案)。此外,这个问题最好在cs.stackexchange.com 上提出。
  • @nbro 你会这么好心并提供一个链接,当我在谷歌中输入“intersection test kd tree”时,这篇文章是最好的结果,其次请不要再编辑这篇文章,你是只是让它更难读,第三,因为这些问题都与与 kd 树的交叉测试的高度具体的主题有关我不认为用三个问题淹没询问队列会是有益的

标签: data-structures geometry raytracing


【解决方案1】:

简短的回答是:这完全取决于您的应用程序。 kd-trees 有多种变体。

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

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

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

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

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

我们如何准确地测试我们从相机发出的光线的交点?

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

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

【讨论】:

  • 有道理,接受!如果这是您的研究领域,您可以参考任何“简单”的光线追踪降噪吗?
  • 去噪是什么意思?光线追踪通常不会产生明显的噪点。
  • 我认为它的采样率非常低(
  • 您可能指的是路径跟踪。每个像素的多个样本在光线追踪中为您提供的是抗锯齿。我手头没有任何文献,但前几个谷歌结果看起来很有希望(你可能已经找到了):1、2。此外,如果您想查看 kd-tree 的运行情况,请查看 Mitsuba。
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 2011-03-22
  • 2021-10-10
  • 2015-11-20
  • 2011-04-03
  • 2015-09-16
  • 2015-10-15
  • 2015-02-05
相关资源
最近更新 更多