【数字几何处理】三维重建
三维空间中隐式曲面的定义
三维空间中的隐式曲面通常使用Level-set函数来刻画:
Level-set(水平集)函数是个神奇的发明,它揭示了一个非常直观的几何现象:任何N维曲面都可以表示为一个N+1维曲面与一个N维超平面的交集,或称为N+1维曲面在一个N维超平面上的投影。在三维空间中的隐式曲面就是由 所定义的等值面,又叫iso-surface,其中就是iso值。
Level意味着在相同的Level上他们的Level-set函数值相同。一般来说,Level为0,因此我们寻找函数F的0-set。
有向距离函数是最常见的一种表示,它将每一个三维的点映射为一个到曲面的有向距离函数
函数值的符号指明内外,函数值为0意味着点在曲面上。
另外一个内外测试函数是Winding/Turning Number,这是个很有趣的想法,可以对着上面的图看,就是如果一个点能围着那个表面转满一整圈,那么这个点就在这个曲面内,否则就在表面外。不过它需要输入的数据(表面内外的一些测试点)做一些排序,所以这种方法不适合点云形式。
而有向距离函数有个缺点是有时候在曲面内的点会被误判为在曲面外,至于为什么会这样下文会说到,而Winding Number就不会有这种问题。
还有一种对闭合曲面进行内外测试的方法是:从测试点发射一条射线,如果该射线和闭合曲面交点为奇数,该点就在曲面上,反之该点在曲面外。
显式重建
首先,计算Voronoi图,接着把Voronoi点插入到Delaunay三角剖分中。最后使边缘只有黑点。
Marching X 算法
它是一种网格提取算法,二维形式是Marching Squares而三维形式则是Marching Cubes。二维形式有中形式,每个Grid point都有在表面上和不在表面上两种状态。三维形式则有种形式,可以用一个八位的索引来快速查找。
从这个查找表我们可以快速知道割边是e1,e4、5、6、9、10,输出的三角形是(E 1、9、4)和(E 5、10、6)。
Marching X 算法步骤
1.离散化空间(使用规则的网格包围住曲面)
2.计算格子上每个点的有向距离函数
3.对这些grid points进行分类(在表面里面/外面)
4.对这些grid edges进行分类
5.求交
6.连接(可能会出现歧义)
比如上图中的两个格子可能会因为不同的连接产生不同的形状,可以在这个格子里面在进行一次采样,或者随机选择一种可能。如果要随机选择的话,就对每种歧义情况作出统一的选择,不然就会出现下面的情况。
构造SDF
SDF的输入是一系列的采样点,而它的输出则是每个grid point的F值。对于空间中的某个gridpoint,首先寻找与它最近的k个sample point,然后用PCA构造出一个切平面,O就是这k个点的中心,N是切平面的法相,最后计算OX向量在法线上的投影,如果是正值,则在曲面外,否则在曲面内。
1.寻找点s的k个最近邻点
2.1计算数据点集的协方差矩阵
2.2将这个矩阵的特征向量作为主轴
2.3将第三个最佳轴作为该平面的法线,二维的话是第二个
2.4以这些点集的平均值作为切平面的中心
2.5第三个特征向量越小,这个平面越准确。
最后进行求交即可
向量场可视化
将所有向量单位化,再根据向量的大小进行缩放(防止造成混乱)