我为所有静态碰撞对象设置了一个Quadtree,它非常适合碰撞检测和射线播放
但是,由于我也有非静态碰撞对象,当我射线播放时,我想将它们作为射线
的可相互关系对象包含实现这一目标的最好(在绩效方面)是什么?我目前的想法是:
1)克隆Quadtree,添加非静态对象,然后将其用于raycast
2)将非静态对象添加到当前的Quadtree中,其中一些标志基本上可以防止Quadtree拆分四轮,即使在四分光中允许的孩子还要多。然后,一旦射线播放完成后,Quadtree将不得不自行"清理"
3)确定最接近的静态对象碰撞(使用Quadtree)之后,只需迭代所有非静态对象,然后查看射线是否与它们相撞,然后检查碰撞点是否比最近的静态静态点接近对象碰撞点
所有这些想法似乎有些麻烦,所以我正在寻找任何可能是表现更多的想法
如果很重要,我正在使用Java
在1)克隆Quadtree如果您有10个以上的对象,则可能非常昂贵,所以我不会那样做。
在2)为什么不保留非静态对象的列表?只需将所有对象添加到树上(我不看看为什么分裂是一个问题),然后从树上重新安装它们后。
在3)如果您有许多非静态对象,这是非常昂贵的,但是如果您很少,则可能是最便宜的解决方案。
更多想法:
4)为非静态对象构建第二个四轮晶式,并进行碰撞检测(类似于5))。碰撞后,只需丢弃第二棵树。
5)如果分裂节点确实是一个问题,那么使用pH-树怎么样?它就像Quadtree一样,但是它的行为比Quadtree更静态(没有插入/删除都会修改多个节点(除了创建一个删除一个空节点外)。
>6)根据非静态对象的速度,您可以使用"移动对象树"(仅Google为其,有一些专用的结构)。如果对象不太快,则pH-Tree可能再次是一个不错的选择,它具有专用的移动/更新方法。