Algorithm 如何在k-d树中不使用蛮力找到最优分割窗格

Algorithm 如何在k-d树中不使用蛮力找到最优分割窗格,algorithm,optimization,raytracing,kdtree,Algorithm,Optimization,Raytracing,Kdtree,我在光线跟踪器中使用k-d树进行空间分区。在确定在何处分割给定矩形区域时,我选择区域大小最长的维度,然后通过检查沿该维度相交图元的轴对齐边界框的所有边界来查找最佳分割窗格。对于复杂场景,这需要进行大量检查。有没有办法缩小最佳分割窗格的搜索范围,这样就不必检查所有可能的位置,但仍然可以得到最佳窗格 根据以下公式,我通过查找具有最低值的窗格来确定最佳窗格: TRAVERSE_COST + INTERSECT_COST * ((l_area/area * l_count) + (r_area/area

我在光线跟踪器中使用k-d树进行空间分区。在确定在何处分割给定矩形区域时,我选择区域大小最长的维度,然后通过检查沿该维度相交图元的轴对齐边界框的所有边界来查找最佳分割窗格。对于复杂场景,这需要进行大量检查。有没有办法缩小最佳分割窗格的搜索范围,这样就不必检查所有可能的位置,但仍然可以得到最佳窗格

根据以下公式,我通过查找具有最低值的窗格来确定最佳窗格:

TRAVERSE_COST + INTERSECT_COST * ((l_area/area * l_count) + (r_area/area * r_count))
其中,area是被分割矩形区域的表面积,l_area和r_area是通过在给定位置分割当前区域而产生的左右区域的表面积,l_count和r_count是左右子区域将包含的基元数。与拆分窗格相交的图元被视为包含在两个子区域中,因此l_count+r_count可能大于当前区域中图元的数量TRAVERSE_COST和INTERSECT_COST只是通过测试不同值确定的常量。这种方法似乎很有效


我的实现基于Ingo Wald撰写的一篇名为“实时光线跟踪和交互式全局照明”的论文,他在论文中指出,最佳分割窗格位于区域中心和对象中间带之间,但我自己的测试表明,具有上述算法的最低值的窗格通常会超出此范围,即使我将对象中值解释为中值基本体的AABB的整个范围。这可能是由于在实现上存在许多差异,因为我只使用了纸张来实现k-d树的构建和遍历,而不是光线跟踪器的其余部分。

可能您已经在这样做了,但如果没有,这里有一个想法:对于每个矩形区域,保留3个AABB相对面对的排序列表,每个维度一个列表。对于您选择的任何维度,您都可以扫描该维度的已排序面对列表,将每个面对视为一个可能的拆分窗格。您可以快速计算每个窗格在运行时分割的AABB数-这只是您尚未看到匹配的右AABB面的左AABB面数。为2个结果子区域生成3个列表也是线性时间。是的,我已经对原语进行了排序,使计算计数变得很简单,不过还是要谢谢你。