具有移动球体的射线球测试的良好加速结构

时间:2010-02-22 15:40:01

标签: intersection acceleration

我正在寻找适当的加速结构来进行射线球交叉测试(在游戏中)。以下条件适用:

- 每帧有100个球体和100个射线相互测试

- 球体在每个帧中移动,射线也是如此

- 可以在每个帧中添加/删除光线/球体(但是它们中的大部分在两个帧之间是相同的,只是略微移动)

- 全是3D的东西

KD-Tree非常适合Ray交叉测试,但由于球体移动,我必须在每一帧中重建KD树,这是昂贵的

Oct-tree更易于维护,但对于光线交叉测试非常无效。

对100个球体的100条射线似乎并不多,但我的编码资源非常少,所以我正在寻找一些加速度

任何人都可以给我一些提示吗?

1 个答案:

答案 0 :(得分:2)

100x100 = 10k,优化的强力似乎不相干,尤其是射线/球体相交测试仅涉及加/乘。您始终可以在主循环之前预先计算所有标准化光线矢量。

如果你假设你生活在一个有界的宇宙中并且球体和光线的空间密度相对均匀,你可以使用一个固定的空间网格(固定的八叉树) - 像16x16x16格子网格,或者更多 - ,和:

  • 预先计算每个球体相交的单元格(易于计算,仅涉及少量添加和比较),在每个单元格中存储交叉球体的列表,
  • 对于每个光线,在一个循环中:
    • 计算光线穿过的单元格列表(基于Bresenham算法的方法可以做到这一点)
    • 对此单元格列表中的所有球体进行相交测试。

这样您就不必在任何树中存储任何光线,只有球体。这种方法的效率取决于细胞大小/球体大小的比例,如果你没有太大的球体大小分散,它可以是一个很好的暗示。

如果球体不相互交叉且球体大小最小,您甚至可以将球体列表绑定在单元格列表中(适当的数字留给读者......)

HTH