将多边形模型转换为边界表示法:算法和代码示例

在大多数设计系统(CAD)中,模拟对象的主要表示形式是几何或B-rep(边界表示)的边界表示。 但是,越来越多的CAD用户必须处理例如通过3D扫描获得或从在线目录中借用的多边形模型。
为了使它们适合于进一步的工作,您需要将多边形网格转换为B-rep模型。 这一点都不容易。
我们开发了软件组件C3D B-Shaper,该组件已集成到设计系统中,并将多边形模型转换为边界表示。 在这篇文章中,我们将展示C ++中的转换算法和实现示例。

图片


就CAD而言,多边形模型的主要问题是什么? 传统工具无法应用于它们-执行布尔运算,构造倒角和圆角,获取投影和截面。 如果使用B-rep模型构建其多边形表示非常容易(这是使用三角剖分完成的),则逆变换会更加困难。 出现了许多问题-识别各种类型的表面(包括自由形式的表面),存​​在噪声,这些噪声是3D扫描结果的特征。

在新的SDK中,我们实现了将多边形模型转换为B-rep的三阶段机制:分割,曲面重建,B-rep模型的构建。 通常,假定该过程是迭代的:如果用户出于某种原因对结果不满意,则可以在曲面的分割和重构阶段进行必要的校正更改。

图片
将多边形表示转换为边界的方案

在开始转换为B-rep之前,在某些情况下,有必要提高原始多边形网格的质量:协调相邻多边形的法线方向,消除“孔”,在原始网格中存在噪声的情况下应用平滑算法。

多边形分割


在第一阶段,将网格多边形的初始集合分类为子集(段)。 有关网格顶点处的法线的信息允许进行一阶分割,从而确保初始网格划分,以及对平坦或强烈弯曲的区域进行分类。

初始网格划分基于所谓的“尖锐”边缘的定义,即两个平均平均法线之间的角度超过某个预定值的三角形多边形之间的边缘。

二阶分割根据其主曲率分析网格,这为基本曲面的分类提供了足够的基础。 在计算网格顶点处的曲率时,我们使用了Mayer的结果(Mark Meyer,Mathieu Desbrun,Peter Schroder和Alan H.Barr,《离散微分几何算子用于三角2歧管》,《可视化与数学》,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模型(右)

但是,并非总是可能构造拓扑正确的外壳。 作为这种情况的一个示例,假设在重构曲面的过程中,我们有两个曲面-一个圆柱体和一个平面,它们在空间中的位置接近切线。 由于其交点表面的重建中的错误,可能根本没有任何错误。 在这种情况下,外壳可能会形成一些缺陷,用户可以通过适当调整表面参数来修复这些缺陷。



多边形模型的类型和转换模式的选择


如今,多边形表示中有几种主要的模型来源:
  • 在线目录,多边形格式(STL,VRML,OBJ)的3D模型数据库,例如3D模型库,Cults 3D等。
  • 3D扫描结果
  • CAE算法优化拓扑模型的结果。


这些来源的多边形模型可以分为两组:第一组包括B-rep对象的三角剖分模型,第二组-所有其他模型。 第一组的特征差异是多边形网格中没有噪音以及分析定义的表面占优势。 因此,从第一组到B-rep模型的转换将以全自动模式或在最少的用户干预下进行。

第二组模型的多边形网格意味着与用户的交互交互更紧密。 因此,最初,我们在C3D B-Shaper中设定了两种操作模式-全自动和交互式。

特定模式的选择还取决于转换的目的:在某些情况下,可以忽略所得壳的元素的拓扑连接性及其正确性。 当用户可以将任意内部项目添加到房间的当前模型时,这种方法是可以接受的,例如,可以优化BIM应用程序中的渲染。 另一方面,对于逆向工程任务,必须获得原始模型的最精确副本,例如,以给定的精度保留圆柱的对齐方式,以确保一对曲面的切线位置,从而获得正确的模型拓扑-在这种情况下,如果没有用户干预,转换过程。

C3D B形状自动转换界面由以下功能表示,这些功能接受输入网格和转换设置作为输入:

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


转换设置包括识别精度值,即 在该线段边界内的多边形网格的顶点到已识别表面的最大允许距离。 该精度可以是绝对精度,也可以是相对精度:使用相对精度时,将根据模型的大小检查物体的面与网格的偏差。

此外,用户可以选择切换识别模式,这使您可以在重建过程中控制曲面的类型。
MbMeshProcessor类接口提供了用于管理分割和表面识别过程的高级功能:

 class MbMeshProcessor { .. public: // “” . void SetUseMeshSmoothing( bool useSmoothing ); //   . 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 ); //   . void FitSurfaceToSegment( size_t idxSegment ); void FitSurfaceToSegment( size_t idxSegment, MbeSpaceType surfaceType ); const MbSurface * GetSegmentSurface( size_t idxSegment ) const; //  B-rep . MbResultType CreateBRepShell( MbFaceShell *& pShell ); .. } 


例如,要纠正自动分段的结果,提供了用于组合分段,分离分段等的工具。 用户可以在一个片段中输入给定类型的表面,也可以更改已识别表面的参数。

现在发生了什么


7月,我们发布了该组件的第一个版本,并且目前在多个领域继续开发:自动分段算法,分段编辑工具,基于分段构建自由形式曲面(NURBS)以及提高B-rep壳的构建质量。

有兴趣的开发人员可以测试C3D B形状。 根据我们网站的要求 ,该组件免费提供三个月。

作者-C3D Labs数学家程序员Andrey Tumanin博士

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


All Articles