A04

Page 1


運算化設計的基礎數學

由 Robert McNeel & Associates 編著的《運算化設計的基礎數學(第二版)》已在 Creative Commons Attribution-Share Alike 3g.0 United States License 下注册。

i


運算化設計的基礎數學

序 隨著 Grasshopper 的使用者逐漸增多,其所具有的嵌入式運算器已不再能滿足所有人的使用需 求,因此部分使用者開始學習 Rhino Script 戒者其他 GH 支持的程式語言。而 Robert McNeel & Associates 在開發 Grasshopper 嵌入式運算器的過程中涉及到諸多的數學知識,對於這些 概念及基礎知識的理解有助於我們更好地理解運算器的 script 及編寫我們需要的腳本,這也是 本書翻譯的初衷。然而此書僅提供一個知識結構,並對其中涉及的概念進行簡要概述,對某些 部分有興趣的讀者可以參考本書中的小注提供的材料進行更深入地閱讀。 本書翻譯之初,便得到了原作者 Rajaa Issa 的鼎力支援,她提供了一系列 Robert McNeel & Associates 出版的書籍及其翻譯版本供我參考。在此書的翻譯過程中,NCF 論壇的 F(x)對初始 翻譯版本進行了周密而全面的技術性審閱,同時 NCF 翻譯組成員同我一起討論確定了一些特定 名詞的中文翻譯選詞。最後我還要感謝上海外國語大學的 Tong Flora 和重慶大學的 Wen 對於 此書語法的修正和措辭的潤色。 此書的版權仍由原作者 Rajaa Issa 及 Robert McNeel & Associates 持有。另外,本書翻譯過 程中難免會出現各類錯誤,如各位讀者發現本書存在翻譯戒其他相關問題,歡迎致信 wahlim.bryan.shih@gmail.com,以便於日後的更正與更新。

Bryan Shih GSAPP Columbia University Aug 21st 2011

ii


運算化設計的基礎數學

前 言 《運算化設計的基礎數學》向設計人員介紹了有效開發 3D 建模和電腦圖像的計算方法所涉及的 必要基本數學概念。但這並不意味著此書將提供一個完整且綜合的資源,而僅是對基本的最常 用概念的一個概述。 此書針對那些沒有戒者只有少量高中以後數學基礎的設計者。所有的概念都以視覺化的圖像來 解釋。而這些圖像是在 Rhinoceros® (Rhino)的外掛程式 Grasshopper® (GH)模型生成環境中 生成的。詳情請見 www.rhino3d.com 和 www.grasshopper3d.com . 所有的概念被分成三個部分。第一部分討論了向量數學,包括向量表示、向量運算以及線、面 方程。第二部分綜述了矩陣運算和轉換。第三部分包括參數曲線(特別是 NURBS 曲線)和連 續性、曲率概念的綜述,同時也快速回顧了 NURBS 曲面和多重曲面。 在這裡我要感謝 Robert McNeel and Associates 的 Greg Arden 博士傑出和全面周密的技術 性審閱。他的寶貴意見推動了第二版的產生。我還要感謝 Robert McNeel and Associates 的 Margaret Becker 女士對於技術化寫作和文檔格式的修改。最後,我要指出的是這本書所使用 的材料部分是基於我在 University of Texas at Arlington(2010 年 2 月的 Tex-Fab event)舉 辦的講習班的內容。

Rajaa Issa Robert McNeel & Associates

iii


運算化設計的基礎數學

目 錄

1 向量數學 ....................................................................................................................................................1 向量表示 .................................................................................................................................................... 1 向量運算 .................................................................................................................................................... 3 直線的向量方程 ............................................................................................................................................. 13 平面的向量方程 ............................................................................................................................................. 14 2 矩陣和變換 ............................................................................................................................................. 16 介紹 ......................................................................................................................................................... 16 矩陣乘法 ......................................................................................................................................................... 16 仿射變換 ......................................................................................................................................................... 17 3 參數曲線及曲面 ...................................................................................................................................... 22 介紹 ......................................................................................................................................................... 22 三次多項式曲線 ...................................................................................................................................... 22 幾何連續性 ............................................................................................................................................. 25 曲率 ......................................................................................................................................................... 26 參數曲線的評價演算法........................................................................................................................... 28 NURBS 曲線 .......................................................................................................................................... 31 NURBS 曲線的特徵 ............................................................................................................................... 33 NURBS 曲面 .......................................................................................................................................... 36 NURBS 曲面的特徵 ............................................................................................................................... 37 多重曲面 ................................................................................................................................................. 39 參考文獻 .............................................................................................................................. 42 中英文名詞對照..................................................................................................................... 43

iv


運算化設計的基礎數學

1 向量數學 向量表示 向量是一個具有“方向”和“大小”的量,例如速度、力等。向量在二維坐標系中用兩個實 數表示如下: v = <a1, a2> 同理,在三維坐標系中,向量可用三個實數表示,如下: v = <a1, a2, a3> 我們用小寫粗體字母表示向量,同時向量分量被包括在角括弧內。點用大寫字母表示,點座 標用圓括號表示。 使用坐標系和該系統中的任何一組錨點(anchor points) ,我們可以用線段來表示這些向量 或者使其視覺化。我們通常加上箭頭來表示向量的方向。 例如,有一個向量,其方向平行於一個已知的三維坐標系的 X 軸,並且其大小等於 5.18 個 單位,那麼我們可以將向量表示為: v = <5.18, 0, 0> 為了表示一個向量,我們需要坐標系中的一個錨定點。比如,下圖的所有紅色線段是對同一 個向量的等效表示。

圖(1) :三維坐標系統中的向量表示 1:Grasshopper unit x-axis 運算器;2:Grasshopper number slider 運算器 3:Grasshopper 點運算器,參考點是 Rhino 中的多點 (圖中指的是 v1、v2、v3 和 v4) 4:Grasshopper vector display 運算器

已知一個三維向量 v = < a1, a2, a3 >,所有的分量 a1, a2, a3 是三個實數。 那麼所有從點 A(x,y,z)到點 B(x+a1, y+a2, z+a3)的線段是向量 v 的等效表示。 因此,我們如何通過一個代表已知向量的線段來定義它的端點呢?讓我們先用 Grasshopper 的“x,y,z point” 運算器來定義一個錨點: P0 = (1,2,3)

1


運算化設計的基礎數學

