1.基础知识
八叉树octree是一种递归、轴对齐且空间分隔的数据结构,常用于计算机几何来优化碰撞检测、最邻近搜索等,且常用于3D数据的表达。
一个八叉树结构,将有限的三维体数据等分为8个octants。octants也被称为nodes(节点,树结构概念中)或者cells(单元,空间概念中)。将空间分成等大小的立方体可以加速细分运算,且单元大小的存储也节省空间。
一个八叉树是通过递归的将空间细分成八个子单元,直到每个单元中剩余空间的大小在预定权值下,或者达到了最大树深度。每个单元都被单个轴对齐的平面细分的,类似于空间坐标系,其原点通常放在父节点的中心位置。(此处可思考不放在中心会怎么样)
因此,每个节点都可以有0或8个子节点。因此,相较于正常的网格结构,便于存储稀疏分布的结构。
2.octree的节点表达形式
传统基于指针的节点表达:
常用于octree需要频繁更新且内存消耗可以忍受的情况。通常,该节点结构体(104 byte)为:
// standard representation (104 byte)
struct OctreeNode
{
OctreeNode * Children[8];//8个子节点指针
OctreeNode * Parent; // optional 父节点指针
Object * Objects;//物体指针
Vector3 Center;//中心位置vector
Vector3 HalfSize;//octan大小vector
};
位于中间位置的节点以上都有,但叶节点没有子节点。因此,还常常加一项bool Isleaf;
稍微节约一点的方式:不存储每个节点的指针,而是将8个子节点连续存储成一个块,只需要存储开头的指针就好了:
其结构体(49 byte):
// block