一直忙系统开发,真是很久很久没有来了。最近在研究三维场景的管理方法,首选了八叉树方法。在网上可以看到很多文章,但是讲八叉树的书籍却不多,多半是敷衍而过,我就没有舍得花大洋去买了。自己根据网上的文章研究,总算搞明白了,于是自己动手实现之。
上网搜索八叉树空间索引,文章一大堆,基本的思想也比较明确,就是把要管理的空间当成一个大立方体,按照限定的深度递归分割,每次平均的分成8份,形成了八叉树,每个立方体空间成为一个节点。然后把各种对象按所在位置记录到叶节点中,形成索引表。判断物体所在节点时一般仅用对象的包围盒,这样判断起来比较快,裁剪冗余也不会太高。进行场景剔除时,递归的判断节点是否可见,直到选出所有可见的叶节点,再从其索引表中取出物体,达到提高剔除效率的目的。
大概就是这样了,但我没有急着开始写代码,希望对这个索引系统进行一些优化的设计。首先,我对八叉树索引系统功能有了一些要求,一般的游戏是在加载场景时建立一次八叉树空间索引,里面的建筑之类的固定物体都给预先分配好,甚至很多是把八叉树索引保存在文件里,创建场景时只是加载出来。这样带来一个问题,运动物体没有被八叉树索引。而要动态的对物体进行索引,就是在物体的包围盒发生变动时,要求立刻加入新进入的节点,并从之前离开的节点中删除,这需要一个高效的实现方法。我从两个方面解决了一些效率的问题,达到了对动态物体实时进行索引的方法。
首先是避免建立八叉树节点,使用均匀网格。把整个要索引的空间分成一个三维均匀网格(一个大魔方),但网格的尺寸必须是2^N。每一个网格单元就作为一个八叉树的叶节点。系统只在剔除时进行递归操作。从最顶级节点(整个大魔方&#x
动态八叉树空间索引系统开发小结
最新推荐文章于 2024-01-17 12:59:35 发布