用 Grasshopper xyz vector 運算器表示的一個向量需要輸入三個實數: v = <2,2,2> 向量的頂點(P1)是在錨點加上向量 v 相應的分量而計算出來的。 P1 = (1+2, 2+2, 3+2) = (3,4,5) 如下顯示了用 Grasshopper vector display 運算器表示的這個向量,在所顯示的向量端點 做上記號以期與點 P1 重合:

圖(2) :向量、向量錨點、和向量頂點位置重合的點之間的關係

位置向量 有一種特殊的向量表示方法,用原點 P0 (0,0,0)作為向量的錨點。位置向量 v = <a1,a2,a3> 表示成在兩點(P0 和 P1)之間的線段,因此: P0 = (0,0,0) P1 = (a1,a2,a3) 對於一個已知的向量 v= < a1, a2, a3 >,位置向量是一段從原點(0,0,0)到點 (a1, a2, a3)的特定線段。

非常重要的一點是丌要將向量和與其具有等效分量的點混淆。他們是兩個丌同的概念。在下 圖 Grasshopper 的定義中,點 P1 的座標等於向量的分量。

2


運算化設計的基礎數學

圖(3) :位置向量

向量運算 向量加法 我們在向量相加時將其相應的分量相加。即如果我們有兩個向量,a 和 b,那麼 a+b 可以運 算如下: a = <a1, a2, a3> b = <b1, b2, b3> a+b = <a1+b1, a2+b2, a3+b3> 例如,我們有 a<1, 2, 0> 和 b<4, 1, 4>,那麼和 a+b=<5, 3, 4>如下圖所示:

下圖的 Grasshopper 定義展示了如何通過將兩個輸入向量 a 和 b 的對應分量相加而得到向 量 a+b。

3


運算化設計的基礎數學

圖(4) :通過相加相應的分量來完成向量的相加

上圖得出的合併向量和通過 Grasshopper 嵌入式向量加法運算器計算出來的結果是一樣的:

圖(5) :用 GH vector addition 運算器來進行向量相加

通過相加兩個向量相應的分量來完成它們的相加。 向量加法在尋找多個向量的平均方向也是很有用的。在這種情況下,我們通常使用同樣長度 的向量。這裡有一個例子,展示了用等長向量和丌等長向量相加所產生的結果之間的區別:

圖(6) :通過向量相加以找到平均方向

輸入的向量並非都具有相同的長度。為了找到平均方向,你需要使用輸入向量中的“單位向 量”。正如我們將在後面看到的,單位向量是一個長度為 1 的向量。這裡有一個例子,展示 了在 Grasshopper 裡如何用丌同長度的向量相加來求解平均方向。

4


運算化設計的基礎數學

圖(7) :用單位向量來找到兩個或多個向量的平均方向

向量長度 我們將用符號|a|來表示一個已知向量 a 的長度。向量 a = <a1, a2, a3>的大小或長度可以用 如下方法計算: |a| = sqrt(a12 + a22 +a32) 這裡有一個用 Grasshopper function 運算器計算出向量大小的例子。

圖(8) :計算向量長度

注意 Grasshopper vector 運算器有一個輸出埠“L”表示的是向量大小。用上面例子中的同 一個向量,你會發現輸出的長度值與之前的例子是相等的。

圖(9) :向量長度作為 GH vector 運算器的一個輸出參數

向量標量乘法 已知向量 a = <a1, a2, a3>,而 t=某個實數, a*t = <a1*t, a2*t, a3*t > 如下是在 Grasshopper 環境中應用的等式:

圖(10) :向量標量運算

5


運算化設計的基礎數學

單位向量 單位向量是大小等於一個單位的向量。單位向量經常被用來比較向量的方向。 當一個向量的長度等於一個單位時,這個向量被稱作單位向量。

向量性質 向量有八個性質。如果 a、b 和 c 是向量且 s 和 t 是標量,那麼: 1. a + b = b + a 2. a +0= a 3. s(a+b)= sa +sb 4. st(a)= s(ta) 5. a+(b + c)=(a+b)+ c 6. a + (-a)=0 7. (s + t)a = sa + ta 8. 1* a = a

向量點積 兩個向量的點積可以定義如下: 已知: 向量 a = <a1, a2, a3>, 向量 b = <b1, b2, b3> a.b = a1*b1 + a2*b2 + a3*b3 在下列的圖解中,我們將展現 Grasshopper vector dot product 運算器如何求解出與上面 a.b 等式相同的結果:

圖(11) :兩個向量的點積是相應分量進行乘法運算後的總和

Grasshopper 有一個嵌入式的 vector dot product 運算器,如下圖所示:

6


運算化設計的基礎數學

圖(12) :用 GH vector dot product 對兩個向量進行點積運算

當計算兩個單位向量的點積時,其結果總是介於-1 和+1 之間。 一個向量與自身點積是向量長度的平方: a.a =|a|2 證明: 如果向量 a = <a1, a2, a3>,那麼根據兩個向量點積的定義: a.a = a1*a1+a2*a2+a3*a3 戒者 a.a =a12+a22+a32 而我們知道: |a| = sqrt(a12 + a22 +a32) 因此, a.a = |a|2 這裡有一個 Grasshopper 的例子,通過比較使用點積運算器的結果和向量與自身相乘的結 果展示了這個特性:

圖(13) :一個向量與自身做點積運算

點積和向量夾角 向量點積中一個重要的定理是: a.b =|a||b|cos(θ), 戒者 cos(θ)= a.b / (|a||b|) θ 是位置向量之間的夾角。 如果向量 a 和 b 都是單位向量,我們可以簡化成: cos(θ)= a.b

7


運算化設計的基礎數學

兩個單位向量的點積等於他們之間夾角的余弦值。

證明: 在三角形 ABC 中,由余弦定理可得: |AB|2 = |CA|2 + |CB|2 -2|CA||CB|cos(θ) 或: |a-b|2 = |a|2 + |b|2 -2|a||b|cos(θ) ---(1) |AB|2 等於 |a-b|2,於是有: |a-b|2 =(a-b).(a-b) = a.a -a.b -b.a + b.b =|a|2 -2a.b +|b|2 ---(2) 由 (1) 和 (2)可得: |a|2 -2a.b +|b|2 = |a|2 + |b|2 -2|a||b|cos(θ) 於是: 2a.b = 2|a||b|cos(θ) 或: cos(θ)= a.b / (|a||b|) 當且僅當 a.b = 0 時,向量 a 與 b 垂直。

