eryar@163.comhtml
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 dom
OpenCASCADE 中邊界表示法BRep的拓樸面Topological Face包含了完整的幾何信息,即給定一個TopoDS_Face,其中包含了邊和頂點,而邊和頂點包含了幾何曲線及三維點。對邊和頂點的可視化很好理 解:顯示頂點就是在場景中繪製一個三維點;顯示邊最簡單的算法能夠將邊中的曲線在參數空間中等分採樣,再將參數對應到曲線上的點鏈接起來就能夠簡單顯示邊 了;而面的可視化如何實現呢?ide
幾何造型內核中都有個參數曲線的概念,即PCurve(Parametric Curve),它是實現面可視化的一個很關鍵的數據。PCurve的定義是參數表示的曲面上的曲線在二維(u, v)參數空間中的二維樣條曲線,也就是曲面上的曲線(Curve on Surface)。post
在理解PCurve定義的基礎上纔好對其作進 一步的研究,好回答「從哪兒來到哪兒去的問題」,即如何產生PCurve,如何使用生成的PCurve數據。本文主要介紹如何將OpenCASCADE拓 樸面中的PCurve可視化,從而方便對拓樸面的檢查,也能夠看出PCurve在曲可視化方面的應用。PCurve的產生及其餘應用有待進一步挖掘。若您 對PCurve有何見解,歡迎不吝賜教。測試
2.PCurve of a Face ui
由 OpenCASCADE中對拓樸形狀可視化的算法[2]可知,對面的網格化須要先對面中環,環中的邊進行離散化,最後都統一到參數空間,即只須要一個二維 網格化算法來對二維的參數空間進行網格化,最後將參數空間網格化的點映射回面中的幾何曲面上,即獲得曲面的空間網格剖分。spa
Figure 2.1 Mesh UV domain of a Surface3d
如 上圖2.1所示,UV參數空間中的邊界線就是拓樸面的環中的邊的PCurve,即拓樸面中的環對應了參數空間中的邊界,而這些邊界的表示就是使用了 PCurve。對參數空間進行網格化最多見的算法就是Delaunay三角剖分算法[3],早期OpenCASCADE的版本中使用了一個開源 Delaunay庫Triangle[4]。經過將曲面在參數空間的結果映射回曲面的三維空間便可將曲面可視化了。如何控制曲面離散精度還有待進一步學 習。
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中的平面的參數方程爲:
由上述參數表示的平面方程可知,平面的定義域是無窮的,因此爲了生成一個有環的拓樸面,須要對平面設置邊界來對無限的平面進行裁剪。相應的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
生成結果以下圖所示:
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是逆時針閉合的。
Figure 2.4 Plane PCurves
Figure 2.5 Plane Face in 3D Viewer
2.2 Cylinder PCurve
OpenCASCADE中圓柱面的參數方程爲:
由上述參數方程可知,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
生成結果以下圖所示:
Figure 2.6 Cylinder PCurves
由上圖根據pcurve的着色規則可知,圓柱面的pcurves也是按逆時針順序閉合的。其在三維中的顯示結果以下圖所示:
Figure 2.7 Cylinder Face in 3d Viewer
3.3 Cone PCurve
OpenCASCADE中圓錐面的參數方程爲:
可知圓錐曲面與圓柱曲面同樣,都是在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
生成結果以下圖所示:
Figure 2.8 Cone PCurves
由上圖根據pcurve的着色規則可知,圓錐面的pcurves也是按逆時針順序閉合的。其在三維中的顯示結果以下圖所示:
Figure 2.9 Cone Face in 3D viewer
3.4 Sphere PCurve
OpenCASCADE中球面的參數方程爲:
由上述參數方程可知,球面在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
生成結果以下圖所示:
Figure 2.10 Sphere PCurves
由上圖根據pcurve的着色規則可知,球面的pcurves也是按逆時針順序閉合的。其在三維中的顯示結果以下圖所示:
Figure 2.11 Sphere in 3d viewer
3.5 Torus PCurve
OpenCASCADE中圓環面的參數方程爲:
由圓環面的參數方程可知,在參數區間上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
Figuer 2.12 Torus PCurves
由上圖根據pcurve的着色規則可知,圓環面的pcurves也是按逆時針順序閉合的。其在三維中的顯示結果以下圖所示:
Figure 2.13 Torus in 3d viewer
3.PCurve of a Face With Holes
由 OpenGL編程指南[10]可知,要對一個NURBS曲面進行裁剪,能夠建立gluPwlCurve和gluNurbsCurve來在參數空間造成閉合 區域。其中gluPwlCurve建立是多段直線,而gluNurbsCurve生成的是在單位參數空間的NURBS曲線。建立裁剪曲線時須要考慮曲線的 朝向(orientation),即曲線是順時針的仍是逆時針的。曲線裁剪曲面的方式很簡單,想像你沿着曲線走,左手邊的將會被保留,右手邊的將會被去 除。
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腳本爲將一個平面用圓柱去挖一個孔,以下圖所示:
Figure 3.2 Face with a Hole
遍歷被挖孔(boolean operation)獲得的形狀的面,獲得一個面,顯示這個面的pcurve以下圖所示:
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
用腳本在一個球面上生成四個孔,以下圖所示:
Figure 3.4 A sphere face with 4 holes
遍歷boolean operation生成孔後的形狀的面,可看到只生成了一個面。將這個面的pcurve顯示出來以下圖所示:
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
生成結果以下圖所示:
Figure 3.6 A Plane cut a Torus
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
PDF Version: OpenCASCADE PCurve of Topological Face