OpenCASCADE入門指南
eryar@163.com
一、概述
荀子說“君子性非異也,善假于物也”。當(dāng)你會用英語,就可以與世界各國的人交流;當(dāng)你會用編程語言,就可以與計算機(jī)交流;當(dāng)你會用數(shù)學(xué)語言,就可以精確的描述世界。當(dāng)你會用OpenCASCADE這個開發(fā)包(SDK),就可以在計算機(jī)中創(chuàng)造一個三維世界。大學(xué)期間,偶然在圖書館翻到一本發(fā)黃的書,講的是用Turbo C2.0 C語言graphics.h頭文件來畫圖的計算機(jī)圖形學(xué)的書,隨即對計算機(jī)圖形學(xué)有了興趣。后來一直在圖書館里面看計算機(jī)圖形學(xué)方面的書,都沒有得其要領(lǐng)。一方面是國內(nèi)的教材上來都是抽象的理論,沒有相對具體實(shí)現(xiàn)的例子;另一方面是因?yàn)樽约簲?shù)學(xué)也一直沒有入門。
從小學(xué)到大學(xué)都要學(xué)數(shù)學(xué),雖然高中和大學(xué)都開了物理課,但是還是沒能理解抽象的數(shù)學(xué),其實(shí)物理就是數(shù)學(xué)在現(xiàn)實(shí)生活中的具體應(yīng)用,即用數(shù)學(xué)來解釋自然現(xiàn)象。數(shù)學(xué)的美妙就在于用簡單的文字描述自然規(guī)律。如:

這個方程可以描述一個位于坐標(biāo)原點(diǎn)處半徑為R的一個圓。再如:

這是一個簡單的微分方程,描述了自由落體的運(yùn)動規(guī)律。規(guī)律的意思是對于地球上任意一個自由落體運(yùn)動,不考慮空氣阻力等因素,可以利用此公式精確計算出它在降落的過程中的狀態(tài)數(shù)據(jù),如在某個點(diǎn)處的速度,距離降落點(diǎn)的長度等。掌握到微分方程這個工具,可以解釋很多物理問題,如運(yùn)動學(xué)、電學(xué)、力學(xué)。如:

上式是一個偏微分方程。理解偏微分方程,就可以…… 言歸正傳,如何來學(xué)習(xí)和使用OpenCASCADE呢?
二、OpenCASCADE是什么
根據(jù)OpenCASCADE源碼中的ReadMe可知,OpenCASCADE是一個提供三維曲面造型和實(shí)體建模、CAD數(shù)據(jù)交換及可視化的軟件開發(fā)平臺。OpenCASCADE的大部分功能都是以C++的庫的形式提供。OpenCASCADE可用于開發(fā)CAD、CAM及CAE相關(guān)的軟件。
從OpenCASCADE6.8開始授權(quán)協(xié)議改為LGPL協(xié)議,這樣就可以用OpenCASCADE開發(fā)商用程序而不用開源代碼了,其使用更自由。
Open CASCADE Technology 是為特定領(lǐng)域快速開發(fā)程序而設(shè)計的面向?qū)ο蟮腃++類庫??梢允褂肙CCT來開發(fā)二維和三維的通用幾何造型的計算機(jī)輔助設(shè)計程序CAD(Computer Aided Design),計算機(jī)輔助制造程序CAM(Computer Aided Manufacturing)和計算機(jī)輔助分析程序CAA(Computer Aided Analysis);仿真程序和繪圖程序。OCCT庫可以明顯快速程序的開發(fā)進(jìn)度。
OCCT庫提供如下功能:
l 2D和3D幾何造型工具箱,可對任何物體造型;
n 創(chuàng)建基本圖元,如prism,cylinder, cone, torus;
n 對實(shí)體進(jìn)行布爾操作,addition, subtraction and intersection;
n 根據(jù)倒圓、倒角、草圖拉伸出幾何實(shí)體;
n 使用偏移offsets、成殼shelling、挖空hollowing和擠壓sweeps構(gòu)造幾何實(shí)體;
n 計算幾何實(shí)體屬性,如表面積、體積、重心、曲率半徑;
n 使用插值interpolation、逼近approximation、投影projection計算出幾何體;
l 可視化功能提供對幾何實(shí)體的顯示、控制功能,例如:
n 三維旋轉(zhuǎn)3D rotation;
n 縮放Zoom;
n 著色Shading;
l 程序框架提供如下功能:
n 將非幾何數(shù)據(jù)與幾何實(shí)體關(guān)聯(lián);
n 參數(shù)化模型;
n Java Application Desktop(JAD);
OCCT庫是由Open CASCADE公司開發(fā)和市場運(yùn)作的。庫被設(shè)計成模塊化和易擴(kuò)展。將C++類與以下內(nèi)容分離:
l 定義數(shù)據(jù)結(jié)構(gòu)(幾何建模、顯示和交互選擇);
l 實(shí)現(xiàn)復(fù)雜算法;
l 提供編程接口;

圖1. OpenCascade架構(gòu)圖
相關(guān)的類由包來分組,避免了類名的沖突。C++類名前加上包名作為前綴。如包Geom中所有的3D幾何體,實(shí)現(xiàn)Bezier曲面的類為BezierSurface,其全稱為Geom_BezierSurface。
包組成庫,即提供給程序鏈接使用。
最的,庫分組成六個模塊,最小的模塊Foundation Classes包含兩個庫,最大的模塊Modeling Algorithms,包含八個庫。(eryar: 可能是早期版本,最新版本的庫的數(shù)量有變化。)這些模塊如下圖所示:
圖2:Object Libraries modules and their contents

