空间索引
空间索引本质上是一种数据结构,用来组织和检索具有“位置属性”的数据。就像二叉树一样,它可以提高检索的效率,只不过是处理一维数据。
空间索引常分为层级式索引和网格化索引。
层级式(Hierarchical)包括
- Octree(八叉树):将空间递归、均匀的分为 8 块,适合体素表示和快速踢除空旷空间
- kd-tree(k-维树):按照点的分布交替切分轴,最适合高维空间的最近邻搜索(KNN)搜索
- BVH(Bounding Volume Hierarchy):用包围盒(球体或长方体)把物体包起来。这是光线追踪和碰撞检测的核心。
网格化(Grid-based)包括: - Uniform Grid(网格):将空间切成大小一致的方格(像 Minecraft 那样)。简单但浪费内存。
- Spatial Hashing(空间哈希):将空间坐标映射到哈希表,适合处理物体不断运动的动态场景。
Octree(八叉树)
切分逻辑:
- 将一个立方体空间在 x,y,z 边的正中间切分,平分成 8 个子立方体。
- 如果子空间内的点数少于某个阈值,或者切分层级达到某个阈值,则停止切分。
特点
平均
稀疏性支持:如果某个空间内没有点,则在数据结构上不会给它分配内存。
优点:
结构极其规整,非常容易通过坐标定位。特别适合体素化。
缺点:
灵活性较差,如果物提恰好在切分线上,或者分布很不均匀,会出现很多无意义的空间点。
kd-tree(k-dimensional tree)
切分逻辑
- 在当前点集中选择一个维度(比如第一层选 X 轴,第二层选 Y 轴,第三层选 Z 轴)
- 找到该维度上的中位数点,画一个垂直于该轴的平面,将空间一分为二。
- 在左右两个子集中重复上数过程
特点
平衡性:好的 kd-tree 会尽量保证左右子树的点数平衡。
优点
能够完美适应数据分布。无论点云多么不平均,都能保持 O(logn) 的搜索复杂度。
缺点
维护成本高,如果点云是动态增加或移动的,频繁重构 kd-tree 非常耗时。
Read other posts