那麼兩個平行的單位向量應如何計算點積呢? 最實用的辦法是,你可以想像兩個向量的點積等於一個向量在另一個向量上的投影長度。 這裡用了 Grasshopper 來解釋這個概念。在第一張圖中,我們計算 x 軸單位向量和輸入向 量 v 的點積。在第二張圖中,我們將位置向量 v 的端點投影到 x 軸直線上,並計算出從原點 到投影點的距離。你會發現點積和投影長度相等。

8


運算化設計的基礎數學

圖(14) :點積與向量間的夾角

點積性質 如果 a、b 和 c 都是向量而 s 為標量,那麼: 1. a . a =| a |2 2. a .(b + c)= a . b + a . c 3. 0. a =0 4. a . b = b . a 5. (sa). b = s(a . b)= a .(sb)

向量叉積 兩個三維向量的叉積是同時垂直於兩者的第三個三維向量。已知: a = <a1, a2, a3> b = <b1, b2, b3> 那麼叉積 a X b 可以用行列式來定義。這裡有一個圖解來說明如何計算一個行列式。我們用 標準基底向量 i=<1,0,0>, j=<0,1,0> and k=<0,0,1>

a x b = i(a2*b3) + j(a3*b1) + k(a1*b2) -k(a2*b1) -i(a3*b2) -j(a1*b3)

9


運算化設計的基礎數學

a x b = <a2*b3 – a3*b2, a3*b1 -a1*b3, a1*b2 -a2*b1> 這是一個 Grasshopper 對叉積的定義。如果比較用以上公式和 vector cross product 內嵌 式運算器計算出的結果,你會發現他們產生的結果是一樣的。

圖(15) :計算兩個向量的叉積

圖(16) :用 GH cross product 運算器計算兩個向量的叉積

向量 a x b 同時垂直于向量 a 和 b。 定理 對於任何一對三維向量 a 和 b |a x b| = |a||b|sin(θ) Θ 是 a 和 b 位置向量之間的夾角 或者如果 a 和 b 是單位向量,那麼他們叉積的長度等於他們之間夾角的正弦值。 換句話說: |a x b| = sin(θ)

10


運算化設計的基礎數學

這裡有一個例子,比較了用 GH 嵌入式 cross product 運算器計算和用上述公式運算的叉積 的結果。正如我們所預期的,他們產生的結果是相同的。

圖(17) :用函數和 GH 嵌入式運算器計算向量叉積的大小 加

在求解叉積的過程中,運算物件的順序是非常重要的。例如: a = <1, 0, 0> b = <0, 1, 0> a x b = <0, 0, 1> b x a = <0, 0, -1> 在 Rhino 的右旋坐標系統中,a X b 的方向有右手定則來確定(a=食指,b=中指,而結果 =拇指)

11


運算化設計的基礎數學

當且僅當 a x b = 0 時,向量 a 和 b 平行。

叉積性質 如果 a、b 和 c 是向量而 s 是標量,那麼: 1. a X b = -b X a 2. (sa) X b = s(a X b) = a X (sb) 3. a X (b + c) = a X b + a X c 4. (a + b) X c = a X c + b X c 5. a . (b X c) = (a X b) . c 6. a X (b X c) = (a . c)b – (a . b)c 例子 我們目前所回顧的所有概念都可以直接應用於解決建模中遇到的幾何問題。比如,給定一個 點和一個曲面,我們如何來確定這個點是對著曲面的正面還是背面呢?這需要幾個步驟來解 決這個問題:

1-定義曲面和點

2-將點拉到曲面上

3-從投射點到點定義一個向量 4-比較向量和曲面法線方向

這裡有一個具有與上述例子相同步驟的 Grasshopper 解決方案。注意到在這種情況下點積 大於 0 意味著點對著曲面的正面。如果點積小於 0 則點對著曲面的背面。

圖(18) :確定點的位置是對著曲面的正面還是背面

12


運算化設計的基礎數學

直線的向量方程 直線的向量方程被用於三維建模和電腦圖像中。 這裡有一個對於直線方程以及如何應用它的說明。

在圖中: L = 直線 v = 直線的方向向量 P0 = 直線的位置向量 r = r0 + a --- (1) a = t * v --- (2) 因此由(1)和(2)可得: r = r0 + t*v --- (3) 然而,我們可以將(3)式寫成: <x,y,z> = <x0,y0,z0> + <ta, tb, tc> <x,y,z> = <x0+ta, y0+tb, z0+tc> 因此 x = x0 + ta y = y0 + tb z = z0 + tc 也可以等效為: P = P0 + tv 這是表示直線上任意一點的 Grasshopper 定義:

圖(19) :找出直線上的點

13


運算化設計的基礎數學

例子 在下圖中,已知點P0和P1,求中點P。

注意到: a是點P0的位置向量 b是點P1的位置向量 v是從P0到P1的向量 從向量相加的性質可得: a + v = b, 或 v=b-a 而直線方程為:P = P0 + t*v,且由於t=0.5,v=b-a(如上) ,我們可以得出: P = P0 + 0.5(b-a) 運用上述的方程來創建一個Grasshopper定義:

圖(20) :找出輸入的兩點間的中點

一般而言,你可以通過改變t的值(0到1)來找到P0和P1之間的任意一點。

平面的向量方程 在上圖中:

14


運算化設計的基礎數學

P0(x0,y0,z0 ) =平面上的一個已知點 r0<x0,y0,z0> =P0的位置向量 n<a,b,c> =平面的法向量 P(x,y,z) =平面上的任意點 r<x,y,z> =P的位置向量

我們知道兩個垂直的向量點積等於0,因此: n.(r - r0) =0 戒者我們可以說: <a,b,c><x-x0 , y-y0 , z-z0 > = 0 通過求解點積得出平面的向量方程: a(x-x0) + b(y-y0) + c(z-z0) = 0

例子 我們如何通過使用原點和平面法向來找到通過三個點的平面呢?

為了找到一個平面,我們需要一個原點和平面的法向。現在我們已經有一個原點,而這可以 成為三個點中的任意一點,那麼我們如何找到平面的法向呢? 我們知道兩個向量的叉積同時垂直於這兩個向量。而這就是平面的法向。因此,這正是我們 用 Grasshopper 來解決這個問題的方法:

