开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2023.09.21
如果确实因为讲事实而损害了某些利益,那也是没办法的事。实话一旦闭嘴,那就只剩下谎言和无用的信息了。
我们都知道“几何内核”在工业软件中的地位和重要性,目前市面上关于三维几何内核的深入介绍极少,有的话也都停留在基础知识,设计理念和发展历史层面。在实际工作中也经常听到诸如“开发仿真软件必须用PS/ACIS二选一”,“几何内核万能“,”找两个人半年做个几何内核“。看完这个系列后,会对几何内核有更深入的理解。
本文将对几何内核涉及的专业术语,设计理念,应用领域,以及现状做进一步的介绍。
-------------------------------------------
计算机中表示三维形体的模型,按照几何特点进行分类,大体上可以分为三种:线框模型、表面模型和实体模型。如果按照表示物体的方法进行分类,实体模型基本上可以分为分解表示、构造表示CSG(ConstructiveSolidGeometry)和边界表示BREP(BoundaryRepresentation)三大类。主流几何内核的做法是底层使用BREP结构,把CSG作为操作BREP结构的管理方法。
在内核里,按照使用目的我们一般把数据分为两类:
几何和拓扑
“几何”描述的是具体位置和形状,“拓扑”描述的是位置关系。
“几何”比较容易理解,就是我们通常所说的点,线,面,体。线又可以分为直线,线段,圆,圆弧,Nurbs曲线,贝赛尔曲线等各种线,面也类似可以分为平面,非参数曲面,参数方程定义的曲面等。而体则定义了各种实体,长方体,圆柱,球,圆环,组合体等
为什么要有“拓扑”的概念?
其实很好理解,举个例子:
一条线段有两个顶点,当我们只知道其中一点的坐标数据时,希望得到该点在哪条线段上。如果没有拓扑信息,简单的办法就是全局计算遍历一遍,缺点显而易见;如果有拓扑信息,记录了该点的拓扑信息,即该点的上层拓扑直线,我们直接拿点的拓扑信息就可以了。
“拓扑”这种记录位置关系或者对象关系的数据结构在三维几何计算中非常有用,是一种基础数据结构。
ACIS/PS中的拓扑
OCC中的拓扑
三维里没有“三维”
BoundaryRepresentation(BRep),边界表示方法是目前主流的几何内核ACIS/OCC/PS使用的方法,主要原因是这种几何表示方法比较直观,简单,通用,适合大部分几何造型以及建模需求。
在该方法中,虽然拓扑上定义有“体”,但实际上体也是由面来表示,比如一个长方体,由六个面构成,而体的内部是空的。如下图
有朋友可能会问:如果我想得到体里面的数据怎么办?
三种方法:
对于几何来说,BREP是万能的吗?
当然不是。
在很多领域,基于BRep的几何内核派不上用场。比如医疗行业,人的各种器官都是非常不规则的几何体,只能通过表面的三维细化面片重建。而基于BRep的拓扑几何结构过于重量化,海量的三角面片如果使用BRep,性能会非常差。
在CFD仿真中,大部分的模型都是基于面片数据,比如STL数据格式,而很少使用SAT,X_T,STEP等格式,即使使用了这些格式,最后也只是拿三角化后的数据。
在很多专业设计领域,比如需要很多流线型的曲面曲线非等值面设计,基本都会使用专业的设计方法和工具,而不会使用BREP结构。
对于一些复杂的数学方程和公式定义的异形几何,BREP也无能为力。
为什么几何内核是工业仿真软件的基础之一
其实原因也很简单,工业仿真软件最大的几个特点:稳定性,可靠性,性能,以及兼容性!ACIS/PS的底层应用非常成熟,基于ACIS/PS的不同程序之间可以直接无损交换数据。
虽然我们可以看到ACIS/PS每年都在更新,但实际上底层的结构还是几十年前的,不曾动过,现在的更新更多的是上层应用以及来自客户新需求。
有人会问:为什么不能超越ACIS/PS?
其实这种问题就类似于:为什么不能发明一种新的键盘?
不是不能超越ACIS/PS,而是超越的成本太高,而且这种成本并不是单指通过砸钱,很多有用的实际功能都来自于工程实践和用户迭代,这些都被封装了起来。
之前就说过:对于长期从事工业仿真软件研发的企业来说,几何内核的研发是必要的,但是不需要做类似ACIS/PS通用的几何内核,而是要做针对自己行业的,针对业务流程的轻量级的几何内核。使用商业内核的绝大部分企业都只使用了其中非常小的一部分功能(可能10%都不到),却要支付高昂的license费用。
几何内核现状
发展到今天,几何内核和其它工业软件基础技术一样,技术上并没有太大的突破。主要是来自客户的需求以及应用层面的改进。
其实除了大家耳熟能详的ACIS/PS/OCC等几何内核,市场上还有许多做内核的小公司和企业,只不过名声不大。笔者接触过的至少就有7,8家。有些确实做的不错,有的有不少亮点。
相比于单纯的三维CAD设计建模,工业仿真软件对几何内核有更高的要求。以后几何内核的发展更多的源自于上层应用需求,比如CAD/Mesh无缝结合,性能持续改进,直接介入用户业务等等。
1.二维草图
“草图”是一个专业术语。我们设计一个对象或者绘制一个对象时,开始很难用三维进行建模,通常的做法是先用二维表示,工程上的图纸一般也都是用二维表示,比如我们常见的俯视图,侧视图,截面图等等。AutoCAD之类的绘图设计软件最初都是二维的。
有人可能觉得二维比较简单,没什么难度,实则不然。单个的二维对象确实比较简单,点线面数据通过基本设计即可实现。
考虑如下设计:
两个互相咬合的齿轮,已经分别设计出齿轮的半径,进行了咬合。现在需要修改其中一个齿轮的半径,如果只是简单的分别绘制出两个齿轮,其中一个改动后,另外一个也需要手动修改以保证齿轮咬合。一般的做法是将两个齿轮关联,一个改动后,另外一个自动修改以保证咬合。如果一个齿轮同时和多个齿轮相连,则涉及到多个同时关联。
再考虑一种情况,在平面墙上绘制门和窗户,当我们修改墙高度和宽度的时候,门和窗户要随动,比如我们加了约束(窗户不能靠房顶,门底和地面平齐等等),随动要满足这种约束关系。
这就引申出几何内核里的一项基本功能:约束设计求解器。
约束设计求解器在于给定各种约束情况下,求解类似刚体运动自由度方程,约束设计求解器常用于二维草图绘制,零件在装配体中定位,以及各种几何外轮廓的绘制。
2.三维实体建模,属性计算
三维实体建模是几何内核的基本功能。基于几何特征,几何内核需要提供完整的实体表达。最常见的长方体,根据长宽高等参数建立起对应的数据结构。以BREP为例,一个长方体至少包含如下信息:
1个体,6个面,6个环,12条边,12条有向边,8个顶点,8个顶点的坐标
这也是为什么专业软件的几何文件很小,而三维几何模型文件大的原因。
除了长方体,圆柱,圆台,圆环,球,锲形等各种基础实体模型外,各种常用的建模方法也是必须的,常见的拉伸,扫掠,放样,阵列,平移,缩放,矩阵变换,布尔运算,拆分。
创建的对象实体要提供边长,面积,体积,包围盒等基本信息。
3.历史系统
历史系统主要用来跟踪记录几何对象的变化信息。这些信息在参数建模和约束建模中要经常使用,是undo/redo机制的基础,同时也是几何模型质量的保证。
看几个例子:
一步步设计好模型后,保存工程文件,关闭程序退出。再次打开工程文件,需要undo进行编辑
一个复杂的模型,执行到某一步出现错误,整体模型坏掉,需要恢复到上一步模型完好的状态
一个模型,需要进行一些修改才能拿到某些信息,但是并不希望对模型本身进行修改
以上需求都可以通过历史系统来完成
4.属性系统
几何对象一般不会单独存在,几何对象上会有很多属性,比如颜色,显示方式,材料,业务类型,参数。对于数值仿真,还会有各种边界,荷载等信息。附加在几何上的属性系统也会涉及到增加,删除,修改,以及随几何变动而变动,比如两个不同属性的几何进行并运算,并之后新几何上的属性系统要有明确的设定。
5.参数建模和约束建模
参数建模和约束建模都很好理解。底层需要有参数系统,基本功能包含参数表达,驱动更新,参数表达式计算,几何对象参数管理,以及约束求解器等等。这些功能是CAD软件几何设计(Design)的基础,而非Drawing
几何拓扑,属性系统,历史系统,参数建模和约束建模构成了几何内核底层管理的基础。
6.几何离散化
几何内核要提供几何离散化功能,主要有两个目的:1.生成基本的三角面片信息供渲染使用;2.提供更多参数控制的面片的生成,以满足上层业务不同的需求。
7.位置运算
位置运算提供各种几何之间的位置信息计算,常见的线线,点线,线面,点面,面面,面体,线体等各个维度几何的距离,相交,交点等信息。
通常位置运算需要大量使用计算几何或数值计算方法,这也是几何内核底层的基本功能之一
8.布尔运算
布尔运算涉及到两个对象之间的合并,减,公共基本操作。在基本操作上衍生出切分,投影,缝补等操作。布尔运算主要涉及到线线,面面,面线的求交和裁剪运算,后续详细介绍。
布尔运算的准确性,稳定性和性能是衡量一个几何内核质量的重要标准
9.特征识别和抑制
识别模型中的倒角,突出,凹陷,以及常用基本几何实体,并对其进行编辑操作。
10.外部数据交换
在实际工程中,通常使用的软件和数据文件格式有多种,为了保证整体数据格式的统一,几何内核需要提供与外部的数据的接口,即能导入和导出第三方的文件格式。这一块和几何内核没有直接关系,技术上也没有太多难度,主要问题是不同数据格式的接口兼容性问题,比如公差,数据表达转换。
11.与网格接口
12.几何清理修复
除非建立封闭的生态系统,否则这是几何内核工程应用的一个基础模块。在建模工程中,因为种种原因导致模型出现问题,比如各种拓扑和几何不满足设定条件或者出现错误。这种错误会导致模型本身的分析,比如面积,体积计算出错,还会导致仿真的网格划分出现错误。
除了提供模型的拓扑几何检查外,还要提供基本的清理,修复以及必要的编辑功能。
很多时候CAD设计的模型即使没有错误,也无法用来直接仿真,比如CAD设计中的小边,小孔,倒角,印刻的字体,需要在划分网格前对其进行删除清理。
除了模型几何对象本身的错误外,实际应用中还要进行诸如几何对象之间的干涉检测,自由对象,重复对象的检测操作。这些功能可以在业务层实现,也可以在几何内核中完成。
13.图形显示接口
几何内核本身是没有图形显示系统的。换言之,几何内核创建的数据无法直观的表现出来。为了将几何对象显示,需要和外部的图形显示引擎合作。
通常的做法是将几何对象离散化面片,然后送给图形显示引擎显示。离散化的面片和几何对象建立映射关系,以方便后续的操作。
14.提供仿真所需的几何功能
比如提供抽中面,供有限元分析中的壳单元使用;三维实体简化成一维单元,供有限元分析中的杆,梁单元使用;处理非二维流体,以解决复合材料,流体,碰撞,接触分析中的共形网格;提供高次曲面以满足透平机械设计分析需求等等
15.脚本系统
提供脚本系统,便利上层应用的开发和调试
16.提供必要的调试工具
使用几何内核出错后,往往难以检查和调试,提供必要的工具帮助发现和解决错误
17.支持高性能计算
提供工具方便上层应用使用多线程,多进程以及分布式计算
为了涵盖B-Rep结构
(Boundary-Representation)的基础操作,需要定义一些基本的数据结构。参考OCC的BREP结构定义,几何上至少需要定义:
Point
Curve
Surface
Point包含基本的坐标X,Y,Z信息以及索引号。
Curve作为抽象几何定义,又可以衍生出各种形式的几何曲线,比如直线Line,圆弧Arc,椭圆弧Ellipse,样条曲线,NURBS,B样条等等。
考虑其中最简单的直线定义:
1.两端有端点的线段StraightLine;
只需定义两个端点索引即可,其它信息都可以根据端点信息算出;
2.只有一端有端点的射线Ray;
需要定义一个端点,再给出射线的方向(方向为三维向量Vector,需要单独给出定义,包括三维向量的加减乘除,归一化等等操作)
3.两端都没有端点的无线延长线InfineLine
无限直线有多种定义方式,比如函数表达式,或者给定过直线一点以及方向等。
Surface的几何衍生类也类似。
拓扑自底向上至少需要定义:
1.Vertex
2.Edge
3.Loop
4.Face
5.Shell
6.Solid
在机械加工CAM,仿真CAE,CFD,EDA等领域,我们需要知道附加在某个三维实体的属性信息(Attribute/Property),最常见的就是材料信息(Material),这类信息在几何对象进行修改时,需要继续保持其属性,因此需要一定的Cell数据结构来进行操作。
其中Face的基本定义:
Face的数据结构中至少要包含如下信息:
其中Vertex和Point,Curve和Edge,Surface和Face,拓扑和几何数据结构可以建立一定的对应关系。
定义拓扑信息的目的是将位置关系和几何关系进行关联,方便后续数据操作,比如查询,遍历,计算等。
1.建立点的信息
1.首先创建四个点坐标
2.开启3D捕捉和顶点捕捉,将点两两之间用直线相连
从视图上,我们已经可以表现出一个三维四面体实体结构了;但是这对于B-Rep结构还远远不够,我们需要将完整的拓扑结构建立出来。
2.在点的基础上构建边Edge
由点的坐标可以构建成一条直线Line,Edge可以由两点构成,Line和Edge建立映射关系,需要注意的是所有的Edge是有方向的,即一个面上的所有边的方向首尾相接而成。
3.建立环LOOP
所有的Edge可以构成一个环Loop,环最重要的特点是有方向性,可以作为内环和外环。比如一个面Face里有个孔Hole,Face的边界为外环(OutterLoop),孔的Loop为内环(InternalLoop),内环的方向通常和外环方向相反。
4.建立面Face
三条Line构成一个封闭的平面三角形Surface,Surface和Face可以建立映射关系。一条Loop就可以构建面的拓扑结构了,同样,面也有方向,右手左手准则都可以,所有面的准则保持一致即可,四根手指的方向指向Loop的方向,大拇指方向即为面的方向。Face的方向除了对显示光照有用外,对使用有限元单元方法的刚度矩阵计算和组装也非常关键。
5.建立实体Solid
有了面的信息后,就可以将所有的Face定义成一个Shell,然后将Shell封装成一个实体Solid。
这样我们就构建了一个完整的四面体B-Rep实体数据结构实例。
需要注意的是,非封闭的Shell无法构建成实体。比如一个长方体(Cuboid),在删除一个面后就不能构成实体了;从拓扑完整性上看,是不允许删除一个长方体的一个面;但有时候为了操作方便,有些前处理软件提供了Release功能,即允许删除长方体的一个面,在面删除后,实体自动退化成由五个面构成的Shell,在缺失的面补上后,又可以通过Shell生成实体Solid。
可见,如果使用B-Rep数据结构自底向上的方法创建三维实体是一件非常繁琐的事情。为了方便,一般会提供一些常用的基本实体的创建函数,比如长方体Cuboid,圆柱Cylinder,圆环Tours,圆台圆锥Cone,球Sphere等。
以上所定义的是基本的B-Rep数据结构,在这些数据结构的基础上,还可以根据实际需要或业务需求衍生或者减少数据结构定义。比如常见的实体Solid结构,如果存在大量Solid合并操作时,可以再派生出类似Assembly或者Compound实体结构。对于没有面组操作的实际业务,Shell可以拿掉。
综上所述,B-Rep数据结构是一种比较通用的三维数据结构,它能涵盖大部分三维设计工况;但也正是因为通用,数据结构尤其是拓扑设计比较庞大,在处理大模型时存在性能上的瓶颈。对于实际业务比较固定的情况,可以根据需要设计开发轻量级的三维几何数据结构。
几何曲面地位
在B-Rep拓扑结构中,我们知道实体Solid是由Face构成的,Face和Surface几何面关联(如图),因此在实体内部不存在数据,这个与体渲染形成了鲜明对比,体渲染在实体内部存在数据,也就是说用一个平面切开体渲染实体后,能够得到截面上任意一点的数据。
Parasolid几何面与拓扑面对应关系
所以从数据结构上来看,几何面的创建和处理是三维内核几何操作最核心的功能,几何面处理好了,其它几何操作都不是问题。从以下Parasolid的结构图中我们也可以看到曲面占据了几何主要地位。
Parasolid实体结构图
曲面CurvedSurface,通常包含了我们所说的各种几何面(Surface),常见的平面(PlanarSurface)是曲面的一种特殊形式。
在实际生活中我们绝少见到方方正正的设计,大部分都是需要用曲面处理。
规整的汽车
各种奇特外观建筑是曲面设计的用武之地
发动机,螺旋桨对曲面设计和制造都有非常高的要求
曲面类型
通常我们将曲面分为两种:解析曲面和样条曲面,又叫插值曲面。
很好理解,解析曲面有函数表达式f(x,y,z),即给出任意坐标值,可以准确的计算出该坐标的数据,有点类似偏微分方程的解析解,解析曲面通常可以高阶连续,在研究特定图形时很有用。解析曲面虽然是解析解,但很多时候能够构造出非常奇异的形状。如下图:
以上图片来自网络
正如偏微分方程很难找到解析解一样,工程中设计很难找到预先定义好的用函数定义的曲面,设计中更多使用的离散点生成样条曲线,再利用样条曲线构成样条曲面。
曲线类型
1.贝塞尔曲线
2.有理贝塞尔曲线
3.B样条曲线
4.NURBS曲线(非有理样条曲线)
5.T样条曲线
样条曲线1,2,3是NURBS曲线的特殊形式。设计曲线时,通常会给出一系列的离散点,再用曲线将该离散点拟合,形成不同的拟合表达式。拟合方式的不同构成不同的曲线。曲线通常使用控制点,控制点权重,基函数阶数,分段拟合表达式等来控制曲线生成。
T样条曲线(T-Spline)是在2003年出现的一种新形式的样条曲线,最早放在Rhino作为插件使用。相比NURBS,生成相同的曲线,T样条曲线只需更少的控制点,和NURBS曲线也可以互转。
T样条控制点只需NURBS的大约1/3
关于样条曲线的理论计算和设计实现可以参考附录1.
曲面生成
曲面参数
任意曲面可以建立到规则平面的映射
NURBS曲面是最通用的一种曲面形式
NURBS曲面与NURBS曲线非常相似。可以将NURBS曲面视为位于两个方向上的NURBS曲线的栅格。NURBS曲面的形状由多个控制点以及该曲面在U和V方向的阶数定义。相同的算法用于通过控制点、权重和阶数来计算形状、法线、切线、曲率和其他属性。
Parasolid中的曲线和曲面类型
了解了曲面的基本参数,下面看看在设计中如何生成曲面
1.扫掠
扫掠是规则曲面的常用方法,包括路径扫掠,自定义规则扫掠。绕轴360度旋转是一种特殊的扫掠。
圆弧扫掠生成鼓
封闭多义线螺旋扫掠
2.曲线拟合
多条曲线拟合成新面
应用场景之一:
FacesBlend操作
一个简单鼠标全部由自由曲面构成
3.模板
模板是事先定义好的曲线方程,或者控制点预先定义好的Pattern。最常见的模板就是圆角倒角。CAD软件中,用户并不需要实际设计圆倒角几何,修改简单的参数即可生成相应的倒角模型。
倒角并不是简单的球面
曲面连续性
连续性是曲面的一个重要特征,反应了曲面的光滑程度和质量。
Geometriccontinuity,通常记作G(N),N表示曲线或曲面可连续可求导的阶数。G(N)的连续性是独立于表示(参数化)的。
G0两个对象相连或两个对象的位置是连续的。G0连续(也称为点连续)在每个表面上产生一次反射,这种连续仅仅保证曲面间没有缝隙而是完全接触。
G1两个对象光顺连续,一阶微分连续,或者是相切连续的。G1连续(也称为切线连续)将产生一次完整的表面反射,反射线连续但是扭曲,这种连续仅是方向的连续而没有半径连续。我们通常的倒圆角就是这种情况。
G2两个对象光顺连续,二阶微分连续,或者两个对象的曲率是连续的。G2连续(也称为曲率连续)将产生横过所以边界的完整的和光滑的反射纹。曲率连续意味着在任何曲面上的任一“点”中沿着边界有相同的曲率半径。外观质量要求高的产品需要曲率做到G2连续,其实曲面做到这一点难度很大。
G3两边对象光顺连续,三阶微分连续等
曲面的布尔运算
曲面布尔运算是比较容易出问题的地方,主要在于面被裁剪后,一方面需要重新计算端点,曲边需要重新插值计算,造成容差问题;另一方面如果曲面在相交面上,新生成的截面在仿真划分网格时会导致网格不匹配。在曲面布尔运算时,尽可能用曲面参数计算,对于存在非二维流形和截面的情况,需要保存双面的映射关系,而不能仅仅让B-Rep结构来处理。
曲面的显示
曲面曲线的显示类似于圆弧和圆面的显示,圆弧需要将曲线离散成小段直线,圆面需要离散成三角形,圆周为连接的小线段。需要注意的是边界离散长度确定,通常利用弦高比,即计算曲线上点的切向和角度。参考OCC里网格生成方法:
对于设计类CAD软件,曲线的显示最好能采用矢量方法,以避免视图显示和实际几何产生误差。
软件参考
商业软件方面,一般三维CAD软件都有曲面建模功能,但从工业软件和总体功能和效率上看,犀牛Rhino和CATIA在曲面建模上更有优势。
总结
附录
1.计算机辅助几何设计与非均匀有理B样条,作者:施法中
2.曲面几何学,作者:John·Stillwell
3.曲线与曲面的微分几何,作者:ManfredoP.DoCarmo
布尔运算是三维几何内核的一个基本功能,其功能,稳定性,性能直接反应了内核的质量。
本文分三个部分来讲:
1.布尔运算的基本原理和算法
2.布尔运算里的一些高级功能
3.OCC的布尔运算功能
常见的三种布尔运算:并集,交集,减集。其实这三种布尔运算的前面运算逻辑是一样的,最后一步不同。
1.并集就是把两个物体合并成一个物体
2.交集是求两个物体公共的部分
3.减集是从一个物体中减去两个物体公共的部分
为了简化描述,我们只讨论实体Solid和实体Solid的布尔运算,其它类型几何之间的计算类似(比如面Face和实体Solid,面Face和面Face)。
布尔运算基础算法涉及到的计算有:
1.几何面的相交计算,需要得出交点,交线等几何信息;
2.基于原始拓扑结构,对Face面进行裁剪;
3.裁剪区域Edge边和顶点Vertex的拓扑重建。
整个计算流程如下:
1.判断两个实体是否有重合。为了加快计算效率,可以首先使用包围盒进行过滤,即包围盒如果不相交,则两实体一定不会相交;还可以判断一个实体的点是否在另外一个实体里,如果在那两实体一定相交,这些加速算法可以在任一拓扑层级进行,后续再做详细介绍。
2.假设已经确定两个实体相交,遍历一个实体的面,计算每个面和另外一个实体的面的相交情况。面面相交通常是一条线Curve
3.将所有相交的线Curve分别加到原来的两个实体Solid上
4.根据实际操作需求(并,交,减),对两个对象进行裁剪以及重新生成新的拓扑结构。
以两个长方体布尔并运算为例说明
布尔运算一般是两个物体,按照顺序习惯将第二个物体叫Tool,也就是加工工具的意思,第一个对象OCC里叫Object,PS里叫Target,ACIS里叫Blank。
初始两个相交的立方体A和B
计算出所有相交面的边,将拓扑边和几何信息加到物体A上
计算出所有相交面的边,将拓扑边和几何信息加到物体B上
交集:只需要把计算出的公共部分进行拓扑重建即可
并集:将公共部分的拓扑和几何去掉,保留A和B,拓扑重建
减集:将对应的原始部分去掉公共部分即可,拓扑重建
这里只是介绍了基本的布尔运算,实际中会有更多需要处理的复杂情况:
1.非二维流形的处理
2.高阶曲面的求交精度问题
3.不同维度几何求交,线面求交,线体求交
4.复杂几何拓扑重建
5.求交性能问题
6.布尔运算顺序
1.Chop运算:
Chop,顾名思义就是削除。它是布尔交和布尔减得合集。
2.不同维度对象的布尔运算:
前面介绍的是实体Solid和Solid的运算,在实际中有大量的面Face和实体Solid,Edge边和面Face,Edge边和实体Solid的计算。底层计算本质上也是一样的,只是拓扑重建步骤不同。
3.Imprint运算:
压印,通常我们需要把线或者面放(印)到另外一个对象上。
4.Cell结构:
Cell结构在B-Rep结构提出之后不久就被提出来。Cell结构对应于实体Solid,主要用来保留,编辑,追溯Solid实体的属性信息。
5.Split运算:
Split分割操作可以将一个实体Solid分成两个或多个实体。本质上也是一个实体Solid和面Face的布尔运算
6.Glue运算
在某些情况下,我们知道两个对象的一些特征,比如两个大的模型,都只在某个面上有重合,可以采用Glue粘贴操作,也就是指定Glue的拓扑,只在特定位置进行布尔计算,这样可以大大提高操作效率。Sew也是同样的道理。
7.Fuzzy布尔运算
也就是模糊布尔运算,在某些场合通过设置一定的容差和参数,可以稳定的处理模型接触地方近似一致,轻微干涉,不对齐的情况
8.性能提升
布尔运算是一种非常耗时的运算,所以在针对大规模和特定场景时,需要用一定的加速算法来提升性能。
在机械加工中,要在某个复杂的对象A上钻100个孔,这是一个典型的布尔减运算。通常做法是创建孔的几何,然后再一个一个的执行布尔减运算。由布尔运算算法得知,每次运算都需要遍历几何的面进行面面相交计算。如果我们先将孔进行并运算得到B,然后再用A布尔减B,虽然面面相交计算次数没有减少,但是相应的各种过滤和无用算法调用次数会减少很多,能显著提升计算性能。
笔者多年使用PARASOLID,ACIS和OCC,考虑到前两者都是商业内核,就不展开描述了。
需要说明的是PARASOLID,ACIS,OCC都是通用三维几何内核,在布尔运算方面也都是中规中矩的运算,针对很多实际业务时性能并不一定最优,还有很大的改进余地。之前见过一些做几何内核公司,拿特定的布尔运算和测试用例做性能比较,得出PARASOLID和ACIS布尔运算性能较差的结论,其实意义不大。不过这也说明如果能开发专业而非通用的几何内核,在业务上可以大幅提升性能。
稍微介绍下OCC里的布尔运算:
经过多年的发展,相对于早期的版本,OCC在布尔运算上可以说是有了质的飞跃。以7.3版本为例,实际应用中,包含两个对象的100M以下的STEP文件导入后,布尔运算可以稳定的实现,虽然相比ACIS和PARASOLID性能方面还有不少差距。
在OCC的文档中,有一篇文档
对CAE工程师而言,几何修复清理是一个比较头疼的工作。因为这项工作不确定性因素很多,不仅要求工程师对几何数据和修复工具比较熟悉,对经验也有较高的要求。
相对于三维几何其它内容,几何修复清理是一门操作性和实践性较强的工作。
下面说明几种常见的几何修复清理场景:
1.从外部导入的三维模型数据,在导入的过程中,因为转换问题比如精度,单位,数据不兼容等出现数据丢失,转换误差,模型损坏等。
2.模型本身有问题,比如画线的时候没有使用捕捉,导致线线不连接;模型里几何应该对齐,但是因为容差导致出现细缝和小边;曲线处理不当导致模型几何之间出现干涉;模型数据不完整,导致出现实体面丢失,拓扑不完整和几何数据出错,出现自由边,自由面,重复对象等。
3.仿真中不需要或者对网格划分影响较大几何特征,比如倒角圆角,logo等,细小边,面,体都需要在保证拓扑几何完整正确的前提下移除。
4.无用几何数据。比如做飞机外流场仿真,只需要模型的外表面几何数据。而内部的诸如发动机零部件等都可以省去。可以直接删除内部几何,对于局部完整数据可以直接用其它模型替代。
5.模型对象之间位置偏差,之前提到的模型之间的干涉,细缝等,对于复合材料,多物理场以及装配体,接触碰撞分析都是必须要修复的内容。
一般的三维CAD软件中都会提供几何修复功能,专业的几何修复软件比如
CADDOCTOR,CADFIX也都专门针对几何清理,还有一些专业的前处理软件比如HyperMesh,ANSA等几何修复清理也是必备功能,有些仿真软件也会提供基本的几何修复清理。但是这些软件的侧重点不太一样,CAD软件的主要目的是将几何拓扑修复干净,保证没有错误;而前处理器和仿真软件则是需要保证网格划分所需的输入几何正确。
在笔者看来,几何清理修复分为两种,分别是技术上和工程上的。
技术上是指把错误的对象修复正确,无用的对象清理干净,解决容差问题等,这个很好理解。
而工程上是指不一定要把错误的对象修复正确,而是采用一切手段将模型清理修复到一定目标即可。
举几个简单例子:
从第三方导入的模型有问题,首先想到的是将模型导入到模型创建软件中,在软件中进行编辑,这样的好处是可以无损编辑,最大可能的保留原始模型信息,比如历史信息,参数信息。也可以解决因为软件版本不同,设置不同以及机器环境等造成的问题,有点类似于常说的第一性原理,把问题解决在最开始的地方。
如果做不到的话,在导入模型后,首先进行分析,分析出错的地方,能不能删?用简单模型替代?只做部分修复?用已有的网格替代?通过简单的平移,旋转,缩放等操作解决?通过修改容差解决?设置一些异常属性,比如结构分析中当做刚体使用,对称阵列结构能不能使复制正确的对象粘贴?等等。这些操作并不是一定要修复错误,而是保证整体模型可供后续仿真使用即可。
从研发的角度看:
总的来说,几何修复清理功能是三维几何内核一个可选模块,也是CAE/CFD前处理软件中的一个重要功能,前处理软件主要是导入几何,修复几何和生成网格,少有直接在前处理器中建模。由于该工作很大程度上依赖于业务,因此三维几何内核一般只提供比较基础的检查,修复功能,更多的是在内核的基础上建立适用业务的功能。
本文介绍一些几何内核经常使用的一些技术内容.
1.树结构
以平面为例,如图有大量的图元数据,在软件中执行选择操作的时候,需要对每个图元进行计算,判断鼠标位置和图元的关系。可以预先将图元结构放入四叉树结构中,首先判断鼠标和四叉树是否相交,加速过滤,避免进行全局计算,三维空间八叉树也是同样的道理。
四叉树,八叉树除了用来加速过滤,还可以用来查找,生成有限元中的网格。在标准四叉树八叉树的基础上,又衍生出了各种树的变种结构。常见的有KD树,BVH,R树,BSP树等,基本原理也都是利用分治来加速对象过滤。
一般来讲,数据越多,加速效果越明显。在以往测试中,千万级别的三维图元数据,通过合理的八叉树结构加速,查找次数可以降低几个数量级不到千次的查找。
2.容差控制
容差控制是几何内核的一个重要内容。容差设置决定了能处理模型的最大和最小范围,邻近的两个点在计算(比如布尔运算)中是否会作为一个点,相邻的两个面是否作为一个面,点是否在面上,进而决定了几何拓扑的构建和整个模型是否有效。特别是针对样条曲线和曲面,容差出现问题,会导致一系列难以修复的问题。通常容差在整个模型初始时会设置好固定值,但有时候会有修改的需求;在几何内核端需要做好设计,做一定的保护机制,防止修改造成的各种问题。
3.数值精度
C++的数值精度通常float型为6位有效,double型16位有效。在几何建模中一般使用double型数据,double型能满足大多数建模精度需求,但有少数情况不满足计算精度,比如多尺度建模,超大数据模型,细度网格划分等,要引入类似GMP,BigNum等数值库对数据进行更精准的控制。
需要注意:容差控制和数值精度是两个概念,避免混为一谈。
4.复杂建模
复杂建模是相对于简单的三维实体(Primitive)而言,比如放样,扫略,镂空,中面提取,Blending,offset。这一块看起来很复杂,其实在几何内核里相对来说还是比较简单的部分,主要涉及到拓扑和几何数据的重建,基础功能做的好的话,这块基本不会有什么问题。
5.面片生成
6.数据库系统
这里的数据库系统主要是用来管理数据,主要是在几何内核使用过程中对象创建,编辑,销毁等生命周期,历史消息维护管理,不是一般的关系型数据库。利用该数据库系统可以帮助上层实现类似undo/redo,历史信息查询,数据保护等。这个也是上层看不到,但是底层比较核心的功能之一。
7.微分几何和拓扑学
拓扑学是研究几何图形或空间在连续改变形状后还能保持不变的一些性质的学科。它只考虑物体间的位置关系而不考虑它们的形状和大小。在拓扑学里,重要的拓扑性质包括连通性与紧致性。
几何内核常用的欧拉公式和非二维流型都来自拓扑学。
若G为一连通之平面图,则V+F=E+2
其中V代表G中点的个数,F代表G中面的个数,而E是G的边数.
有朋友问,经常看见你提到几何内核和业务的关系,业务到底是什么东西?
做结构前处理的朋友一定非常熟悉壳单元,壳单元在有限元分析中是二维面单元,但几何数据通常为三维实体,所以需要把实体结构变成面结构,也就是类似把一个长方体变成一个长方形,有多种处理方法,一般是选取需要处理的面的中面,这样在结构上可以最大程度保持位置正确,也就是通常说的“抽中面”。
在几何内核处理上就需要根据实体信息,重新生成只有面几何的Shell拓扑结构,再将Shell通过合理布尔运算生成仿真需要的面结构。
“抽中面”就是一个典型的业务操作,最好在内核端提供支持。
9.第三方接口
常用的三维几何数据格式包括商业的sat,x_t,以及通用的igs,step以及各种三维CAD软件的数据格式。这一块其实没有太多技术难度,主要是工作量的问题,在数据转换过程中需要注意文件标准,一系列转换属性设置,比如单位,容差等。
好的几何内核是需要融入生态的,也就是要和第三方数据有接口进行互读互写。
GeometricConstrainedSolver(GCS)
几何约束求解器
几何约束求解器一般不作为三维几何内核的一个模块。商业几何约束求解器往往作为一个单独产品销售。几何约束求解器是CAD设计功能的一个基础模块。
本文简单介绍一下几何约束求解器GCS的基本知识。
曾经有一个朋友问到,二维CAD软件不就是画类似圆,直线图吗?现在还有技术瓶颈吗?
确实,现在二维CAD软件已经非常普及,而研发技术门槛也是一降再降,但是二维CAD还是有许多可以做的事或者优化空间,比如大规模场景管理优化,图形生成算法改进,渲染效率提升,行业CAD开发,上云,Saas,AI识图等,还有就是本文要介绍的几何约束求解器。另外类似标注排版,参数计算,容差设计,脚本系统,用户交互(拾取,捕捉,快捷操作等),硬件支持,跨平台等许多技术细节从头做要做好也非易事。
比如要建立一套可靠的参数系统,自己从头写商用耗时耗力。简单的参数系统就是可以自己定义变量并赋值,在实际使用的时候能用变量替代实际数据,而修改变量时,则整个程序中使用该变量都会修改。参数系统需要支持各种计算表达式和脚本系统,其开发涉及到词法语法解析,正则表达,软件框架设计等,从底层详细介绍的话写一本书是没问题的。
再比如标注排版系统,也就是一堆图元文字放在一起,按照一定规则排列,看起来是个非常简单的事情。但深究的话也涉及到了图论,约束优化算法等。
以上除了要实现基本功能外,还需要考虑到最重要的性能时效问题,对用户来说,设计阶段操作太耗时(点一个按钮等上1分钟),功能是没有实际用处的。
话说回来,如果二维CAD真的那么好做,也就不会有那么多基于IntelliCAD开发的商业软件了。
说个题外话,曾经有圈内朋友吐槽国内某公司使用IntelliCAD做开发,没有核心技术,还做上市了。其实大可不必,我们最终提供给用户的是产品,如果能集中有限的资源,开发出产品帮忙用户解决实际问题,比光喊“自主”口号强的多。一切照章办事,就没有什么可吐槽的。但是如果一开始明知有风险,后来出问题了又喊“卡脖子”就是另外一回事了。
还是那句话:工业软件也是商品,靠的是质量,最终服务的是客户!
这就是为什么笔者一直强调的:中国将来的仿真巨头一定是有自己核心技术,旗舰产品,讲究产品细节,服务于全球客户的公司,而不是其它。
而现在在工业软件领域经常讲的所谓“自主可控”,相当一部分是营销的幌子,或是“低质量”的挡箭牌,需要擦亮眼睛识别。
在CAE软件中,有一类仿真分析是针对刚体运动,比如ADAMS,
刚体运动计算和CAD中的几何约束设计类似,只不过前者需要考虑各种外力(比如重力和物理因素影响),看重仿真模拟,偏向基于物理数学方程求解,而后者着重在几何计算和设计,算法实现上更偏向于数学方法。
狭义上,我们通常讲的GCS主要是为CAD设计服务;广义上,GCS就是用来求解多(刚)体动力学的。
在'十四五'软件和信息技术服务业发展规划,关键基础软件补短板的专项行动中,首次提到了约束求解引擎,并将其定义为'关键技术'。
二维GCS,又叫草图几何约束求解器,简称草图约束,它描述的是在二维平面设计时所用的几何约束功能。
二维里常见的三种约束类型:
尺寸约束:点点距离,点线距离,线线夹角,圆弧长度,圆和圆弧半径
结构约束:线水平或垂直,两线平行,线和圆相切
业务约束:用户自定义参数变量之间约束。
以下是开源参数化建模工具SolveSpace里列举的约束类型:
约束求解对用户最简单直观的表现就是在创建对象时候的捕捉设置。
考虑三维,约束内容除了从平面坐标扩展到三维坐标外,还有面面距离,面面垂直,点面距离,球形曲面于平面,直线相切以及共轴共点共面。
还是以CAD设计的GCS为例,通常用自由度,约束度,剩余自由度,和约束关系内容来记录每个对象的状态(这里的自由度和刚体运动的自由度相同,而非有限元中的单元节点自由度),用来记录图元的任意时刻的状态,并将状态用图来表示,最后求解图:
简化的约束求解活动图
GCS在技术上其实比较成熟,目前GCS的工作内容还是在已有求解方法的改进,性能提升和根据业务功能拓展上。在这个领域也有不少开源的工具,比如SolveSpace,chrono,ODE等,有兴趣的朋友可以参考。
这一块其实也是三维几何内核的一个基础内容,它包括了线线,线面,面面,线面实体的各种位置关系(重合,包含,干涉),相交(交点位置,个数),距离(最近点),这些内容是内核其它操作的基础(比如布尔加速运算中,要提前判断两物体是否相交,是否重合,重合的范围等等);
也是其它上层应用的基础:比如常用的鼠标捕捉拾取操作,基本原理是从鼠标点位置垂直视图创建一条射线,然后判断射线和视图内几何图元的相交情况。如果某图元在容差范围内和射线相交,则可认为被鼠标拾取,然后后续进行高亮等操作。
简单分析一下几何内核未来的一些发展趋势,注意是几何内核
(CADkernel),不是CAD软件:
几何内核发展到今天,其技术基础和市场环境都相对稳定。造成柯达,诺基亚等厂商没落的颠覆式技术出现的可能性非常小。翻阅ACIS/PS/OCC过去十年的releasenotes,从改进的数量,内容以及影响力看,就会发现,几乎都没有像样的功能大改进。其中PS提出的ConvergentModeling概念,从技术角度看只是BREP数据和面片数据的进一步融会贯通。而通常所说的GenerativeDesign属于应用层面的内容,和几何内核没有直接关系。
1.提升性能。早期的内核数据结构设计并没有考虑到硬件的发展,默认按照当时的单CPU单核设计。而现在多CPU多核,分布式,GPU计算已经相当成熟。多线程已经在使用,但也只是基于一定接口使用,由于历史原因,这块商业和开源内核底层改进进度都比较缓慢。现在除了工业设计仿真软件外,很多业务场景对实时性都提出了很高要求,目前这一块几何内核还达不到要求。纵观近十年技术领域的发展,相比于人工智能,机器视觉,大数据,互联网的发展速度,几何内核的更新和发展速度可以算得上是龟速了。
2.进一步轻量化。PS提出的ConvergentModeling的初衷就在于高效的处理三维打印数据,因为三维打印数据为海量三角面片,用纯BREP结构表示性能低下。而CM正是通过简化BREP数据和操作,并融合面片数据,来处理这个矛盾。根据需求进一步简化或者轻量化数据结构,类似于“外科手术”式精准操作。
4.业务融合。利用商用内核开发通用CAD软件其实性价比已经非常低,风险也很大,除非能在应用层整出点花样出来。通用三维几何内核提供了丰富的功能,但一般的仿真软件实际上能用得上的只有一小部分,性价比很低。所以未来如果开发几何内核可以和业务融合,根据业务情况建立更符合实际的内核结构和功能。早期的CFD前处理软件就是一个很好的例子。因为CFD通常需要处理的是表面数据,所以不需要基于BREP的结构,一般的CFD前处理器会自己构建一套几何数据系统。
5.人工智能。几何内核在拓扑跟踪,特征模式识别,对象计算,参数建模,约束求解方面是有一定的固定模式的,AI是可以发挥作用的。
需要说明一个观点或认识:在欧美工业软件研发行业,有很多细分领域由某些小公司主导,这些小公司常年在某个领域耕耘,能提供更专业的组件和技术。被ANSYS以7.5亿美金收购的LSTC(核心产品LSDYNA)最多人数不过百人;而流固耦合做的好的ADINA公司人员在二三十人;被techsoft3d收购的VKI公司人员常年保持在个位数。而大厂一般因为性价比或者壁垒,不太愿意在这些细分领域投入研发,往往选择购买或者成熟后收购。但这并不意味着大厂没有能力做这些事,不必过分拔高这些细分领域的技术难度。
针对三维几何内核,在产品开发,技术选型以及公司战略规划上,如果对几何内核技术细节不了解,就很容易陷入诸如:
1.ACIS和PS必须二选一么
2.OCC是否能替换一下
3.自己开发是否风险太高
之类的困惑
“在选择使用三维几何内核上,国内工业软件公司采取什么样的策略”
如果业务本来不太需要内核,而购买了商业产品,浪费钱;而真正需要商业内核时候,选择了开源或自己开发,产品失败风险高;总的讲,还是要非常了解自己的业务,并对几何内核技术细节有一定的认识,在此基础上才能选择合适的策略。
BoundaryRepresentationModelling
TechniquesbyIanStroud
几何计算何援军
计算几何算法设计与分析周培德
从选择理发店说起
之前每次理发进美容店,穿的跟空姐一样的服务员第一句话就是:“请问您有选择好的老师吗?”,听着非常别扭,在我看来,站在讲台上传道受业解惑,教书育人的才是老师!后来理发就选择了一个较远的街边摊,理发的是个老师傅,不仅手艺好还便宜,刮胡子还是一绝。
我们说开发三维几何内核,一定是通用型的工业级的应用。如果开发的功能连ACIS/PS的1/5都达不到,那不叫几何内核,只能叫软件的一个模块。
1.开发自主的三维几何内核需要多少投入?
仍然以目前主流的商业三维几何内核为例,按照60分的标准对标,也就是主要功能性能指标要能达到60%-70%。