多边形网格到B-Rep实体转换:算法详细信息和C ++代码示例

边界表示(B-rep)是在大多数几何内核(包括我们的C3D Modeler内核)中表示建模对象的主要方法。 编辑模型的核心算法(例如应用圆角操作,执行切割操作以及获取平面投影)需要B-rep表示的精度。 多边形格式中3D数据的迅速增长使从多边形到边界表示的模型转换任务变得越来越重要。 因此,我们开发了一个新的SDK,即C3D B-Shaper,它是C3D工具包的一部分。

图片

在模型的边界表示上使用三角剖分算法(称为曲面细分)相对容易。 建立多边形(镶嵌)表示形式对于可视化目的和进行几何计算很有用。

然而,从多边形表示到B-rep的反向转换面临着一系列问题,这些问题与识别不同类型的曲面(包括自由曲面)的复杂性有关。 同样,在多边形模型中也存在噪声问题,通常是3D扫描的结果。

C3D B-Shaper将模型从多边形格式转换为B-rep格式的一般过程包括三个阶段:分割,曲面重建和b-rep模型构建。 转换过程是迭代的:如果用户出于任何原因对结果不满意,则可以在分割和曲面重建阶段进行校正。

图片
将多边形表示转换为B-rep

但是,在启动b-rep转换过程之前,我们通过应用以下修复方法来提高源多边形网格的质量:协调相邻多边形中法线的方向; 消除孔洞; 并将平滑算法应用于嘈杂的网格源(如果有)。

分割多边形模型


转换的第一阶段是分割多边形模型。 我们将网格多边形分类为子集(段)。 有关每个网格顶点处的法线的信息可以执行一阶分割,然后执行初始网格划分,以及将区域分类为平坦或高度弯曲。 初始网格划分基于定义“尖锐”边缘。 这些是两个三角形多边形之间的边缘,其平均法线之间的角度超过了预定值。

二阶分割基于网格的主曲率来分析网格,这足以对基本面进行分类。 在计算网格顶点处的曲率时,我们使用了Meyer的工作结果(Mark Meyer,Mathieu Desbrun,Peter Schroder和Alan H. Barr,“三角形2-歧管的离散微分几何算子”,“可视化和数学III,2003”)在为三角区域定义离散微分算子时:为每个初始网格顶点考虑一组相邻的顶点(通过边与给定顶点相关)。 接下来,为顶点计算离散算子K。 根据算子,在网格顶点处定义平均法线,平均K H和高斯K G曲率。

图片
为三角区域定义离散微分算子

这样,针对每个网格顶点计算曲率张量,从中提取主曲率值K 1K 2以及主曲率方向。

网格顶点根据其主曲率K 1K 2的值进行分类,然后对其进行计算。 顶点分类算法基于k均值,即最小化聚类点与聚类中心的总平方偏差。 该算法的结果输出包含与群集关联的网格顶点 Ci和一对曲率(簇中心-L. Guillaume,“基于曲率张量的具有边界校正的三角形网格分割”,国际计算机图形学学报(CGI),2004年)。

图片
在曲率空间中对多边形网格顶点进行分类

一旦完成了对多边形网格的顶点的分类,便继续对多边形进行分类。 要开始此过程,我们选择可以认为其曲率已完全定义的三角形多边形。 这是三个顶点在一个群集中的顶点,或者在尖锐的边缘上有两个顶点的顶点。 多边形被标记为新的线段,并成为扩展该线段的递归过程的起点:对于每个三角形多边形,只要相邻多边形之间的边缘不是“锋利的”,就视为相邻多边形。 当与公共边相反的相邻多边形顶点在锐边上或属于同一簇时,会将多边形添加到线段。 重复该过程,直到构成网格的所有多边形消失。

图片
多边形网格分割

一旦分段创建过程完成,另一种算法会将相邻的分段缝合在一起,以消除网格的过度分段。

表面类型识别


第二阶段是表面识别。 每个线段必须以系统或用户确定的精度用表面近似。

首先,使用分段的主曲率值来确定是否有可能通过以下基本面之一描述分段的形式:

  • 平面: k 1 = k 2 = 0
  • 球面: k 1 = k 2 = K > 0
  • 圆柱体: k 1 = K > 0, k 2 = 0
  • 圆锥: k 1∈[ ab ], k 2 = 0
  • 环面: k 1 = Kk 2∈[ ab ]

为了创建基本曲面,我们使用适当的算法将简单的几何对象拟合到点集上。 例如,为了将圆和球体拟合到一组点上,可以使用最小二乘法。 为了拟合平面,使用主成分分析。 该系统确保在预定的识别精度内,每个重建的曲面都与一个片段相关。

下图通过颜色说明了可识别的表面:平面显示为蓝色,圆柱体显示为红色,球体显示为绿色,圆锥形显示为黄色,而圆环显示为紫色。

图片
具有识别表面段的源多边形网格(左)和分段网格(右)

