1.表面重建
通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构。拓扑结构对于实际图形处理以及可视化具有更重要的意义。因此,这就需要利用表面重建技术奖点云数据转换成面模型,通常为三角网格模型。除此之外,基于图像数据的面绘制技术也是一种应用非常广泛的表面重建技术。
2.VTK中实现三角剖分技术
三角剖分技术是一种应用非常广泛的面重建技术。三角剖分将一些散乱的点云数据剖分为一系列的三角形网格。最常用的三角剖分技术为Delaunay三角剖分。Delaunay三角剖分具有许多优良的性质,如最大化最小角特性,即在所有可能的三角剖分中,其所生成的的三角形的最小角的角度最大。所以,Delaunay三角剖分无论从哪个区域开始构建,最终生成的三角网格还是唯一的。VTK的vtkDelaunay2D类实现了二维三角剖分。该类的输入数据为一个vtkPointSet或其子类表示的三维空间点集,其输出为一个三角网格vtkPolyData数据。虽然输入的是三维数据,但是算法仅适用XY平面数据进行平面三角剖分,而忽略Z方向数据。当然,也可以为vtkDelaunay2D设置一个投影变换从而在新的投影平面上进行三角剖分。需要注意的是,再不添加任何限制条件下,该类生成的平面三角网格为一个凸包。下例演示如何使用vtkDelaunay2D,将其生成的数据用于模型地形数据:#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkPolyData.h> #include <vtkPointData.h> #include <vtkDelaunay2D.h> #include <vtkMath.h> #include <vtkVertexGlyphFilter.h> #include <vtkPolyDataMapper.h> #include <vtkProperty.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> int main() { unsigned int gridSize = 10; vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); for (unsigned int x = 0; x < gridSize; x++) { for (unsigned int y = 0; y < gridSize; y++) { points->InsertNextPoint(x, y, vtkMath::Random(0.0, 3.0)); }