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

Mat*_*Mat 7 intersection acceleration

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

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

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

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

- 全是3D的东西

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

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

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

有人可以给我一些提示吗?

Lau*_*ire 2

100x100=10k,优化的蛮力看起来并不矛盾,特别是射线/球体相交测试仅涉及加法/乘法。您始终可以在主循环之前预先计算所有归一化光线矢量。

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

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

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

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

华泰