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

這個方程可以描述一個位于坐標原點處半徑為R的一個圓。再如:

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

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

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

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

錢能著. C++程序設計教程. 清華大學出版社。 學習C++程序開發的基本語法,面向對象程序設計的基本思想。

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

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

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

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

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

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


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

朱心雄. 自由曲線曲面造型技術. 科學出版社. 主要介紹了B樣條曲線曲面的基礎理論及相關的算法,如求交算法,光順算法,點云數據擬合曲面算法等。
3.3 Visualization


在理解了OpenCASCADE中顯示數據的產生后,再結合上面兩本OpenGL的經典書,OpenGL的學習應該更輕松。

汪嘉業. 王文平. 屠長河. 楊承磊. 計算幾何及應用. 科學出版社。主要學習其中點集的Delaunay三角剖分算法,OpenCASCADE中由造型數據到可視化數據的生成就是使用了這個算法。
3.4 ApplicationFramework

Gof的設計模式,將前人編程開發中的經驗以模式的方式進行總結,可以提高面向對象程序開發水平。

MARTIN REDDY. API design for C++. 學習其中API的設計,使其模塊化,見名知義等。
3.5 DataExchange

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

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