如果没有基本表面能够描述该段,则系统将尝试识别挤压表面或旋转表面。

当系统最终无法找到描述曲面形式的分析曲面时,会为其创建NURBS曲面。

B-rep模型创建


转换的最后阶段是基于分割和重建的表面数据创建B-rep模型。 从分割的区域创建一个邻接图,以表示模型的拓扑,并形成创建最终B-rep模型的基础。 与之前的步骤相比,B-rep模型以全自动模式组装:

  • B-rep边缘是根据相邻重建曲面的相交曲线创建的
  • B-rep面由有界的识别曲面和B-rep边构成

但是,并非总是可以创建具有正确拓扑的外壳。 例如,采用两个表面,例如圆柱体和平面,它们在空间上彼此相切。 由于为重构曲面指定了公差,因此它们可能根本不相交。 结果,创建的外壳可能存在缺陷。 用户可以通过校正表面参数消除缺陷。



多边形模型的类型


在线有许多多边形模型的来源:

  • 在线目录和数据库以3D模型库,Cults 3D等中的STL,VRML和OBJ的多边形格式提供3D模型。
  • 3D扫描产生的文件
  • 使用CAE算法对模型进行拓扑优化的输出

这些来源的多边形模型可以分为两类:从B-rep对象三角化(网格化)的模型,以及所有其他模型。 第一组特有的一对特征是不存在多边形网格噪声和控制分析表面。 这意味着可以将第一组中的模型以全自动模式轻松地转换为b-rep或只需很少的用户工作。

第二组模型的多边形网格具有噪声,包含有机表面,因此它们更有可能需要用户的交互式参与。

因此,我们提供了两种用于操作C3D B形的模式:全自动和交互式。 用户可以在识别模式之间切换,并在重建过程中管理表面类型。 选择一种模式可能取决于执行转换的目的:用户有时可能希望忽略所得外壳的拓扑连接性或其整体正确性。 在BIM应用程序中优化显示时,通常会出现这种情况,在这种情况下,用户正在向架构模型中添加自定义内部元素。

另一方面,逆向工程任务需要尽可能精确地复制源模型,以便最终模型具有正确的拓扑。 因此,必须预先定义圆柱的同轴度或两个表面的切线的精度。 在这种情况下,用户参与转换过程至关重要。

C3D B-Shaper的自动转换采用以下功能,这些功能将源网格和转换设置用作输入数据:

MbResultType ConvertMeshToShell( MbMesh & mesh, MbFaceShell *& shell, const MbMeshProcessorValues & params ); MbResultType ConvertCollectionToShell( MbCollection & collection, MbFaceShell *& shell, const MbMeshProcessorValues & params ); 

变换设置之一是识别精度值,该值设置线段顶点和识别出的曲面之间的距离的最大公差。 精度可以是绝对的或相对的。 使用相对精度时,相对于模型尺寸,将测量面与网格物体的偏差。

MbMesh处理器接口类提供了用于管理曲面的分割和识别的高级选项:

 class MbMeshProcessor { .. public: // Mesh rectification. void SetUseMeshSmoothing( bool useSmoothing ); // Mesh segmentation management. const MbCollection & GetSegmentedMesh(); MbResultType SegmentMesh( bool createSurfaces = true ); void ResetSegmentation(); void UniteSegments( size_t firstSegmentIdx, size_t secondSegmentIdx ); MbResultType SegmentMeshBySeparators( const std::vector<std::vector<uint>> & sep ); // Surface recognition management. void FitSurfaceToSegment( size_t idxSegment ); void FitSurfaceToSegment( size_t idxSegment, MbeSpaceType surfaceType ); const MbSurface * GetSegmentSurface( size_t idxSegment ) const; // B-rep shell construction. MbResultType CreateBRepShell( MbFaceShell *& pShell ); .. } 

例如,要纠正自动分割的结果,C3D B-Shaper提供了用于合并和分割线段的工具,等等。 用户可以将给定类型的曲面拟合到所选线段上,以及修改已识别曲面的参数。

总结


下图说明了C3D B-Shaper变换算法的结果,其中将复杂的3D模型成功地从其多边形网格表示转换为边界表示实体。

图片

图片
用C3D B-Shaper转换的多边形网格(左)和B-rep模型(右)

我们的目标是创建一个功能强大的SDK,以将模型从多边形转换为B-rep,因此C3D B-Shaper的开发将继续。 我们正在从事的工作包括改进自动分段算法,开发用于分段编辑的工具,改进自由形式NURBS曲面的构造以及提高B-rep外壳程序集的质量。

使用C3D几何内核的客户也是推动C3D B-Shaper开发的一个因素。

欢迎开发人员将C3D B-Shaper作为C3D工具包的一部分或作为独立组件进行测试。

C3D Labs软件开发主管Andrey Tumanin撰写

Source: https://habr.com/ru/post/zh-CN465237/


All Articles