OpenCASCADE BRep Precision
eryar@163.com
Abstract: Several geometric representations maybe attached to a topological(B-Rep) object. These representations are similar but rarely identical. For modeling algorithms, it is necessary to know exactly the precision associated with this approximation. The numeric value of this precision is called tolerance. It defines the zone in which all geometrical representations of the object are located.
Keywords: OpenCASCADE, BRep, Precision, Tolerance
1 Introduction
在计算机中表示浮点数是有精度限制的,浮点数的相等比较一般使用邻域比较技术,就是在指定精度的前提下比较两个浮点数是否相等。在边界表示法BRep中同一个拓朴体可以附加几种几何表示,如拓朴点Vertex有如下几何表示方法:
- 一个三维点;
- 一条曲线和曲线上的参数u;
- 一个曲面上的一对参数u,v;
这几种几何表示方法表示的是同一个对象,但因为浮点数精度限制,这几种几何数据并不能完全相同的。对于造型算法有必要知道拓朴体上的精度值。BRep上关联的精度值称为容差Tolerance。Vertex点的容差是包围点且以精度值为半径的球体;Edge边的容差是包围曲线且以精度值为半径的管道;Face的容差是包围曲面且以精度值为厚度板:
精度是几何造型内核一个重要指标,且影响数值算法性能及稳定性Robust。在OpenCASCADE中,精度还有一个要求:
2 Unit and Precision
对于几何内核中的数值1代表什么,一般人可能习惯性地将其与毫米mm单位关联,觉得是1mm。建模时单位的选择会对精度有很大影响,因为不同单位会导致数据小数位数的变化。如对芯片内部结构建模,芯片的尺度是纳米,若以毫米以单位,则要构造出芯片内部有些结构,对几何内核精度要求会更高;若以纳米为单位,则对几何内核精度要求会低些。
由此可见,几何内核中的数值1无单位的,需要根据模型的尺度选择合适的单位。单位只针对三维模型空间中的曲线曲面,由于曲线曲面用参数方程表示,所以曲线的参数空间是一维空间,曲面的参数空间是二维空间。参数空间的数是没有单位的。如一个圆,不管其位置和半径如何,其参数空间总是从0~2PI。所以在设置精度时,需要区分是模型空间还是参数空间。
3 BRep Precision
在OpenCASCADE中通过类BRep_Builder来设置边界表示法中包含几何信息的点、边和面来设置容差。如设置面的容差函数为:
修改容差也可以通过类BRep_Builder中的Update相关函数,更高级直接的修改容差的类是ShapeFix_ShapeTolerance。
查询容差需要使用类BRep_Tool:
从查询容差函数的实现代码中可以看出,在OpenCASCADE中容差的最小值是Precision::Confusion(),即1.e-7。即使设置的容差小于1.e-7,查询容差的时候也是1.e-7。即OpenCASCADE中BRep表示的建模极限是1.e-7。如以米为单位,要去对纳米的物体建模,在OpenCASCADE中是做不到。
5 Primitive Tolerance
使用OpenCASCADE内置的构造基本体的算法来构造BRep体时,默认的容差值就是Precision::Confusion(),(1.e-7)即使用了最高精度。如创建圆锥体时其高度Height值最小为Precision::Confusion()。
创建长方体Box时各边长度的最小值也是Precision::Confusion():
4 Geometry Precision
在OpenCASCADE中几何曲线和曲面都是用参数方程来表示的,几何的意思就是数学方程,是精确的数学表示没有容差。
但是几何相关的算法如求交Intersection、投影Project及定位Classifier都与精度密切相关。如定位算法Classifier判断点是否在线/面上等。而求交的算法实现都是数值方法,数值算法的迭代次数和终止条件都与精度直接相关,从而影响算法性能及稳定性。如计算解析曲面求交算法中默认容差:
解析曲面几何求交算法中的默认容差:
有些容差值是写在代码中不能修改,这些容差值都要比BRep中的极限容差值1.e-7要小,即几何算法中硬编码的一些容差要小于BRep中的容差值。由此可见几何算法中的精度要高于BRep中的精度,从而保证算法的正确性。
6 Fuzzy Tolerance
在布尔运算中,BRep体的容差值会作为几何算法的精度输入。在Draw Test Harness中可通过如下命令设置容差:
Draw[1]> help settolerance
settolerance : shape [mode=v-e-f-a] val(fix value) or tolmin tolmax
Draw[2]> settolerance s1 a 0.001
下面以两个模型做布尔减CUT操作为例,看看不同的容差布尔支算所需要时间有什么不同。通过左边Tcl脚本导入两个模型,再使用命令settolerance设置容差为0.01,最后布尔运算花费0.2414661秒。
将命令settolerance注释掉,使用模型默认容差1e-7,看所需要的时间:
从上面的例子看到容差的提高所需时间没有太大区别。若BRep的容差会作为几何算法的容差输入,理论上设置BRep容差会对布尔运算有影响。
在二次解析曲面求交的数值算法中,容差参数直接省略没有使用。在二次解析曲面求交的几何算法中,容差主要用来判断一些接触时是否相交。在更底层的数值算法库math中使用了内置硬编码的更高的精度。如下图所示为多项式求根的数值算法中内置的精度为1.0e-30,远高于BRep中的1.0e-7。这样做避免了BRep容差对底层算法的影响,但是高精度牺牲了一些数值算法性能。
由此可见,容差主要影响接触时情况的处理,处理结果直接影响求交的结果。在布尔运算中使用默认容差为1e-7不相交的,但实际应用场景只要1e-3的容差,则会相交。会导致布尔运算结果与预期不符。为了提高布尔运算稳定性引入Fuzzy容差的概念。在相交计算中Fuzzy容差的使用代码如下:
其他相交计算中关于Fuzzy容差的处理都是类似的,具体可以参考类IntTools_EdgeFace和IntTools_FaceFace。通过引入Fuzzy容差设置,在原有BRep容差基础上加上Fuzzy/2来扩大容差范围,可以处理布尔运算中接触的情况,提高布尔运算稳定性。下面使用Tcl脚本演示Fuzzy容差的使用场景:
box b 10 10 10
pcylinder c 5 20
ttranslate c 5 5 0.00001
bfuzzyvalue 0.00001
bcut r b c
当使用布尔运算标准容差时,可以把bfuzzyvalue这行注释掉。
创建一个长方体和圆柱体,并将圆柱体沿Z方向移动0.00001。
上图左边为使用标准容差,默认为1e-7。右边为设置Fuzzy容差效果。
7 Conclusion
综上所述,几何内核中的数是没有量纲的,可以根据模型的尺度选择合适的单位。OpenCASCADE中BRep体模型最小建模精度为1.e-7。几何数据使用参数方程表示,是精确的数学表示,但是几何算法是有精度的。有些几何算法中有些精度是硬编码的不能修改,这类精度值都要高于1.e-7。有些精度是通过BRep中的拓朴点,边和面传递过来的。为了提高布尔运算的稳定性,引入Fuzzy容差,解决一些接触的容差问题。
8 下载PipeCAD
现在可以直接在Github上下载PipeCAD个人版免费使用:
https://github.com/eryar/PipeCAD/releases
国内用户可以加入PipeCAD QQ交流群964851855,在群文件中下载PipeCAD最新版本。
PipeCAD自带Sample示例项目,可以通过用户SYSTEM,密码XXXXXX来登录项目体验PipeCAD。关于PipeCAD的使用方法可以先查看PipeCAD相关的操作视频:
https://space.bilibili.com/1548012589
欢迎大家下载使用,反馈意见或参与开发,来一起完善PipeCAD。大家可以扫描下方二维码加入PipeCAD QQ群,一起交流使用PipeCAD的经验心得。PipeCAD QQ交流群 964851855。
注意事项:目前PipeCAD正处于测试阶段,建议根据需要将项目数据进行备份,以防数据丢失。