什么是kd树相交逻辑?


12

我试图弄清楚如何实现KD树。

Ericson的“实时冲突检测”的第322页上

如果Google图书预览在您单击链接时看不到它,则下面包含文本部分

文字部分

相关部分:

将光线或直线段与kd树相交的基本原理很简单。将该线与节点的分割平面相交,并计算相交的t值。如果t在直线的区间内,即0 <= t <= tmax,则直线横跨平面,并且树的两个子级都递归下降。如果不是,则仅递归访问包含片段原点的一侧。

所以这就是我所拥有的:(如果看不到字母,请在新标签页中打开图像

图片

逻辑树

股利

在这里,橙色射线穿过3d场景。x代表与平面的交点。从左侧,射线击中:

  • 场景的封闭立方体的正面,
  • (1)分裂平面
  • (2.2)分割平面
  • 场景的封闭立方体的右侧

但是,天真地遵循了上面的Ericson的基本描述,这就是会发生的事情:

  • 针对分裂平面(1)进行测试。射线束照射到分裂平面(1),因此下一个测试中将包含分裂平面(1)的左右子级。
  • 针对分裂平面(2.1)进行测试。雷实际上击中了那架飞机(向右偏),所以两个孩子都被包括在下一级别的测试中。(这是违反直觉的-在后续测试中不应仅包括底部节点)

有人可以描述橙色光线正确穿过场景时会发生什么吗?

Answers:


14

真的很简单;由于以下原因,针对分裂平面(2.1)的测试应失败:

当射线照射到分割平面(1)时,您“分割了射线”,或者;您设置了t有效的-range,然后继续生成结果的树。

因此,在相对于平面(2.1)进行检查时,应检查是否只有平面(1)左侧的光线与平面(2.1)相交,而没有相交。您所说的“最右边”相交处tt值> 用平面(1)分割光线的值。

我希望这很清楚。

摘要:后续的射线/平面相交仅应在将射线与相关平面分开后保留剩余的一部分光线的情况下进行。


1
哦!(简短的答案)
bobobobo 2012年

不错的答案Torious!欢迎使用GDSE。
MichaelHouse
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.