【发布时间】:2011-05-18 12:06:33
【问题描述】:
当在游戏中使用octree 进行碰撞检测时,是否应该每帧都重建树,或者是否有更好的方法假设一半对象在一帧中移动?
【问题讨论】:
当在游戏中使用octree 进行碰撞检测时,是否应该每帧都重建树,或者是否有更好的方法假设一半对象在一帧中移动?
【问题讨论】:
如果您的场景中有大量静态几何体,请考虑构建单独的八叉树。您还可以通过使用更复杂的叶节点来区分静态和非静态几何体来表达相同的想法。
底线:只再生你必须做的。
【讨论】:
如果场景每帧都发生变化,那么你必须重做树。
【讨论】:
如果您有非常动态的数据移动每一帧并且仍然需要加速碰撞检测,我实际上建议使用固定的 3D 网格。二维等效:
它也可以作为一个空闲列表翻倍以允许恒定时间删除,就像这样(使用next 索引作为同一网格单元中下一个元素的索引或下一个要从中弹出的空闲元素空闲堆栈(如果已被删除):
另一个例子:
现在在 3 维中,这似乎需要爆炸性的记忆。然而,诀窍是让每个单元格将一个 32 位索引存储到一个数组中,并且基本上用作一个单链索引列表。这将每个单元的大小减少到 32 位。现在,如果您存储一个 100x100x100 的网格(100 万个单元格),则需要不到 4 兆字节。
当元素移动时,您可以将它们从它们所在的单元格中移除,移动它们,然后将它们插入新的单元格中。为此,您所要做的就是操作一些 32 位索引(无需内存分配/解除分配将元素从一组单元格传输到其他单元格)。这都是恒定时间的,不需要重新平衡树或拆分变得过于拥挤的八分圆或类似的东西。
您还可以使用网格层次结构(这可能听起来像八叉树,但有所不同)。我的意思是你的场景中可能有一个粗网格用于整个网格对象。然后每个网格对象可能为其每个部分存储一个粗略的网格,例如 10x10x10。然后每个部分为其每个多边形存储一个精细的网格或八叉树。这允许非有机网格,比方说,刚性的部分像机器人一样旋转,以避免必须更新多边形的精细网格/八叉树,而只需更新其自己的粗糙网格和世界对象的粗糙网格。它开始旋转它的腿和手臂,例如只有有机模型在被骨骼变形时才需要更新它们的精细网格,例如
我会为你的完全静态的元素/部分保留八叉树,这些元素/部分永远不需要每帧更新,我会使用一个很好的八叉树,稀疏的,可能有一些后处理,用于缓存友好的内存访问。如果您可以假设八叉树在构建后永远不需要更新,那么您有更多时间来加速搜索并最大限度地减少它们的内存使用。
【讨论】: