eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE PCurve of Topological Face

Posted on 2015-04-25 12:22 eryar 阅读(3917) 评论(2)  编辑 收藏 引用 所属分类: 2.OpenCASCADE

OpenCASCADE PCurve of Topological Face

eryar@163.com

Abstract. OpenCASCADE provides a class BRepBuilderAPI_MakeFace to build topological faces. A face maybe built from a surface, elementary surface from gp package, surface from Geom, from a wire and find the surface automatically if possible, etc. If a face is built, how to check it for visualization? What does PCurve means? The paper will answer those question.

Key Words. OpenCASCADE, Topological Face, PCurve, Holes

1. Introduction

OpenCASCADE中边界表示法BRep的拓朴面Topological Face包含了完整的几何信息,即给定一个TopoDS_Face,其中包含了边和顶点,而边和顶点包含了几何曲线及三维点。对边和顶点的可视化很好理解:显示顶点就是在场景中绘制一个三维点;显示边最简单的算法可以将边中的曲线在参数空间中等分采样,再将参数对应到曲线上的点连接起来就可以简单显示边了;而面的可视化如何实现呢?

几何造型内核中都有个参数曲线的概念,即PCurve(Parametric Curve),它是实现面可视化的一个很关键的数据。PCurve的定义是参数表示的曲面上的曲线在二维(u, v)参数空间中的二维样条曲线,也就是曲面上的曲线(Curve on Surface)。

在理解PCurve定义的基础上才好对其做进一步的研究,好回答“从哪儿来到哪儿去的问题”,即如何产生PCurve,如何使用生成的PCurve数据。本文主要介绍如何将OpenCASCADE拓朴面中的PCurve可视化,从而方便对拓朴面的检查,也可以看出PCurve在曲可视化方面的应用。PCurve的产生及其他应用有待进一步挖掘。若您对PCurve有何看法,欢迎不吝赐教。


2.PCurve of a Face

由OpenCASCADE中对拓朴形状可视化的算法[2]可知,对面的网格化需要先对面中环,环中的边进行离散化,最后都统一到参数空间,即只需要一个二维网格化算法来对二维的参数空间进行网格化,最后将参数空间网格化的点映射回面中的几何曲面上,即得到曲面的空间网格剖分。

wps_clip_image-29946

Figure 2.1 Mesh UV domain of a Surface

如上图2.1所示,UV参数空间中的边界线就是拓朴面的环中的边的PCurve,即拓朴面中的环对应了参数空间中的边界,而这些边界的表示就是使用了PCurve。对参数空间进行网格化最常见的算法就是Delaunay三角剖分算法[3],早期OpenCASCADE的版本中使用了一个开源Delaunay库Triangle[4]。通过将曲面在参数空间的结果映射回曲面的三维空间即可将曲面可视化了。如何控制曲面离散精度还有待进一步学习。

wps_clip_image-30572

Figure 2.2 A Smiley Face Meshed by Triangle

上图2.2所示为二维三角剖分库Triangle对一个笑脸进行剖分的结果。

在Draw Test Harness中,OpenCASCADE提供了对面的PCurve可视化的命令pcurve。使用pcurve命令可以将一个面中所有的pcurve根据朝向orientation以不同的颜色进行显示。这个命令对检查面中边的朝向的正确性非常有用。下面使用Tcl命令在Draw Test Harness中对基本曲面的PCurve进行显示。

2.1 Plane PCurve

OpenCASCADE中的平面的参数方程为:

wps_clip_image-8180

由上述参数表示的平面方程可知,平面的定义域是无穷的,所以为了生成一个有环的拓朴面,需要对平面设置边界来对无限的平面进行裁剪。相应的Tcl脚本如下所示:

# 1. view the pcurves of a plane face
plane p

# trim the plane to (u,v)->[-1, 1][-1, 1]
trim p p -1 1 -1 1

# make the topo face
mkface p p

# extract the 2d curve of an edge on a face
pcurve p

# display pcurve in 2d viewer
av2d
fit
2dfit

# display face in 3d viewer
vdisplay p

生成结果如下图所示:

wps_clip_image-22514

Figure 2.3 Color for PCurves

由图2.3可知,pcurve有四种颜色:

v rouge: FORWARD 胭脂红表示正向;

v bleu: REVERSED 蓝色表示反向;(不知道是法语写法还是个错别字,蓝色英语应该为blue)

v rose: EXTERNAL 玫瑰红表示向外;

v orange: INTERNAL 橙黄色表示向内;

根据上述的颜色规则来看图2.4,可以看出平面边界的pcurves是逆时针闭合的。

wps_clip_image-6057

Figure 2.4 Plane PCurves

wps_clip_image-27675

Figure 2.5 Plane Face in 3D Viewer

2.2 Cylinder PCurve

OpenCASCADE中圆柱面的参数方程为:

wps_clip_image-5104

由上述参数方程可知,u的取值范围是有界的[2, 2pi),v的取值是无限的。所以为了得到有界的拓朴面,至少需要对其v方向进行裁剪。相应的Tcl脚本如下所示:

