一个球体和许多线段相交

时间:2018-02-04 15:06:48

标签: algorithm intersection raytracing space-partitioning

我熟悉BSP,KD-tree和BVH用于一般射线 - 原始交叉点发现问题。是否有更有效的算法和数据结构来查找仅一个球体和多个线段之间的交叉点?请注意,球体是查询对象。

1 个答案:

答案 0 :(得分:0)

一种解决方案是:

  • 确定线段的边界框并从中创建BVH或kd树。
  • 确定查询范围的边界框。
  • 在交叉算法中,通过检查球体BB与当前节点之间的重叠,使球体穿过树。
    • 如果没有重叠,则球体的BB不会与给定节点中的任何线段相交,您可以跳过节点的子节点。
    • 如果有重叠,请走节点的孩子。
    • 在叶节点处,您必须对节点和球体中的每个线段执行光线相交测试(从您的问题中不清楚,但我假设多个线段可以与球体相交并且您感兴趣在所有这样的交叉点)。您可以像这样优化实际的交叉点测试:

假设

  • 球体的半径为const $modalVideoPreviewIframeClone = $modalVideoPreviewIframe.attr('src', 'about:blank').clone(); $modalVideoPreviewIframe.replaceWith($modalVideoPreviewIframeClone); $modalVideoPreviewIframe = $modalVideoPreviewIframeClone; $modalVideoPreviewIframe.attr('src', sessionPreviewVideoId && `https://www.youtube.com/embed/${sessionPreviewVideoId}?autoplay=1`); ,其中心位于R点,
  • 线段在点CP0
  • 处结束
  • P1D0C之间的距离,以及
  • P0D1C之间的距离。

然后:

  • 如果P1D0 < R,则线段完全包含在球体内部且不与曲面相交。

  • 如果D1 < R xor D0 < R,则线段与球体表面相交。

  • 否则,这些点位于球体外部,但该线可能与曲面相交,因此请运行常规的射线球相交测试。

进一步的优化是将平方距离与平方半径进行比较,以避免取根。