具有移动球体的射线球测试的良好加速结构
Posted
技术标签:
【中文标题】具有移动球体的射线球测试的良好加速结构【英文标题】:Good acceleration structure for ray sphere tests with spheres that move 【发布时间】:2010-02-22 15:40:00 【问题描述】:我正在寻找合适的加速结构来进行射线球相交测试(在游戏中)。以下条件适用:
-每帧大约有 100 个球体和 100 条光线可以相互测试
-球体在每一帧中移动,光线也是如此
-在每一帧中都可以添加/删除光线/球体(但在两帧之间它们中的大部分将是相同的,只是稍微移动了一点)
-整个东西都是 3D 的
KD-Tree 非常适合光线相交测试,但由于球体移动,我必须在每一帧中重建 KD-Tree,成本很高
Oct-tree 更易于维护,但对于光线相交测试非常无效。
针对 100 个球体的 100 条射线似乎并不多,但我正在使用非常少的资源进行编码,因此我正在为此寻找一些加速
谁能给我一些提示?
【问题讨论】:
+1 让我知道我不像某些人那样注定要死在电脑前。 ++++ing 自 2009 年以来让我头疼的问题 不明白你的意见......我的问题有什么问题吗? 别担心,看看你的 +6。 【参考方案1】:100x100=10k,优化后的蛮力看起来并没有不连贯,尤其是光线/球体相交测试只涉及相加/相乘。您始终可以在主循环之前预先计算所有归一化的光线矢量。
如果您假设您生活在有界宇宙中并且球体和射线的空间密度相对均匀,您可以使用固定空间网格(固定八叉树)——类似于 16x16x16 单元格网格,或者更多——和:
预先计算每个球体相交的单元格(易于计算,只涉及很少的添加和比较),在每个单元格中存储相交球体的列表, 对于每条射线,在一个循环中: 计算光线穿过的单元格列表(基于 Bresenham 算法的方法可以解决问题) 对此单元格列表中的所有球体进行交叉测试。这样您就不必在任何树中存储任何光线,只需在球体中存储。这种方法的效率取决于细胞大小/球体大小的比率,如果球体大小没有太大的离散度,这可能是一个很好的提示。
如果球体不相互交叉并且球体大小有最小值,您甚至可以将球体列表绑定到单元格列表中(适当的数字留给读者作为练习...)
HTH
【讨论】:
@Mat,这有助于解决您的问题吗?如果是这样,您可以将其标记为“已回答”。以上是关于具有移动球体的射线球测试的良好加速结构的主要内容,如果未能解决你的问题,请参考以下文章
游戏开发实战Unity实现类似GitHub地球射线的效果(LineRenderer | 贝塞尔曲线)
游戏开发实战Unity实现类似GitHub地球射线的效果(LineRenderer | 贝塞尔曲线)