由点云重构CAD模型的基本步骤包括:点云分块、点云切片、曲面重构、CAD模型。
1. 点云分块
由于工程实际中原型往往不是由一张简单曲面构成,而是由大量初等解析曲面(如平面、圆柱面、圆锥面、球面、圆环面等)及部分自由曲面组成,故三维实体重构的首要任务是将测量数据按实物原型的几何特征进行分割成不同的数据块,使得位于同一数据块内的数据点可以一张特定的曲面来表示,然后针对不同数据块采用不同的曲面建构方案(如初等解析曲面、B-spline 曲面、Bezier曲面、NURBS 曲面等)进行曲面重建,最后将这些曲面块拼接成实体,它包括点集分割与曲面重建两部分。
为了实现点云的分块功能,同时也为了后续曲线拟合中重要点的选取工作,我们建立了图元的拾取模块。它包括多边形拾取、矩形拾取、点选三个小的部分,运用此模块我们可以利用鼠标对空间点云进行任意的分割和提取。
多边形拾取与矩形拾取类似,都是在视图上确定一个选择区域,然后根据视图上的图形是否完全落在这个选择区域中来决定视图上的图形是否被选取。由于我们针对的对象是三维空间中的图元,因此在视图窗口中所确定的区域实际上是一个矩形体或者多面体,所拾取的图元是位于这个体中的对象。问题的关键在于如何确定图元是否位于矩形体或多面体中。
基于OpenGL的拾取机制很好的解决了这个问题。物体的实际坐标经模型视图变换、投影变换、视口变换后显示为屏幕上的一点,OpenGL的gluUnProject()可以做该过程的逆变换,即根据已知屏幕上点的二维坐标以及经过的变换矩阵可求出该点变换前在三维空间的坐标位置,但需要事先给定二维屏幕坐标的深度坐标。考虑OpenGL的投影原理,将0.0和1.0作为前后裁剪面的深度坐标。因此两次调用gluUnProject()可得到视图体前后裁剪面上的两个点,也就是屏幕上点的两个三维坐标。
对于矩形拾取而言,判断点是否位于矩形体中比较简单,可以选取每个空间点,判断点的坐标是否位于矩形盒三个方向的极限范围内,如果满足条件,则可认为该点符合条件,被拾取到了,并高亮显示。对于多边形拾取而言,我们借助面的法矢进行判断,对于任意空间点p,首先计算出各个面的外法矢n,然后在每个面任选一点v与p构成向量pv,如果对于多边形的每个面恒有n*pv >0,则可认为该点位于多边形的内部,当然也可利用射线法进行判断,从该点出发,作任意方向的一根射线,考察此射线与三维物体各面的交点数,如果总数=0或其它偶数,则在三维物体之外,如果总数为奇,则在三维物体之内。点选相对比较简单,对鼠标点击点向各个方向各扩展一定距离,构成一个矩形,然后按照矩形拾取的原理进行判断。需要注意的是上述三种方法不可避免的会出现透视方向的重叠点,必须根据到前裁剪平面的距离进行取舍。下面分别给出一些简单的例子。
多变形拾取
在多边形拾取对话框中我们可以根据操作的类型选择是对网格还是点云进行拾取,同时所保留的区域(多边形内、外、或者同时)也可进行选择。基本操作步骤为:左键点击多边形按钮开始选择,在点云中左键单击作为多边形顶点,同时开始绘制,点击Apply结束多边形绘制,同时高亮显示拾取点云。
1.1 矩形拾取
矩形拾取的步骤和多边形类似,效率相对高一些,但每次拾取的区域有限。
1.2 点选操作
点选操作的主要目地是选择一些显著的离散点进行曲线的拟合,也可用于删除一些噪点。
2. 点云切片
由于通过测量所获取的数据是一种散乱无序的状态,而且数据量很大,直接处理代价很大,因此如何将数据进行重新组合,使其成为一种有序的结构,在曲面重构中有着重要应用。借助医学切片技术在医学图像三维重构方面的突出作用,将它引入到计算机辅助几何设计领域,提出了三维散乱数据点的切片表示技术,这种技术将原始的无序数据点集转化为具有层列结构的有序组织形式,同时减少了点云的数据量,为后续的曲面重构奠定了基础。
2.1 定义截平面
每个截平面包括两个属性,一个截平面的中心点centerPos,另一个为截平面的法矢n,不同拓扑结构的数据点云,截平面的定义方式不同。对于一般结构的数据点云,初始截平面的定义可以按以下过程定义:首先计算点云的最小包围盒,获取包围盒的中心点作为第一个截平面的中心点,初始方向定位x,y,z任一方向,截平面的个数设定为一个,平行平面之间的初始距离d=1;实际应用时,可以根据数据点云的具体情况进行手动调整第一个截平面的中心坐标、截平面的法矢方向、截平面的间距、截平面的个数。同时为了便于观察切片切