圖(21) :找到通過三個點的平面

15


運算化設計的基礎數學

2 矩陣和變換 簡介 儘管設計人員不需要在運算化設計中直接用到矩陣數學,但基礎知識的掌握對於理解螢幕背 後發生的事件是非常有用的。變換矩陣作用於移動,旋轉,投影以及縮放物件。變換矩陣同 時用於坐標系轉換,例如從三維世界坐標系轉變到二維螢幕坐標系。 我們可以將轉換定義為一個將一個點(戒向量)映射到另一個點(戒向量)的方程。那麼什 麼是矩陣,我們為什麼需要它轉換? 矩陣是矩形陣列的數字。矩陣維度是m乘n: m: 行數 n : 列數 因此如果我們有一個兩行三列的矩陣M,那麼我們可以將矩陣的維度表示如下: dim(M) = [2,3] 矩陣已經被證明是轉換的有效標記法。通過這個標記法,可以很快地執行多重變換。 而關 鍵是找到一個可以代表所有變換的格式,例如平移(移動),旋轉和縮放。

矩陣乘法 矩陣乘法被用於幾何體的轉化。一系列的變換矩陣首先相乘得到一個最後的變換矩陣,以此 來進行幾何體的轉化。矩陣乘法是矩陣運算裡使用頻率較高的一種,因此有必要對其進行詳 細說明。 兩個矩陣要相乘,必須有匹配的維度。換句話說,第一個矩陣的行數和列數必須等於第二個 矩陣的行數和列數。而合成矩陣具有與第一個矩陣相同的行數以及與第二個矩陣相同的列數。 比如我們有兩個矩陣 M1 和 M2,他們的維度分別為[2x4] 和 [4x5],那麼合成矩陣 M1.M2 的維度將是[2x5],如下圖所示:

下面是運算兩個矩陣相乘的一般步驟:

16


運算化設計的基礎數學

1.確保兩個矩陣匹配。 就是說已知兩個矩陣dim(M1)=[axb], dim( M2)=[cxd], b必須等於c。 2.計算出左面矩陣(係數表)第一行與右面矩陣(向量表)第一列對應項乘積的總和,記 為合成矩陣第一行第一列(1,1)的值。 3.重複步驟2計算出合成矩陣的所有項。 例如左側矩陣第三行與右側矩陣第二列對應項乘積的總和即是合成矩陣第三行第二列 (3,2)的對應項。

單位矩陣是矩陣中的一個特例。這種矩陣的主要性質是如果其與另一個矩陣相乘,其結果仍 是另一個矩陣,如下圖所示:

仿射變換 在這個部分,我們將討論一種特殊但常見的變換類型,仿射變換。當其應用於幾何仿射變換 時,能夠保留平行線關係,但丌能保證長度和角度丌變。平移(移動) ,縮放以及切變都是 仿射變換。

平移(移動)變換 一個點從起始位置通過某一特定向量的移動可以計算如下: P' = P + V 假設: P(x,y,z) 是一個已知點 v<a,b,c> 是一個平移向量 那麼: P'(x) = x + a P'(y) = y + b P'(z) = z + c

我們把一個三維點表示成有一個1在最後一行的4x1矩陣。這個“竅門”使得我們能夠表示平 移,事實上也能夠表示所有通過矩陣乘法運算的仿射變換。 平移矩陣的一般格式如下:

17


運算化設計的基礎數學

例如,將點P(2,3,1)通過向量v<2,2,2>進行移動,移動後點的位置為: P′= P + v = (2+2, 3+2, 1+2) = (4, 5, 3) 如果我們用矩陣形式將平移矩陣和輸入點相乘,那麼可以得出移動後點的位置。具體座標可 計算如下:

旋轉變換 這個例子展示了如何利用三角法計算繞著z軸和原點的旋轉變換,以及推出旋轉矩陣的一般 格式。 取平面P(x,y)上一點x,y並將其旋轉角度b,從圖中我們可以得出: x = d cos(a) ---(1) y = d sin(a) ---(2) x' = d cos(b+a) ---(3) y' = d sin(b+a) --- (4) 用角度和的正弦和余弦三角恒等式擴展(3) (4)兩式: x' = d cos(a)cos(b) - d sin(a)sin(b) ---(5) y' = d cos(a)sin(b) + d sin(a)cos(b) ---(6) 將(1) (2)兩式代入上式: x' = x cos(b) - y sin(b) y' = x sin(b) + y cos(b) 使用齊次座標 1,繞 z 軸的旋轉矩陣可表示為:

繞 x 軸旋轉 b 度的旋轉矩陣:

繞 y 軸旋轉 b 度的旋轉矩陣:

1 詳情參見 http://zh.wikipedia.org/zh-cn/%E9%BD%90%E6%AC%A1%E5%9D%90%E6%A0%87 18


運算化設計的基礎數學

