我希望能够实时渲染大量小型独立移动的对象。它们可能会以类似蜂群的方式移动,但是它们的相对位置不会一致-它们的位置可能会在蜂群内任意变化,并且蜂群可能会在任何时候分解和变形。

采用什么方法建造有界的卷层次结构最适合这种情况?有没有一种方法可以维持一个次优但又足够好的层次结构,只需要对每个帧进行部分更新即可?还是有一种方法可以从头开始为每个帧建立足够快的层次结构以实现流畅的动画效果?

如果没有层次结构,对象的数量将太大而无法渲染,但是出于同样的原因,我期望建立层次结构非常耗时。


在约翰·卡尔斯贝克(John Calsbeek)的评论之后,如果我对边界体积层次结构的关注被误导了,并且针对这种情况有更好的空间划分方法,请相应回答。我正在寻找可以处理我所描述内容的东西,包括我从未想到的任何东西。

评论

您是否有意将问题限制在边界体积层次结构上,还是愿意接受其他形式的空间分区?

我已编辑@JohnCalsbeek进行澄清-感谢您指出我的疏忽限制。

当群合并时,考虑将“群”视为一个单元。将它们合并为一个群,当一个孤独者徘徊到很远时,它变成一个“群”。如果群体倾向于具有凝聚力,而独来独往的人很少,这将是最好的选择。有很多整齐的方法可以使用“群体为一个单元”,例如,允许成员仅在彼此接触时才切换群体,列表会不断增加。

#1 楼

考虑使用空间哈希,尤其是在对象的大小类似的情况下。

基本上,将您的世界划分为大小一致的网格单元(根据垂直运动的量,2D和3D都是有效的可能性)。每次更新时,将您的对象分配给与之重叠的每个bin-如果单元格相对于对象具有适当的大小,则大多数对象应最终位于单个bin中。

每个bin都插入到哈希表中,键为垃圾箱的坐标。 (您也可以将其视为具有相同键的多个值的哈希表,并为每个重叠的单元格插入一个对象。)

在此方案中没有要重建的层次结构使其非常适合动态场景。您仍可以粗略地针对截头锥体或封堵器测试单元的尺寸,并立即丢弃许多物体。另外,以增量方式管理此结构也更容易-您可以使哈希表在帧与帧之间保持相同,并且仅在对象跨越单元格边界时才将它们从一个容器移动到另一个容器。

#2 楼

您可以尝试简单地使边界体积比必要的体积大一些,以使对象不会在每次移动时都越过边界,但是再次,无论如何,您都必须立即重建结构。 br />或者,存在边界区间层次结构,试图精确地解决这种情况。感兴趣。

#3 楼

我想为此添加一些实用的视角。
让我引言,我在这里仅使用有限的信息:

我不知道您要处理多少个对象。
我不知道您的加速度结构到底用于什么用途。视锥剔除?射线追踪? BVH中对象之间的碰撞检测?

展望未来,我假设您谈论的是平截头体淘汰了数千个对象。

对象的数量也将太多无需层次结构即可进行渲染,
但是出于相同的原因,我希望构建层次结构会很费时间。

我认为如果您必须访问每个对象,要计算BVH的每一帧,直接剔除而不使用BVH实际上都更快。
这当然取决于您的视锥剔除实现。所有对象的边界体积应连续存储在内存中。这样可以提高CPU缓存的利用效率,并允许使用SIMD指令进行进一步的优化。
DICE对此主题进行了完整的介绍:淘汰战场:实践中面向数据的设计
介绍还提到了加快淘汰速度
由于我假设大多数3D /模拟/游戏代码库已经具有某种BVH类,并且我不知道获得最佳剔除性能对于您来说有多重要,想要提出一些坚持使用BVH的论据:
根据您使用的方法,构造BVH既快捷又简单。
我目前对二进制BVH的实现(每个节点只能具有零个或两个孩子,每个叶节点仅存储一个项目)。为快速构建而设计的i7-5960X在3.89GHz的单线程上对1137个对象大约花费0.18毫秒。我敢肯定它会更快。虽然SAH可能会产生最佳的BVH,但需要很长时间。 SAH适用于可以预先计算的事物,例如碰撞网格物体。
在运行时,您可以将碰撞网格物体放入更适合实时构建的BVH中。
一种快速简单的BVH构建方法(我当前正在使用的那个)是对轴上的所有对象(例如父AABB的最长轴)进行排序,并在中间拆分集合。
要进一步加快处理速度,请在之后计算节点ABB通过组合父节点的两个子节点AABB来构造树。这样可以避免遍历所有对象(另一个2倍加速)。但是,只有在您的拆分条件不依赖于父级的ABB的情况下,这才有可能。