深入剖析三维几何内核(7)--几何约束求解器
深入剖析三维几何内核(8)--属性关系计算
Geometric Constrained Solver(GCS)
几何约束求解器
几何约束求解器一般不作为三维几何内核的一个模块。商业几何约束求解器往往作为一个单独产品销售。几何约束求解器是CAD设计功能的一个基础模块。
本文简单介绍一下几何约束求解器GCS的基本知识。
曾经有一个朋友问到,二维CAD软件不就是画类似圆,直线图吗?现在还有技术瓶颈吗?
确实,现在二维CAD软件已经非常普及,而研发技术门槛也是一降再降,但是二维CAD还是有许多可以做的事或者优化空间,比如大规模场景管理优化,图形生成算法改进,渲染效率提升,行业CAD开发,上云,Saas,AI识图等,还有就是本文要介绍的几何约束求解器。另外类似标注排版,参数计算,容差设计,脚本系统,用户交互(拾取,捕捉,快捷操作等),硬件支持,跨平台等许多技术细节从头做要做好也非易事。
比如要建立一套可靠的参数系统,自己从头写商用耗时耗力。简单的参数系统就是可以自己定义变量并赋值,在实际使用的时候能用变量替代实际数据,而修改变量时,则整个程序中使用该变量都会修改。参数系统需要支持各种计算表达式和脚本系统,其开发涉及到词法语法解析,正则表达,软件框架设计等,从底层详细介绍的话写一本书是没问题的。
再比如标注排版系统,也就是一堆图元文字放在一起,按照一定规则排列,看起来是个非常简单的事情。但深究的话也涉及到了图论,约束优化算法等。
以上除了要实现基本功能外,还需要考虑到最重要的性能时效问题,对用户来说,设计阶段操作太耗时(点一个按钮等上1分钟),功能是没有实际用处的。
话说回来,如果二维CAD真的那么好做,也就不会有那么多基于IntelliCAD开发的商业软件了。
说个题外话,曾经有圈内朋友吐槽国内某公司使用IntelliCAD做开发,没有核心技术,还做上市了。其实大可不必,我们最终提供给用户的是产品,如果能集中有限的资源,开发出产品帮忙用户解决实际问题,比光喊“自主”口号强的多。一切照章办事,就没有什么可吐槽的。但是如果一开始明知有风险,后来出问题了又喊“卡脖子”就是另外一回事了。
还是那句话:工业软件也是商品,靠的是质量,最终服务的是客户!
这就是为什么笔者一直强调的:中国将来的仿真巨头一定是有自己核心技术,旗舰产品,讲究产品细节,服务于全球客户的公司,而不是其它。
而现在在工业软件领域经常讲的所谓“自主可控”,相当一部分是营销的幌子,或是“低质量”的挡箭牌,需要擦亮眼睛识别。
在CAE软件中,有一类仿真分析是针对刚体运动,比如ADAMS,
DADS(LMS Virtual Lab),刚体运动也就是物体本身不发生变形(比如我们高中时学的动量守恒之类的运动都是简化的无约束的刚体运动,参考一篇文章入门多物理场有限元(全篇)),基于对象之间的几何形态,相互连接关系,计算物体的运动情况,比如接触,碰撞;除此之外,还要时间,位移,速度,加速度等,以及受力状况,为其它类型分析准备输入数据。
刚体运动计算和CAD中的几何约束设计类似,只不过前者需要考虑各种外力(比如重力和物理因素影响),看重仿真模拟,偏向基于物理数学方程求解,而后者着重在几何计算和设计,算法实现上更偏向于数学方法。
狭义上,我们通常讲的GCS主要是为CAD设计服务;广义上,GCS就是用来求解多(刚)体动力学的。
在"十四五"软件和信息技术服务业发展规划,关键基础软件补短板的专项行动中,首次提到了约束求解引擎,并将其定义为"关键技术"。
二维GCS,又叫草图几何约束求解器,简称草图约束,它描述的是在二维平面设计时所用的几何约束功能。
二维里常见的三种约束类型:
尺寸约束:点点距离,点线距离,线线夹角,圆弧长度,圆和圆弧半径
结构约束:线水平或垂直,两线平行,线和圆相切
业务约束:用户自定义参数变量之间约束。
以下是开源参数化建模工具SolveSpace里列举的约束类型:
约束求解对用户最简单直观的表现就是在创建对象时候的捕捉设置。
比如:已生成一条直线,再画一条直线与其垂直。确定一点后,另一点的鼠标在移动过程中需要反复计算垂直约束是否满足。而垂直计算就涉及到最基本的对象位置关系计算。这一点在深入剖析三维几何内核(9)--未来发展趋势提及过。三维几何内核的曲线曲面有两种表达:方程式和离散式(深入剖析三维几何内核(4)--曲面的艺术)。所以约束在求解上需要支持线性方程组和非线性方程组。
考虑三维,约束内容除了从平面坐标扩展到三维坐标外,还有面面距离,面面垂直,点面距离,球形曲面于平面,直线相切以及共轴共点共面。
还是以CAD设计的GCS为例,通常用自由度,约束度,剩余自由度,和约束关系内容来记录每个对象的状态(这里的自由度和刚体运动的自由度相同,而非有限元中的单元节点自由度),用来记录图元的任意时刻的状态,并将状态用图来表示,最后求解图:
这个过程中涉及到了参数表达驱动,大量的位置判定,计算迭代,以及图论相关和线性非线性方程组的求解。计算结果可以是确定的,也可以是方程。所以还会涉及到符号表达计算。
在实际设计中,会涉及到多重约束,即多个图元相互关联,当这种约束过多时,性能就会成为一个瓶颈。CAD的GCS,时效性是一个需要考虑的重要因素,毕竟用户可以等待CAE仿真,但在CAD设计阶段,一个命令等待时间太长是不太合理的。
GCS在技术上其实比较成熟,目前GCS的工作内容还是在已有求解方法的改进,性能提升和根据业务功能拓展上。在这个领域也有不少开源的工具,比如SolveSpace,chrono,ODE等,有兴趣的朋友可以参考。