image.png

先了解一下OCtree

<aside> 💡

八叉树: OCTree

image.png

基本定义

将一个立方体划分为8个小立方体,我们称为体元。在八叉树中如果被划分的8个体元具有相同的属性,则该体元构成一个叶节点;否则继续对该体元剖分成8个子立方体,依次递剖分。可以看作树状结构图,每个根节点有8个子节点。

八叉树叶子节点代表了分辨率最高的情况。例如分辨率设成0.01m,那么每个叶子就是一个1cm见方的小方块。

用八叉树来干什么?

想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个。再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币找出来,聪明的你会怎么做?我们可以把房间当成一个立方体,先切成八个小立方体,然后排除掉没有放任何东西的小立方体,再把有可能藏金币的小立方体继续切八等份….如此下去。因此,Octree就是用在3D空间中的场景管理,可以很快地知道物体在3D场景中的位置,或侦测与其它物体是否有碰撞以及是否在可视范围内。

<aside> 🥽

实现八叉树的步骤

  1. 设定最大递归深度
  2. 构建一个可以包裹场景的大立方体
  3. 将场景的元素(例如,点云)丢入大立方体内。
  4. if(没有达到最大递归深度),就分为8等分并将场景元素分担给八个子立方体。
  5. if(子立方体所分配到的元素数量不为零且跟父立方体是一样的),则该子立方体停止细分,因为,说明此时元素可能恰好在顶点附近,可能会造成无穷分割的场景。
  6. 重复步骤3 </aside>

</aside>

泊松表面重建

重建流程

  1. 点云和法向量估计: 该过程从一组3D点开始,这些点被称为点云,它们代表你试图重建的对象的表面。每个点有一个相关的法向量,这是对该点处表面朝向的估计。
  2. 形成矢量场: 这些点及其相关的法向量被用来形成一个连续的矢量场。矢量场是个函数,将矢量(方向和大小)分配给/映射到空间中每个点。在此处,我们将矢量场设计为:对于点云中的每个点,由场分配的矢量与该点的法向量要匹配。
  3. 解泊松方程: 找到一个标量函数(将空间中每个点映射到某个数值的函数),其梯度尽可能地匹配前面创建的矢量场。这可以通过解泊松方程来完成,方程的解是个标量函数$X_M$,其梯度场尽可能接近从点云和法向量创建的矢量场。
  4. 表面提取: 在上一步中找到的标量函数被用来创建表面。这个函数的零集(即函数等于零的点集)被用作重建的表面。这个表面应通过点云中的原始点,而且在这些点处的法向量应尽可能与原始的法向量相匹配。

上面四步,用图片表示为如下

image.png

<aside> 💡

</aside>

总结:输入带有法向量的点云数据,输出为三角形的mesh网格模型

算法原理

核心思想是点云代表了物体表面的位置,其法向量代表了内外的方向。通过隐式地拟合一个由物体派生的指示函数,可以给出一个平滑的物体表面的估计。

物体派生的指示函数如下: