OpenCASCADE 投影生成PCurve
Abstract: Geometry Curves and Surfaces in BRep are parametric equations. So given a parametric space curve and a geometry surface can map to a 3d geometry curve. The parametric space curve is PCurve. When given a 3d geometry curve and surface, how to get the PCurve?
Keywords: BRep, PCurve, Project
1 Introduction
在几何造型内核OpenCASCADE中,几何曲线和曲面都是以参考方程的方式精确表达。在几何曲面上任意画一条曲线,在曲面的参数空间(U, V)都有对应的一条参数曲线PCurve。通过参数曲线可以容易地计算空间曲线,若已知几何曲面及曲面上的一条曲线,如何求出PCurve呢?
PCurve是几何内核中BRep的一个重要概念。将几何曲线生成Edge是没有PCurve的,只有将Edge生成Wire,再用Wire来限定几何曲面来生成Face时,Edge才需要有PCurve。如果在用Wire来限定曲面时没有生成PCurve,则生成的Face显示会有问题,布尔运算会有问题,即这个Face是有问题的。
在用类BRepBuilderAPI_MakeFace生成Face时,会用几何曲面的参数边界Bounds来生成PCurve。如果指定曲面和Wire来生成Face时,是没有生成PCurve的,如下图为一个圆柱面及圆柱面上的Wire生成的Face,显示是有问题的:
图右边是对应的Tcl脚本。即如果通过这种方式来生成Face,Edge中的PCurve由自己负责。
2 GeomProjLib
在OpenCASCADE已知曲面和曲面上的曲线,生成PCurve使用类GeomProjLib:
这里Project投影的意思是计算参数空间曲线的意思,不是模型沿指定方向投影得到平面上的线的意思。以前我也是将这里抽投影与视图的平行投影、透视投影等混淆。
3 ProjLib
类GeomProjLib只是一个包含静态函数的类,其底层使用类包ProjLib。这里的投影库的作用就是专门用来计算PCurve,即回答PCurve从哪来的问题。下图是ProjLib中的类图:
对应基本的解析曲面,都有一种投影器Projector:
ProjLib_Plane:计算平面上基本解析曲线在平面参数空间的PCurve;
ProjLib_Cone:计算圆锥面上基本解析曲线在圆锥面参数空间的PCurve;
ProjLib_Cylinder:计算圆柱面上基本解析曲线在圆柱面参数空间的PCurve;
ProjLib_Sphere:计算球面上基本解析曲线在球面参数空间的PCurve;
ProjLib_Torus:计算圆环面上基本解析曲线在圆环面参数空间的PCurve;
最后通过类ProjLib的静态函数Project来对基本曲面上的曲线进行投影:
我们还在来看圆向平面投影的源码,侯捷说过“源码之前,了无秘密”。
按我们画法几何的投影概念来理解圆向平面投影:圆的投影一般为椭圆。当圆所在的平面为投影面平行面时,它在该投影面在投影仍为圆。从源码可以看出,这里的投影不是画法几何中的投影,而是计算PCurve。
4 Conclusion
理解了包ProjLib的作用,就可以根据曲面和曲面上的曲线计算出对应到参数空间的PCurve。这样就可以解决前面已经圆柱面上的线生成正确的圆柱面Face了。
新冠肺炎反复,在清明时节不能回家祭祖。希望科学家们早日解密新冠病毒,研制出解药,让生活回归正常的轨迹。
暂无评论内容