# 2. view the pcurves of a cylinder face
cylinder c 1

# trim the cylinder to (u,v)->[0, 2pi][0, 1]
trim c c 0 2*pi 0 1

# make the topo face
mkface c c 

# extract the 2d curve of an edge on a face
pcurve c

# display pcurves in 2d viewer
av2d
2dfit
fit

# display face in 3d viewer
vdisplay c

生成结果如下图所示:

wps_clip_image-19747

Figure 2.6 Cylinder PCurves

由上图根据pcurve的着色规则可知,圆柱面的pcurves也是按逆时针顺序闭合的。其在三维中的显示结果如下图所示:

wps_clip_image-28392

Figure 2.7 Cylinder Face in 3d Viewer

3.3 Cone PCurve

OpenCASCADE中圆锥面的参数方程为:

wps_clip_image-17202

可知圆锥曲面与圆柱曲面一样,都是在u方向有界,在v方向无界。对其进行裁剪生成拓朴面并显示pcurve的Tcl脚本如下所示:

# 3. view the pcurves of a cone face
cone co 30 0

# trim the cone to (u,v)->[0, 2pi][0, 1]
trim co co 0 2*pi 0 1

# make the topo face
mkface co co

# extract pcurves
pcurve co

# display pcurves in 2d viewer
av2d
2dfit
fit

# display face in 3d viewer
vdisplay co

生成结果如下图所示:

wps_clip_image-29814

Figure 2.8 Cone PCurves

由上图根据pcurve的着色规则可知,圆锥面的pcurves也是按逆时针顺序闭合的。其在三维中的显示结果如下图所示:

wps_clip_image-1397

Figure 2.9 Cone Face in 3D viewer

3.4 Sphere PCurve

OpenCASCADE中球面的参数方程为:

wps_clip_image-5770

由上述参数方程可知,球面在u和v方向均为有界的,所以可不用对其进行裁剪就可生成拓朴面,当然也可对其裁剪得到球面的部分。显示球面pcurves的Tcl脚本如下所示:

# 4. view the pcurves of a sphere face
sphere s 1

# make the topo face
mkface s s 

# extract pcurves
pcurve s

# display pcurves in 2d viewer
av2d
2dfit
fit

# display sphere face in 3d viewer
vdisplay s

生成结果如下图所示:

wps_clip_image-16324

Figure 2.10 Sphere PCurves

由上图根据pcurve的着色规则可知,球面的pcurves也是按逆时针顺序闭合的。其在三维中的显示结果如下图所示:

wps_clip_image-29852

Figure 2.11 Sphere in 3d viewer

3.5 Torus PCurve

OpenCASCADE中圆环面的参数方程为:

wps_clip_image-12978

由圆环面的参数方程可知,在参数区间上u和v都是有界的,所以可不用对其进行裁剪就可生成拓朴面,当然也可对其裁剪得到圆环面的部分。显示圆环面pcurves的Tcl脚本如下所示:


# 5. view the pcurves of a torus face
torus t 20 5

# make the topo face
mkface t t

# extract pcurves
pcurve t

# display pcurves in 2d viewer
av2d
2dfit
fit
# display torus in 3d viewer
vdisplay t

生成结果如下图所示:

wps_clip_image-22530

Figuer 2.12 Torus PCurves

由上图根据pcurve的着色规则可知,圆环面的pcurves也是按逆时针顺序闭合的。其在三维中的显示结果如下图所示:

wps_clip_image-10501

Figure 2.13 Torus in 3d viewer

3.PCurve of a Face With Holes

由OpenGL编程指南[10]可知,要对一个NURBS曲面进行裁剪,可以创建gluPwlCurve和gluNurbsCurve来在参数空间形成闭合区域。其中gluPwlCurve创建是多段直线,而gluNurbsCurve生成的是在单位参数空间的NURBS曲线。创建裁剪曲线时需要考虑曲线的朝向(orientation),即曲线是顺时针的还是逆时针的。曲线裁剪曲面的方式很简单,想像你沿着曲线走,左手边的将会被保留,右手边的将会被去除。

wps_clip_image-29949

Figure 3.1 Parametric Trimming Curves

裁剪曲线还必须闭合且不能自交(Trimming curves must be closed and nonintersecting)。这里的裁剪曲线与OpenCASCADE中的参数曲线pcurve的概念相同。OpenCASCADE中的面也是采用的相同的规则。下面通过Tcl脚本来测试OpenCASCADE中带有开孔的面的pcuve是否满足OpenGL中裁剪曲面的规则。

# test face with one hole
plane p
trim p p 
-10 10 -10 10
mkface p p
pcylinder c 
1 2

bop p c
bopcut s

vdisplay s

explode s F
pcurve s_1

av2d
2dfit
fit

上述Tcl脚本为将一个平面用圆柱去挖一个孔,如下图所示:

wps_clip_image-8553