OpenNURBS™, Rhino幾何圖書館 (http://www.openNURBS.org), 包括一個專門來 處理變換的種類, 叫做OnXform。它的功能是存儲了變換矩陣以及執行矩陣運算。下面是一 個旋轉物體的例子, 與此同時檢驗了OnXform的矩陣值和一般格式的旋轉矩陣計算出的結 果是否相同。你可以使用同樣的方法來檢驗其他轉換。

這裡在 Grasshopper 環境中將旋轉幾何體所輸出的矩陣值和一般的矩陣格式進行比較:

圖(22) :旋轉幾何體並輸出轉換矩陣

縮放變換 這個例子我們知道: P' = 縮放係數(S) * P 或: P'.x = Sx * P.x P'.y = Sy * P.y P'.z = Sz * P.z

這是縮放變換的矩陣格式:

19


運算化設計的基礎數學

切變變換 三維中的切變由相對於第三條軸的一組軸線來測量。對的比如,沿著z軸的切變不會改變這 條軸上的幾何屬性,但是會改變x軸和y軸的。 在x和z方向切變,y座標不變:

在y和z方向切變,x座標不變:

在x和y方向切變,z座標不變:

用 GH 定義來改變變換矩陣中的不同的參數值:

圖(23) :切變矩陣 20


運算化設計的基礎數學

平面投影變換 很直觀的,將一個已知的三維點 P(x,y,z)投影到世界坐標系的 xy 平面上,其投影點應為 Pxy(x,y,0)。同樣的, P 在 xz 平面上的投影點是 Pxz(x,0,z)。當投影到 yz 平面上時,Pxz = (0,y,z)。 這些都稱作正投影 2。 因此如果我們有一條已輸入的曲線並且應用了平面投影變換, 那麼我們可以在平面上得到一 條投影曲線。下圖展示了一個用矩陣形式將曲線投影到 xy 平面的例子。注意到 NURBS 曲 線(在下一章將對其進行說明)是用控制點來定義曲線的。投射曲線峰值來投射曲線控制點。

2 詳情參見 http://en.wikipedia.org/wiki/Projection_(linear_algebra)

21


運算化設計的基礎數學

3 參數曲線及曲面 簡介 參數曲線非常簡潔,並且是表示平滑曲線的一個直觀方法。同時相比於其他表示形式此類曲 線更容易編輯。例如,多重曲線使用一級分段近似的方法,因此需要用一大堆點來儲存一條 略微光滑的曲線。此外,對於曲線的編輯非常乏味,特別是需要保持曲線平滑度的時候。曲 線的精度越高,其存儲量越大,同時也更難編輯。 一條參數曲線是一個具有獨立參數(通常用 t 表示)3 的 函數,而這個參數落在某個定義域內(通常是 0 到 1) 。 我們可以將其看成一個旅行者描繪出的路徑。定義域就是 介於起始時間和終止時間之間的時間段。參數表示可在任 意時間確定旅行者地點,同時顯示這個旅行者所經過的路 徑。 我們用一個圓來作為例子。你可能還記得圓的方程是: x2 + y2 = r2 圓的參數方程可以用參數“t”定義如下: x = r cos(t) y = r sin(t) 為了顯示這兩個方程代表同樣的曲線,我們可以由原始方程匯出下列參數方程: x/r = cos(t) y/r = sin(t) 由於: cos(t)2 + sin(t)2 = 1(畢達哥拉斯恒等式) 那麼: (x/r)2 + (y/r)2 = 1, or x2 + y2 = r2

三次多項式曲線 Hermite4 曲線和 Bézier5 曲線是三次多項式曲線的兩個種類,他們都用四個參數確定。 Hermite 曲線由其兩個端點和由這兩個點出發的切向量四個參數控制,而 Bézier 曲線由四 個點控制。儘管他們數學上存在丌同,但他們具有共同的特徵和限制。

3 詳情參見 http://en.wikipedia.org/wiki/Parametric_equation

4 詳情參見 http://en.wikipedia.org/wiki/Cubic_Hermite_spline 5 詳情參見 http://en.wikipedia.org/wiki/B%C3%A9zier_curve

22


運算化設計的基礎數學

在多數情況下,曲線由多個部分組成,這就是所謂的分段三次曲線。這裡有一個圖解,展示 了用 10 個存儲點來生成一個由三段曲線組成的分段 Bezier 曲線。應該注意到儘管曲線最後 連接在一起了,但看起來並不平滑。

儘管 Hermite 曲線與 Bézier 曲線使用同樣數量的參數來控制(4 個參數來控制一條曲線), 但正切曲線具有的附加資訊能夠與下一段曲線共用,以此用更少的存儲量來生成一條看起來 更平滑的曲線,如下圖所示:

為了得出更平滑和更連貫的曲線,我們可以使用一個相當有效的曲線表示方法,叫做 Non Uniform Rational B-Spline6 (NURBS)。 曲線分段共用更多的控制點,以此用更小的存儲 量得出更平滑的曲線,如下圖所示:

6 詳情參見 http://en.wikipedia.org/wiki/Non-uniform_rational_B-spline 23


運算化設計的基礎數學

NURBS 曲線和曲面是 Rhino 用來表示幾何物件的主要數學表示方法。NURBS 曲線的特徵 和組成部分將在本章稍後進行詳細討論。 那麼三次多項式曲線的方程是什麼樣的呢?你將不會在設計工作中用到這些方程,但我想介 紹通用方程是非常有用的,它將會給你提供一個參考。 三次多項式曲線段的參數方程:

代入方程: x(t) = axt3 + bxt2 + cxt + dx y(t) = ayt3 + byt2 + cyt + dy z(t) = azt3 + bzt2 + czt + dz 我們可以將上述Q(t)等式寫作: Q(t) = C. T 當T為:

C為矩陣係數:

我們可以用矩陣乘法快速得出曲線方程的原始形式:

24


運算化設計的基礎數學

幾何連續性 在三維建模中連續性是一個很重要的概念。為了達到視覺平滑和保持輕盈光滑的形態,連續 性是非常重要的。 下列表格列舉了各種連續性以及他們的定義: G0(位置連續)

兩條曲線的端點連在一起

G1(相切連續)

兩條曲線在連接點的切線方向相同

G2(曲率連續)

曲率和切線在兩條曲線段的公共端點均相同

GN

高次曲線

下面的例子比較了曲線“a”的一端和“b”、“c”、“d”曲線的另一端連接後的曲線連 續性。GH script運算器計算出了各條曲線P點的切向量和向量長度: A=連接點的切向量 L=向量的長度

圖(24) :檢驗曲線連續性 25


運算化設計的基礎數學

注意到: 曲線A和B是G0連續(連接點的切向量丌同) 曲線A和C是G1連續(連接點的切向量相同) 曲線A和D是G2連續(連接點的G1和曲率都相同)

曲率 在創建三維曲線和曲面時曲率是一個廣泛使用的概念。曲率被定義為曲線上單位長度圓弧正

切斜率的改變。對於一個圓戒球體,曲率即是半徑的倒數。

在平面上曲線的任意一點,最接近曲線且經過這點的直線稱作切線。同時我們發現最接近曲 線且經過這點的圓是與曲線相切的。這個圓半徑的倒數就是曲線上這點的曲率。 最逼近曲線的圓可以位於曲線的左方戒右方。如果我們對這個介意的話,我們可以設定一個 慣例,例如圓在曲線左方的話給曲率標上正號,在右方則標上負號。這也被稱作正負曲率。 連接曲線的曲率值顯示了這些曲線之間的連續性,如下圖所示。

G0、G1、G2 三種丌同幾何連續性曲線的曲率圖

對於曲面,法曲率是曲面曲率的概括。已知曲面上一點且有一個方向位於該點切平面上,正 截面曲率可由曲面和過這個點的平面及法線方向相交計算而成。 正截面曲率是過曲線上該點的正負曲率。 如果我們計算切平面上的所有方向到這個點的法曲率,我們會找到一個最大值和一個最小 值。

主曲率 曲面上一點的主曲率是該點法曲率的最大值和最小值。主曲率用來計算曲面的高斯曲率和平 均曲率。

26


運算化設計的基礎數學

高斯曲率 曲面上一點的高斯曲率等於兩個主曲率的乘積。任意具有正高斯曲率的曲面上的點的切平面 與曲面只有一個接觸點,而有負高斯曲率的曲面上點的切平面則能將曲面切開。

A:碗狀曲面具有正曲率 B : 鞍狀曲面具有負曲率 C:當曲面至少有一個方向是平的時候,曲率為0

平均曲率 平面上一點的平均曲率是該點兩個主曲率之和的一半。任何平均曲率為 0 的點都具有小於等 於 0 的高斯曲率。 曲面上任意一點的平均曲率都為 0 的曲面稱之為極小曲面。曲面上任意一點的平均曲率均等 於一個固定值的曲面稱為常平均曲率曲面(CMC) 。 能夠用常平均曲率曲面類比的物理過程包括肥皂泡 (自由的或依附在其他物體上的) 的形成。 不像一個簡單的肥皂膜,肥皂泡包裹著一定的容積,同時它內部的壓力與其保持自身最小面 積的力平衡。 曲率處處為 0 的極小曲面是常平均曲率曲面(CMC)的一個子集。 能夠用極小曲面類比的物理過程包括肥皂膜橫跨固定物體的最終形態,例如鋼絲圈。肥皂膜 並不被空氣壓力所扭曲(兩邊的壓力相等) ,並且它能夠不受約束地保持自身具有最小面積。 這與肥皂泡形成鮮明的對比,肥皂泡包含固定的體積同時膜內和膜外的壓力不相等。平均曲 率就是用來找出曲面上曲率突變的部位。

27


運算化設計的基礎數學

參數曲線的評價演算法 三次Bézier曲線的De Casteljau演算法7 De Casteljau演算法以它的發明者名字Paul De Casteljau命名,它用遞迴法來描述Bézier 曲線。 我們將展示如何在Grasshopper中運用De Casteljau演算法,利用參數t來找到曲線上任意 一點。為此我們需要輸入以下條件: 四個點 A, B, C, D t,位於曲線定義域(0-1)內的參數 輸出: 曲線上t位置的點 求解步驟: 求出直線AB在參數t位置的點M 求出直線BC在參數t位置的點N 求出直線CD在參數t位置的點O 求出直線MN在參數t位置的點P 求出直線NO在參數t位置的點Q 求出直線PQ在參數t位置的點R

圖(25) :在 GH 裡創建 Bézier 曲線

這是在 Grasshopper 裡用 De Casteljau 演算法來求 Bézier 曲線上的某個參數。注意到你 可以改變 t 的值(介於 0 和 1 之間)來找到 Bézier 曲線上起始點與終點之間的任意點。

7De Casteljau演算法的具體細節請參見http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm 28


運算化設計的基礎數學

圖(26) :用 De Casteljau 演算法來求得 Bézier 曲線上的某個點

NURBS曲線的De Boor8演算法 De Boor演算法是Bézier曲線De Casteljau演算法的一般形式。它的數值穩定且廣泛用於三 維應用程式來求取NURBS曲線上的點。下面是一個用De Boor演算法9來求取三階NURBS 曲線上的點的例子。 輸入 7個控制點P0到P6 節點向量: u0 = 0.0 u1 = 0.0 u2 = 0.0 u3= 0.25 u4 = 0.5 u5 = 0.75 u6 = 1.0 u7 = 1.0 u8 = 1.0 輸出: 曲線上的點在u=0.4的位置上 求解步驟:

8De Boor演算法的具體細節請參見http://en.wikipedia.org/wiki/De_Boor's_algorithm 9該演算法的綜述和例子請參見

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/de-Boor.html 29


運算化設計的基礎數學

1. 計算第一次反覆運算的係數: Ac = (u – u1) / ( u1+3 – u1) = 0.8 Bc = (u – u2) / ( u2+3 – u2) = 0.53 Cc = (u – u3) / ( u3+3 – u3) = 0.2

2. 用係數資料計算點: A = 0.2P1 + 0.8P2 B = 0.47 P2 + 0.53 P3 C = 0.8 P3 + 0.2 P4

3. 計算第二次反覆運算的係數: Dc = (u – u2) / (u2+3-1 – u2) = 0.8 Ec = (u – u3) / (u3+3-1 – u3) = 0.3

4. 用係數資料計算點: D = 0.2A+ 0.8B E = 0.7B + 0.3C

5. 計算最後一次反覆運算的係數: Fc = (u – u3)/ (u3+3-2 – u3) = 0.6

6. 找出曲線上的點在參數u=0.4 的位置 F= 0.4D + 0.6E 在 Grasshopper 中用 De Boor 演算法來求得 NURBS 曲線上參數 u=0.4 位置的點。

圖(27) :用 De Boor 演算法計算曲線上的一點

30


運算化設計的基礎數學

參數曲線的評價演算法 NURBS是一種對曲線和曲面的精確數學描述,同時它們也能夠高度直觀地進行編輯。 有許多關於NURBS的書籍和參考資料可供你深入閱讀 (http://en.wikipedia.org/wiki/NURBS)。對於NURBS的基本理解將更有效地幫助你使用 NURBS的相關建模工具。 四個屬性定義了一條NURBS曲線:階數、控制點、節點和評定法則:

階數 階數是一個正整數。在 Rhino 中,任何大於 1 的階數均有效。5 階也是比較常見的,但大於 5 的階數在現實世界中並不是非常有用。下列是一些曲線及其階數的例子: 直線和多重直線是1階NURBS曲線。 次數=2(次數=階數+1)

圓和橢圓是2階NURBS曲線。 同時它們是有理曲線或者非均勻曲線。 次數=3

自由形態曲線通常是 3 階 NURBS 曲線 的代表。 次數=4

控制點 NURBS 曲線的控制點是一系列點,至少有(階數+1)個。改變一條NURBS曲線形狀最常 見的一種方法就是移動它的控制點。

控制點有一個關聯值稱作權重。除了極少數例外,權重都是正數。當曲線的所有控制點具有 相同的權重時(通常是 1) ,曲線被稱作非有理曲線,否則則為有理曲線。我們將會用一個例 子展示在 Grasshopper 裡如何互動式地改變控制點的權重。

31


運算化設計的基礎數學

節點及節點向量 每條NURBS曲線都有一系列被稱作節點向量(這裡的向量丌是指3D方向)的數值與它關聯。 節點有一點難理解和設定,幸運的是 SDK(Software Development Kit 的縮寫,中文意思 為“軟體開發套件”)函數幫你做了這部分工作。然而,關於這部分僅有少量相關知識有助 於我們學習節點向量。

節點作為參數值 節點是一系列非遞減的參數值。節點比控制點多(階數-1)個。對於非週期曲線,其節 點序列的最前面幾個節點是相同的,最後面幾個節點也是相同的。曲線的範圍則是介於 這些節點的極值之間。

節點重數 一個節點的重數值是列于節點向量上的次數(即同一個數值出現的次數) 。一個節點的重 數值丌會大於曲線的階數。節點的重數值被用來控制相應曲線點的連續性。

完全重數節點 完全重數節點的重數值等於曲線的階數。在完全重數節點處有一個對應的控制點,且曲 線經過這個點。 比如,鉗位元曲線的端點是完全重數節點。這解釋了為何曲線的結束控制點(首末兩個 控制點)會與曲線的端點重合。一個內部完全重數允許曲線上相應點作為轉點。

單純節點 節點值只出現一次。

一致節點向量 一個一致節點向量需滿足兩個條件: 1. 節點清單以完全重數節點開始,接下來是單純節點,最後以完全重數節點結束。 2. 節點值為等差遞增。這是典型的鉗位元曲線。週期曲線則有所丌同,我們將會在接下 來討論。 這裡有兩條曲線,它們具有完全相同的控制點和丌同的節點向量:

32


運算化設計的基礎數學

階數=3 控制點數目=7 節點向量=(0,0,0,1,2,3,5,5,5)

階數=3 控制點數目=7 節點向量=(0,0,0,1,1,1,4,4,4) 注意: 位於中間的完全節點重數生成 了一個轉點且曲線被迫通過這個相關 控制點。

評定法則 評定法則使用的是一個數學公式,這個公式通過輸入一個數值來得出一個點的位置。這個公 式牽涉到階數、控制點和節點。 用這個公式,SDK 函數可以通過一個曲線參數得出曲線上的對應點。參數是位於曲線定義域 範圍內的數值。定義域通常是遞增的,且包含兩個數:最小值參數(m_t(0)),通常是曲線的 起始點;最大值參數(m_t(1)),即為曲線的終點。

NURBS 曲線的特徵 為了生成一條 NURBS 曲線,你需要提供如下資訊: ●維數,通常是 3 ●階數(有時用次數,其值等於階數+1) ●控制點(一組點) ●節點向量(一組數字) ●說明曲線是否是有理曲線(我們將在權重的討論中解釋有理曲線的概念) 使用三維建模,你通常需要指定曲線的階數和控制點。建立一條 NURBS 曲線的餘下資訊將 會自動生成。選擇將起始點與終點重疊通常會產生一條週期性光滑封閉曲線。下圖展示了開 放(鉗位元)曲線,非週期性閉合曲線和週期性閉合曲線。我們將在下一部分討論開放(鉗 位元)曲線和週期性曲線。 1 階開放曲線 注意到曲線是怎麼通過所有控制點的。

33


運算化設計的基礎數學

3 階開放曲線 曲線的兩個端點與首末兩個控制點重合。

3 階閉合(非週期)曲線 曲線的起始點和終點都與一個控制點重疊。

移動一個非週期性曲線的控制點造成了一個 轉點,使曲線看起來不再那麼光滑。

3 階閉合週期性曲線 注意到曲線起始點(終點)不經過控制點。那 個點叫做“曲線焊縫”。在圖中用紅色的點標 示出來。

移動週期性曲線的控制點並不會影響曲線的 光滑度或者造成一個轉點。

34


運算化設計的基礎數學

開放(鉗位元)曲線 vs NURBS曲線 鉗位元曲線是曲線終點與控制點終點重合的曲線(通常是開放的) 。週期性曲線是光滑的閉 合曲線。理解兩者不同的最好方法是比較它們的控制點。 下面的運算器創建了開放的 NURBS 曲線,同時輸出了其控制點和節點向量:

圖(28) :分析開放 NURBS 曲線

這裡有一個用同樣的輸入條件(控制點和曲線階數)創建的週期性曲線:

圖(29) :分析週期性 NURBS 曲線

注意到週期性曲線將四個輸入點轉換成七個控制點(4+階數),而開放曲線則只是用四個控 制點。週期性曲線的節點向量只使用單純節點,而開放曲線的起始節點和終止節點均是完全 重數節點。 這裡有一個 2 階曲線的例子。正如你所預料的,當階數改變的時候,週期性曲線控制點和節 點的數目也隨之改變。

35


運算化設計的基礎數學

圖(30) :分析 2 階 NURBS 曲線

權重 在均勻 NURBS 曲線中,控制點的權重被預設為 1,但是這個值在有理 NURBS 曲線中可以 改變。下面的例子展示了如何在 Grasshopper 環境中互動式地改變控制點的權重。

圖(31) :分析 NURBS 曲線的權重

NURBS 曲面 你可以想像 NURBS 曲面是一個向兩個方向延伸的 NURBS 曲線的網格。 NURBS 曲面的形狀為一系列的控制點和兩個方向上曲面的階數(u 和 v 方向)所定義。

36


運算化設計的基礎數學

圖(32) :NURBS 曲面的範圍

NURBS 曲面可分為修剪曲面和未修剪曲面。修剪曲面是用基本的 NURBS 曲面和閉合曲線 來修剪出一個特定形狀的曲面。每個曲面都有一條閉合的曲線來定義它的外輪廓(外環), 同時有一條丌相交的內部閉合曲線來定義曲面上的孔洞(內環) 。如果一個曲面的外輪廓與 其基本 NURBS 曲面相同且沒有孔洞,則我們通常將其稱之為未修剪曲面。

圖(33) :修剪過的 NURBS 曲面

左側的曲面是未被修剪過的。右側的曲面則是被一個橢圓孔修剪過的同一曲面。注意到曲面 的 NURBS 結構在修剪時並沒有改變。

NURBS 曲面的特徵 除某個方面外,NURBS 曲面的特徵與 NURBS 曲線非常相像。NURBS 曲面擁有以下資訊: ●維數,通常是 3 ●u 和 v 方向的階數(有時用次數,其值等於階數+1) ●u 和 v 方向的控制點 ●節點向量(二維陣列的數位) ●說明曲面是否是有理曲面。 正如 NURBS 曲線一樣,你將丌太可能需要知道如何創建一個 NURBS 曲面的細節,因為三 維建模器通常會提供一套優秀的工具來幫助你完成 NURBS 曲面的創建。 你可以隨時重建擁有新的階數和控制點數量的曲面(曲線也是如此。同時曲面的類型可以是 開放的、閉合的戒者週期性的。 這裡有一些曲面的例子,它們擁有丌同的階數,控制點數目和曲面類型(開放的戒者週期性 的) 。

37


運算化設計的基礎數學

在 u 和 v 方向都是 1 階的曲面 所有的控制點位於曲面上

u 方向為 3 階,v 方向為 1 階的開放曲面 注意到曲面的拐角與拐角的控制點重合。

u 方向為 3 階,v 方向為 1 階的閉合(非週 期)曲面 注意到控制點與曲面焊縫重合。

移動閉合(非週期)曲面的控制點造成了一 個轉點,使曲面看起來不再那麼光滑。

38


運算化設計的基礎數學

u 方向為 3 階,v 方向為 1 階的週期性曲面 注意到曲面的控制點與曲面焊縫不重合。

移動週期性曲面的控制點並不會影響曲面的 平滑度戒者造成一個轉點。

多重曲面 一個多重曲面包括兩個戒多個連接在一起的(可能是修剪過的)NURBS 曲面。每個曲面都 有自己的參數設定和無需與整體匹配的 u、v 方向。多重曲面和修剪曲面都可以用邊界標記 法(縮寫為 brep)來表示。邊界標記法基本描述了曲面,邊界和幾何頂點的附加資料,以 及不同部分之間的關係。比如,brep 描述了各個面,以及它們的外層邊界和修剪邊界,相 對於曲面的法線方向,與鄰近曲面的關係等。對於完全封閉的 brep 物體,我們可以將它們 稱為實體。 下列例子中的盒子是由六個未修剪的曲面連接而成:

圖(34) :多重曲面由多個 NURBS 曲面合併而成

許多多重曲面是由修剪過的曲面連接而成。以下例子中圓柱的頂面和底面是由平表面修剪而 成。

39


運算化設計的基礎數學

圖(35) :多重曲面的面可以是修剪過的 NURBS 曲面

我們可以看到通過編輯 NURBS 曲線來編輯一個表面是非常直觀的,它只需要互動式地移動 控制點就可以了。然而,編輯多重曲面及保持多個面的組合邊界則並不那麼直觀。在三維 NURBS 建模環境中提供了一些工具來對多重曲面進行直接地編輯戒者變形,但是我們也經 常將多重曲面炸開為組合之前的多個曲面,並對它們各自進行編輯,而後再連接在一起。在 這個過程中,使用者必須保持邊界在容許範圍內正確對齊以達到成功合併的目的。 例子 在盒子上創建一個圓洞的步驟。 首先我們需要一個盒子,以及一個標記洞口 位置及直徑的圓。

將圓投射到盒子上。

40


運算化設計的基礎數學

用投射圓來修剪盒子的頂面和底面。

用投射圓來創建位於它們之間的軋製表面。

將修剪的曲面和孔壁合併到一起。

41


運算化設計的基礎數學

參考文獻 Edward Angel, "Interactive Computer Graphics with OpenGL,” Addison Wesley Longman, Inc., 2000. James D Foley, Steven K Feiner, John F Hughes, "Introduction to Computer Graphics" Addison-Wesley Publishing Company, Inc., 1997. James Stewart, "Calculus," Wadsworth, Inc, 1991. Kenneth Hoffman, Ray Kunze, “Linear Algabra”, Prentice-Hall, Inc., 1971 Rhinoceros® help document, Robert McNeel and Associates, 2009.

42


運算化設計的基礎數學

中英文名詞對照 2D coordinate system

二維坐標系

multiple transformations

多重變換

3D coordinate system

三維坐標系

non- rational

非有理的

affine transformations

仿射變換

normal curvature

法曲率

anchor point

錨點

NURBS curves

NURBS 曲線

average direction

平均方向

NURBS surfaces

NURBS 曲面

Bézier curve

Bézier 曲線

order

次數

clamped (open) curve

鉗位元(開放)曲線

orthogonal

垂直的

closed (non-periodic) curve

非週期性閉合曲線

parametric curves

參數曲線

closed periodic curve

週期性閉合曲線

parametric surfaces

參數曲面

coefficient

係數

piecewise cubic curve

分段三次曲線

column

polyline

多重直線

component

運算器

polysurfaces

多重曲面

constant mean curvature surface

常平均曲率曲面

position vector

位置向量

contral point

控制點

principal curvatures

主曲率

control point

控制點

projection

投影

cubic polynomial curves

三次多項式曲線

rational

有理的

curvature

曲率

real number

實數

curve seam

曲線焊縫

reciprocal

倒數

De Boor algorithm

De Boor 演算法

recursive method

遞迴法

De Casteljau algorithm

De Casteljau 演算法

right-handed system

右旋坐標系

degree

階數

rotation

旋轉

determinant

行列式

row

dimension

維度

scalar

標量

full-multiplicity knot

完全重數節點

scale

縮放

Gaussian curvature

高斯曲率

shear

切變

geometric continuity

幾何連續性

simple knot

單純節點

Hermite curve

Hermite 曲線

solid

實體

homogenous coordinate

齊次座標

tangent line

切線

iteration

反覆運算

tangent vector

切向量

kink

轉點

translation

平移

knot

節點

uniform knot vector

一致節點向量

knot multiplicity

節點重數

unit vector

單位向量

knot vector

節點向量

vector cross product

向量叉積

line-segment

線段

vector dot product

向量點積

matrices

矩陣

vector length

向量長度

matrix multiplication

矩陣乘法

vector mathematics

向量數學

mean curvature

平均曲率

vector operations

向量運算

minimal surface

極小曲面

weights

權重

43


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.