假设我有一个四叉树。 假设我内部有一个移动物体。
我理解当你添加和删除节点时,四叉树自动排序,但是当一个节点,比如在他的更新函数中移动到另一个不相关的节点的左边时会发生什么? 或者基本上这个节点传送?
四叉树会发生什么? 我需要重建吗?
我只是无法理解,如果只更新节点数据,或者我需要在更新节点时重建整个树,四边树会自动排序。
答案 0 :(得分:0)
有很多方法我认为人们为每帧移动的对象实现四叉树,包括使用松散的四叉树来实现这一目的,甚至允许节点具有重叠的AABB,它们作为对象扩展和收缩存储在树叶中的四处移动。
那就是说,我发现它非常简单,可以合理地便宜地更新非松散版本(不像空间散列或网格那么便宜,但是足够便宜,可以保持稳定的帧速率,同时移动一大堆实体周围有碰撞检测)。
简单的方法是在移动树之前从树中移除元素,移动它,然后将其重新插入树中。删除元素时,请检查它所属的节点。如果它们变空(没有存储元素,没有子元素),则从父项中删除它们。如果父项变为空(没有子节点存储在该节点中,如果您在分支中存储元素,那么该节点中没有元素),则从祖父项中删除父项,然后重复。
快速做到这一点是为了避免过多的内存分配。如果您为节点使用空闲列表,例如另一种可能加快速度的方法是检测对象何时不会从一个节点移动到另一个节点。
例如,您可以通过时间步长乘以其速度来扩展实体的边界框或球体,并测试扩展的边界框/球体是否与新节点重叠。如果没有,您不需要从树中删除元素,移动它并重新插入。你可以继续前进,只需移动它。或者您可以只存储其先前的位置,移动它,然后查看它是否属于不同的节点。如果是这样,请将元素移除,就像它具有先前位置一样,然后重新插入新位置。我还没有真正找到这个必要的方法,虽然我可以通过索引操作和没有堆分配/解除分配来完成大部分工作。