Figure 3.2 Face with a Hole

遍历被挖孔(boolean operation)得到的形状的面,得到一个面,显示这个面的pcurve如下图所示:

wps_clip_image-26044

Figure 3.3 PCurve of a Face with one hole

由上图3.3可知,pcurve的规则与OpenGL中的裁剪曲线一致。孔的pcurve为蓝色,即为逆时针的反向:顺时针。当一个面上生成多个孔时,是否仍然满足上述规则呢?下面使用Tcl来对验证一下:

# test pcurve of a face with multi-holes
sphere s 10
mkface s s

pcylinder c1 
1 30
pcylinder c2 
1 30

ttranslate c1 
-5 -5 -15
ttranslate c2 
5 5 -15

bop s c1
bopcut s

bop s c2
bopcut s

explode s F
pcurve s_1

av2d
2dfit
fit

用脚本在一个球面上生成四个孔,如下图所示:

wps_clip_image-13810

Figure 3.4 A sphere face with 4 holes

遍历boolean operation生成孔后的形状的面,可看到只生成了一个面。将这个面的pcurve显示出来如下图所示:

wps_clip_image-16372

Figure 3.5 PCurves for a sphere with 4 holes

由上图3.5可知,pcurve的朝向也与OpenGL中裁剪曲线的朝向一致。当一个面生成的开孔如图3.1中的D和E时,在OpenCASCADE中是如何表示的呢?下面也有Tcl脚本测试测试:

plane p
trim p p 
-10 10 -10 10
mkface p p

ptorus t 
5 1

bop p t
bopcut s

vdisplay s

explode s F
pcurve s_1
pcurve s_2

av2d
2dfit
fit

生成结果如下图所示:

wps_clip_image-31602

Figure 3.6 A Plane cut a Torus

wps_clip_image-8216

Figure 3.7 PCurves for the faces

由上图可知,当一个平面去掉一个圆环面后,生成了两个面,与有些几何内核的用链表来将结果表示成一个面不同,OpenCASCADE中将结果生成了两个面。其pcurves的朝向也与OpenGL中的裁剪曲线的朝向一致。

4.Conclusion

综上所述,曲面上的曲线pcurve的概念是一个非常重要的概念,理解pcurve对造型及可视化有着重要意义。本文结合OpenGL中裁剪曲线的规则及OpenCASCADE的Draw Test Harness中显示拓朴面pcurve的命令,来对基本曲面及裁剪曲面的pcurve的朝向进行检验。掌握了这些规则,可方便对自己构造拓朴面的正确性进行检验。

5. Acknowledge

时光荏苒,从毕业到现在不经意间就到了而立之年。沧海桑田,岁月蹉跎,经历春夏秋冬的四季,品尝酸甜苦辣的人生。感谢一路走来,亲人、朋友、同事等对给予我的支持,信任和鼓励,让我可以做自己喜欢的事情,找到人生的方向。

寄蜉蝣与天地,渺沧海之一粟。准备回到离家近的武汉工作,切换到生活模式,多些时间陪伴父母亲人,以报养育之恩。

6. References

1. Shing Liu. PCurve - Curve on Surface. 

http://www.cnblogs.com/opencascade/p/3601859.html

2. Shing Liu. Topology and Geometry in OpenCASCADE-Edge.

http://www.cnblogs.com/opencascade/p/3604052.html

3. Topology and Geometry in OpenCASCADE-Face.

http://www.cnblogs.com/opencascade/p/3605729.html

4. Shing Liu. Mesh Algorithm in OpenCASCADE.  http://www.cnblogs.com/opencascade/p/3648532.html

5. Shing Liu. Delaunay Triangulation in OpenCASCADE. 

http://www.cppblog.com/eryar/archive/2013/05/26/200605.aspx

6. Shing Liu. Triangle-Delaunay Triangulator. 

http://www.cnblogs.com/opencascade/p/3632705.html

7. OpenCASCADE, Draw Test Harness User Guide.

8. OpenCASCADE, BRep Format White Paper.

9. Richard S. Wright Jr., Benjamin Lipchak. OpenGL SuperBible. Sams Publishing. 2004

10. Dave Shreiner. OpenGL Programming Guide. Addison-Wesley. 2009

Feedback

# re: OpenCASCADE PCurve of Topological Face  回复  更多评论   

2015-11-08 23:13 by 佚名
博主您好!
一直喜欢读您的博文,受益匪浅,现在碰到个问题想请教,就是两个面的共享边问题,面是通过edge生成的,比如三条edge边a、b、c生成一个面,a、d、e生成另外一个面,应该说它们有共享边a,可是实际上explore两个面发现它们没有共享边,在它们交界处是重合的两条边,这两条边既不isequal也不issame,不知道是何原因,怎么才能保障共边,请指教,谢谢。

# re: OpenCASCADE PCurve of Topological Face  回复  更多评论   

2015-11-09 19:04 by eryar
@佚名
可以把代码贴上来看看不?

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理