另外,Draw Test Harness(Draw)為可視化、建模算法、程序框架和數(shù)據(jù)交換模塊提供測試。
三、學(xué)習(xí)過程
下面對OpenCASCADE相應(yīng)模塊進(jìn)行簡單介紹,并推薦一些參考書籍,結(jié)合參考書籍可以深入理解OpenCASCADE源碼。
3.1 FoundationClasses
FoundationClasses基礎(chǔ)類模塊中主要包含兩個工具集Toolkit:數(shù)學(xué)工具TKMath和核心工具TKernel。TKernel中主要是一些類型定義、自定義容器、內(nèi)存管理等。理解起來需要C++編程基礎(chǔ)知識,推薦以下幾本經(jīng)典教材:

錢能著. C++程序設(shè)計教程. 清華大學(xué)出版社。 學(xué)習(xí)C++程序開發(fā)的基本語法,面向?qū)ο蟪绦蛟O(shè)計的基本思想。

Scott Meyers. Effective C++. C++程序員可以分成兩類:讀過Effective C++和沒讀過的。

Scott Meyers. More Effective C++.
TKMath工具集主要是一些數(shù)值算法庫,如矩陣變換、微分積分、解方程(組)、非線性方程組等。推薦浙大出版的《數(shù)值分析引論》:

易大義, 陳道琦. 數(shù)值分析引論. 浙江大學(xué)出版社。主要介紹插值法、函數(shù)與數(shù)據(jù)的逼近、數(shù)值積分與微分、解方組,非線性方程(組)數(shù)值解法、矩陣計算等。OpenCASCADE的math包中基本上就是這些算法的具體實(shí)現(xiàn)。

Fletcher Dunn, Ian Parberry. 3D Math Primer for Graphics and Game Development. 主要用來學(xué)習(xí)向量和矩陣用于圖形變換。
3.2 ModelingData & ModelingAlgorithms

陳維桓. 微分幾何. 北京大學(xué)出版社. 主要用來學(xué)習(xí)將曲線和曲面看成矢量函數(shù)及其分析方法。

Les Piegl, Wayne Tiller. The NURBS Book. 想從事CAD,必須理解NURBS。這本書可以說是NURBS的經(jīng)典之作,幾個博士的翻譯也很到位。


王仁宏, 李崇君, 朱春鋼. 計算幾何教程. 科學(xué)出版社。主要還是介紹B樣條曲線的基礎(chǔ)知識。

朱心雄. 自由曲線曲面造型技術(shù). 科學(xué)出版社. 主要介紹了B樣條曲線曲面的基礎(chǔ)理論及相關(guān)的算法,如求交算法,光順?biāo)惴ǎc(diǎn)云數(shù)據(jù)擬合曲面算法等。
3.3 Visualization


在理解了OpenCASCADE中顯示數(shù)據(jù)的產(chǎn)生后,再結(jié)合上面兩本OpenGL的經(jīng)典書,OpenGL的學(xué)習(xí)應(yīng)該更輕松。

汪嘉業(yè). 王文平. 屠長河. 楊承磊. 計算幾何及應(yīng)用. 科學(xué)出版社。主要學(xué)習(xí)其中點(diǎn)集的Delaunay三角剖分算法,OpenCASCADE中由造型數(shù)據(jù)到可視化數(shù)據(jù)的生成就是使用了這個算法。
3.4 ApplicationFramework

Gof的設(shè)計模式,將前人編程開發(fā)中的經(jīng)驗(yàn)以模式的方式進(jìn)行總結(jié),可以提高面向?qū)ο蟪绦蜷_發(fā)水平。

MARTIN REDDY. API design for C++. 學(xué)習(xí)其中API的設(shè)計,使其模塊化,見名知義等。
3.5 DataExchange

李原. 張開富. 余劍峰. 計算機(jī)輔助幾何設(shè)計技術(shù)及應(yīng)用. 西北工業(yè)大學(xué)出版社。其中也有一些曲線曲面的知識,不過都是簡單地一帶而過,主要學(xué)習(xí)其中對IGES文件的解析,有了一種格式的解析經(jīng)驗(yàn),其三維格式可以查找其規(guī)格書來進(jìn)行解析。
3.6 Draw

Tcl/Tk同Python類似,都是腳本語言。OpenCASCADE中使用Tcl/Tk的目的就是為了跨平臺的測試造型算法??纯幢緯?,學(xué)習(xí)Tcl/Tk的基本語法,及如何在程序中自定義命令。理解這之后,就可以完全理解Draw這個模塊的實(shí)現(xiàn)原理。
四、結(jié)論
OpenCASCADE的源碼比較龐大,學(xué)習(xí)起來涉及的內(nèi)容較多。希望能將學(xué)習(xí)的過程當(dāng)作數(shù)據(jù)理論的實(shí)踐,體驗(yàn)數(shù)學(xué)理論可視化過程中的樂趣。另外將OpenCASCADE中解決一些問題的思路拿來解決自己在學(xué)習(xí)、工作中遇到的問題。
歡迎大家關(guān)注OpenCASCADE公眾號:
