八叉树Octree原理

八叉树Octree原理
载自: http://bbs.iieeg.com/viewthread.php?tid=1222


一、对Octree的描述


   Octree的定义是:若不为空树的话,树中任一节点的子节点恰好只会有八个,或零个,也就是子节点不会有0与8以外的数目。那么,这要用来做什么?想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个。再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币找出来,聪明的你会怎么做?我们可以把房间当成一个立方体,先切成八个小立方体,然后排除掉没有放任何东西的小立方体,再把有可能藏金币的小立方体继续切八等份….如此下去,平均在Log8(房间内的所有物品数)的时间内就可找到金币。因此,Octree就是用在3D空间中的场景管理,可以很快地知道物体在3D场景中的位置,或侦测与其它物体是否有碰撞以及是否在可视范围内。


二、实现Octree的原理 


(1). 设定最大递归深度 


(2). 找出场景的最大尺寸,并以此尺寸建立第一个立方体 


(3). 依序将单位元元素丢入能被包含且没有子节点的立方体 


(4). 若没有达到最大递归深度,就进行细分八等份,再将该立方体所装的单位元元素全部分担给八个子立方体 


(5). 若发现子立方体所分配到的单位元元素数量不为零且跟父立方体是一样的,则该子立方体停止细分,因为跟据空间分割理论,细分的空间所得到的分配必定较少,若是一样数目,则再怎么切数目还是一样,会造成无穷切割的情形。 


(6). 重复3,直到达到最大递归深度。


三、Octree的存贮结构 


本例中Octree的存贮结构用一个有(若干+八)个字段的记录来表示树中的每个结点。其中若干字段用来描述该结点的特性(本例中的特性为:节点的值和节点坐标),其余的八个字段用来作为存放指向其八个子结点的指针。此外,还有线性存储和1托8式存储。 


四、BSP Tree和Octree对比 


a) BSP Tree将场景分割为1个面,而Octree分割为3个面。 


b) BSP Tree每个节点最多有2个子结点,而Octree最多有8个子结点 因此BSP Tree可以用在不论几唯的场景中,而Octree则常用于三维场景

你可能感兴趣的:(八叉树-Octree)