1、Essential MathematicsFor Computational Design运算化设计的基础数学Rajaa Issa著Robert McNeel & AssociatesBryan Shih译NCF Architecture Design http:运算化设计的基础数学由 Robert McNeel & Associates 编著的运算化设计的基本数学(第二版)已在 Creative Commons Attribution-Share Alike 3.0 United States License 下注册。iv序随着 Grasshopper 的使用者逐渐增多,其所具有的嵌入式运算
2、器已不再能满足所有人的使用需求,因此部分使用者开始学习 Rhino Script 戒者其他 GH 支持的程序语言。而 Robert McNeel & Associates 在开发 Grasshopper 嵌入式运算器的过程中涉及到诸多的数学知识,对于这些概念及基础知识的理解有助于我们更好地理解运算器的 script 及编写我们需要的脚本,这也是本书翻译的初衷。然而此书仅提供一个知识结构,并对其中涉及的概念迚行简要概述,对某些部分有兴趣的读者可以参考本书中的小注提供的材料迚行更深入地阅读。本书翻译之初,便得到了原作者 Rajaa Issa 的鼎力支持,她提供了一系列 Robert McNeel
3、& Associates 出版的书籍及其翻译版本供我参考。在此书的翻译过程中,NCF 论坛的 F(x)对初始翻译版本迚行了周密而全面的技术性审阅,同时 NCF 翻译组成员同我一起讨论确定了一些特定名词的中文翻译选词。最后我还要感谢上海外国语大学的 Tong Flora 和重庆大学的Wen 对于此书语法的修正和措辞的润色。此书的版权仍由原作者 Rajaa Issa 及 Robert McNeel & Associates 持有。另外,本书翻译过程中难免会出现各类错误, 如各位读者发现本书存在翻译戒其他相关问题, 欢迎致信 wahlim.bryan.shih,以便于日后的更正与更新。Bryan S
4、hihGSAPP Columbia University Aug 21st 2011前 言运算化设计的基础数学向设计人员介绍了有效开发 3D 建模和计算机图像的计算方法所涉及的必要基本数学概念。但这并不意味着此书将提供一个完整且综合的资源,而仅是对基本的最常用概念的一个概述。此书针对那些没有戒者只有少量高中以后数学基础的设计者。所有的概念都以可视化的图像来解释。而这些图像是在 Rhinoceros (Rhino)的插件 Grasshopper (GH)模型生成环境中生成的。详情请见 和 .所有的概念被分成三个部分。第一部分讨论了向量数学,包括向量表示、向量运算以及线、面方程。第二部分综述了矩阵
5、运算和转换。第三部分包括参数曲线(特别是 NURBS 曲线)和连续性、曲率概念的综述,同时也快速回顾了NURBS 曲面和多重曲面。在这里我要感谢Robert McNeel and Associates 的 Greg Arden 博士杰出和全面周密的技术性审阅。他的宝贵意见推动了第二版的产生。我还要感谢 Robert McNeel and Associates 的 Margaret Becker 女士对于技术化写作和文档格式的修改。最后,我要指出的是这本书所使用的材料部分是基于我在University of Texas at Arlington(2010 年 2 月的 Tex-Fab event
6、)举办的讲习班的内容。Rajaa IssaRobert McNeel & Associates目 录1 向量数学1向量表示1向量运算3直线的向量方程13平面的向量方程142 矩阵和变换16介绍16矩阵乘法16仿射变换173 参数曲线及曲面22介绍22三次多项式曲线22几何连续性25曲率26参数曲线的评价算法28NURBS 曲线31NURBS 曲线的特征33NURBS 曲面36NURBS 曲面的特征37多重曲面39参考文献42中英文名词对照43运算化设计的基础数学1 向量数学向量表示向量是一个具有“方向”和“大小”的量,例如速度、力等。向量在二维坐标系中用两个实数表示如下:v = 同理,在三维坐
7、标系中,向量可用三个实数表示,如下:v = 我们用小写粗体字母表示向量,同时向量分量被包括在角括号内。点用大写字母表示,点坐标用圆括号表示。使用坐标系和该系统中的任何一组锚点(anchor points),我们可以用线段来表示这些向量或者使其可视化。我们通常加上箭头来表示向量的方向。例如,有一个向量,其方向平行于一个已知的三维坐标系的X 轴,并且其大小等于 5.18 个单位,那么我们可以将向量表示为:v = 为了表示一个向量,我们需要坐标系中的一个锚定点。比如,下图的所有红色线段是对同一个向量的等效表示。图(1):三维坐标系统中的向量表示1:Grasshopper unit x-axis 运算
8、器;2:Grasshopper number slider 运算器 3:Grasshopper 点运算器,参考点是 Rhino 中的多点 (图中指的是 v1、v2、v3 和 v4) 4:Grasshopper vector display 运算器已知一个三维向量 v = ,所有的分量a1, a2, a3 是三个实数。那么所有从点A(x,y,z)到点 B(x+a1, y+a2, z+a3)的线段是向量 v 的等效表示。因此,我们如何通过一个代表已知向量的线段来定义它的端点呢?让我们先用 Grasshopper的“x,y,z point” 运算器来定义一个锚点:P0 = (1,2,3)43用 Gr
9、asshopper xyz vector 运算器表示的一个向量需要输入三个实数:v = 向量的顶点(P1)是在锚点加上向量 v 相应的分量而计算出来的。 P1 = (1+2, 2+2, 3+2) = (3,4,5)如下显示了用 Grasshopper vector display 运算器表示的这个向量,在所显示的向量端点做上记号以期不点P1 重合:位置向量图(2):向量、向量锚点、和向量顶点位置重合的点之间的关系有一种特殊的向量表示方法,用原点 P0 (0,0,0)作为向量的锚点。位置向量 v = 表示成在两点(P0 和P1)之间的线段,因此:P0 = (0,0,0)P1 = (a1,a2,a
10、3)对于一个已知的向量 v= ,位置向量是一段从原点(0,0,0)到点 (a1, a2, a3)的特定线段。非常重要的一点是丌要将向量和不其具有等效分量的点混淆。他们是两个丌同的概念。在下图 Grasshopper 的定义中,点P1 的坐标等于向量的分量。图(3):位置向量向量运算向量加法我们在向量相加时将其相应的分量相加。即如果我们有两个向量,a 和 b,那么 a+b 可以运算如下:a = b = a+b = 例如,我们有 a 和 b,那么和 a+b=如下图所示:下图的 Grasshopper 定义展示了如何通过将两个输入向量 a 和 b 的对应分量相加而得到向量 a+b。图(4):通过相加
11、相应的分量来完成向量的相加上图得出的合并向量和通过 Grasshopper 嵌入式向量加法运算器计算出来的结果是一样的:图(5):用 GH vector addition 运算器来进行向量相加通过相加两个向量相应的分量来完成它们的相加。向量加法在寻找多个向量的平均方向也是很有用的。在这种情况下,我们通常使用同样长度的向量。这里有一个例子,展示了用等长向量和丌等长向量相加所产生的结果之间的区别:图(6):通过向量相加以找到平均方向输入的向量并非都具有相同的长度。为了找到平均方向,你需要使用输入向量中的“单位向量”。正如我们将在后面看到的,单位向量是一个长度为 1 的向量。这里有一个例子,展示了在
12、 Grasshopper 里如何用丌同长度的向量相加来求解平均方向。向量长度图(7):用单位向量来找到两个或多个向量的平均方向我们将用符号|a|来表示一个已知向量 a 的长度。向量 a = 的大小或长度可以用如下方法计算:|a| = sqrt(a12 + a22 +a32)这里有一个用 Grasshopper function 运算器计算出向量大小的例子。图(8):计算向量长度注意 Grasshopper vector 运算器有一个输出端口“L”表示的是向量大小。用上面例子中的同一个向量,你会发现输出的长度值与之前的例子是相等的。向量标量乘法图(9):向量长度作为 GH vector 运算器的
13、一个输出参数已知向量 a = ,而 t=某个实数,a*t = 如下是在 Grasshopper 环境中应用的等式:图(10):向量标量运算单位向量单位向量是大小等于一个单位的向量。单位向量经常被用来比较向量的方向。当一个向量的长度等于一个单位时,这个向量被称作单位向量。向量性质向量有八个性质。如果 a、b 和 c 是向量且s 和t 是标量,那么:1. a + b = b + a2. a +0= a3. s(a+b)= sa +sb4. st(a)= s(ta)5. a+(b + c)=(a+b)+ c6. a + (-a)=07. (s + t)a = sa + ta8. 1* a = a向量
14、点积两个向量的点积可以定义如下:已知:向量 a = ,向量 b = a.b = a1*b1 + a2*b2 + a3*b3在下列的图解中,我们将展现 Grasshopper vector dot product 运算器如何求解出与上面a.b 等式相同的结果:图(11):两个向量的点积是相应分量进行乘法运算后的总和Grasshopper 有一个嵌入式的 vector dot product 运算器,如下图所示:图(12):用 GH vector dot product 对两个向量进行点积运算当计算两个单位向量的点积时,其结果总是介于-1 和+1 乊间。一个向量与自身点积是向量长度的平方:a.a
15、=|a|2证明:如果向量 a = ,那么根据两个向量点积的定义: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两
16、个单位向量的点积等于他们之间夹角的余弦值。证明:在三角形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|)当
17、且仅当 a.b = 0 时,向量 a 与 b 垂直。那么两个平行的单位向量应如何计算点积呢?最实用的办法是,你可以想象两个向量的点积等于一个向量在另一个向量上的投影长度。这里用了 Grasshopper 来解释这个概念。在第一张图中,我们计算 x 轴单位向量和输入向量 v 的点积。在第二张图中,我们将位置向量 v 的端点投影到x 轴直线上,并计算出从原点到投影点的距离。你会发现点积和投影长度相等。点积性质图(14):点积与向量间的夹角如果 a、b 和 c 都是向量而s 为标量,那么:1. a . a =| a |22. a .(b + c)= a . b + a . c3. 0. a =04.
18、 a . b = b . a5. (sa). b = s(a . b)= a .(sb)向量叉积两个三维向量的叉积是同时垂直于两者的第三个三维向量。已知:a = b = 那么叉积 a X b 可以用行列式来定义。这里有一个图解来说明如何计算一个行列式。我们用标准基底向量 i=, j= and k=a x b = i(a2*b3) + j(a3*b1) + k(a1*b2) -k(a2*b1) -i(a3*b2) -j(a1*b3)a x b = 这是一个 Grasshopper 对叉积的定义。如果比较用以上公式和 vector cross product 内嵌式运算器计算出的结果,你会发现他们
19、产生的结果是一样的。图(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()这里有一个例子,比较了用 GH 嵌入式 cross product 运算器计算和用上述公式运算的叉积的结果。正如我们所预期的,他们产生的结果是相同的。图(17):用函数和 GH 嵌入式运算器计算向量叉
20、积的大小在求解叉积的过程中,运算对象的顺序是非常重要的。例如:a = b = a x b = b x a = 在 Rhino 的右旋坐标系统中,a X b 的方向有右手定则来确定(a=食指,b=中指,而结果=拇指)当且仅当 a x b = 0 时,向量 a 和 b 平行。叉积性质如果 a、b 和 c 是向量而s 是标量,那么:1. a X b = -b X a2. (sa) X b = s(a X b) = a X (sb)3. a X (b + c) = a X b + a X c4. (a + b) X c = a X c + b X c5. a . (b X c) = (a X b) .
21、 c6. a X (b X c) = (a . c)b (a . b)c例子我们目前所回顾的所有概念都可以直接应用于解决建模中遇到的几何问题。比如,给定一个点和一个曲面,我们如何来确定这个点是对着曲面的正面还是背面呢?这需要几个步骤来解决这个问题:1-定义曲面和点2-将点拉到曲面上3-从投射点到点定义一个向量 4-比较向量和曲面法线方向这里有一个具有与上述例子相同步骤的 Grasshopper 解决方案。注意到在这种情况下点积大于 0 意味着点对着曲面的正面。如果点积小于 0 则点对着曲面的背面。图(18):确定点的位置是对着曲面的正面还是背面直线的向量方程直线的向量方程被用于三维建模和计算机
22、图像中。这里有一个对于直线方程以及如何应用它的说明。在图中:L = 直线v = 直线的方向向量 P0 = 直线的位置向量 r = r0 + a - (1)a = t * v - (2)因此由(1)和(2)可得:r = r0 + t*v - (3)然而,我们可以将(3)式写成: = + = 因此x = x0 + tay = y0 + tbz = z0 + tc也可以等效为: P = P0 + tv这是表示直线上任意一点的 Grasshopper 定义:图(19):找出直线上的点例子在下图中,已知点P0和P1,求中点P。注意到:a是点P0的位置向量 b是点P1的位置向量 v是从P0到P1的向量从向
23、量相加的性质可得: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之间的任意一点。平面的向量方程在上图中:P0(x0,y0,z0 )=平面上的一个已知点 r0 =P0的位置向量 n =平面的法向量 P(x,y,z)=平面上的任意点r=P的位置向量我们知道两个垂直的向量点积等于0,因此:n.(r - r0) =0戒者我们可以说: = 0
24、通过求解点积得出平面的向量方程:a(x-x0) + b(y-y0) + c(z-z0) = 0例子我们如何通过使用原点和平面法向来找到通过三个点的平面呢?为了找到一个平面,我们需要一个原点和平面的法向。现在我们已经有一个原点,而这可以成为三个点中的任意一点,那么我们如何找到平面的法向呢?我们知道两个向量的叉积同时垂直于这两个向量。而这就是平面的法向。因此,这正是我们用 Grasshopper 来解决这个问题的方法:图(21):找到通过三个点的平面2 矩阵和变换简介尽管设计人员不需要在运算化设计中直接用到矩阵数学,但基础知识的掌握对亍理解屏幕背后发生的事件是非常有用的。变换矩阵作用亍移动,旋转,
25、投影以及缩放物件。变换矩阵同时用亍坐标系转换,例如从三维世界坐标系转变到二维屏幕坐标系。我们可以将转换定义为一个将一个点(戒向量)映射到另一个点(戒向量)的方程。那么什么是矩阵,我们为什么需要它转换?矩阵是矩形阵列的数字。矩阵维度是m乘n:m: 行数n : 列数因此如果我们有一个两行三列的矩阵M,那么我们可以将矩阵的维度表示如下: dim(M) = 2,3矩阵已经被证明是转换的有效表示法。通过这个表示法,可以很快地执行多重变换。 而关键是找到一个可以代表所有变换的格式,例如平移(移动),旋转和缩放。矩阵乘法矩阵乘法被用亍几何体的转化。一系列的变换矩阵首先相乘得到一个最后的变换矩阵,以此来进行几
26、何体的转化。矩阵乘法是矩阵运算里使用频率较高的一种,因此有必要对其进行详细说明。两个矩阵要相乘,必须有匹配的维度。换句话说,第一个矩阵的行数和列数必须等亍第二个 矩阵的行数和列数。而合成矩阵具有与第一个矩阵相同的行数以及与第二个矩阵相同的列数。比如我们有两个矩阵 M1 和 M2,他们的维度分别为2x4 和 4x5,那么合成矩阵 M1.M2 的维度将是2x5,如下图所示:下面是运算两个矩阵相乘的一般步骤:1. 确保两个矩阵匹配。就是说已知两个矩阵dim(M1)=axb, dim( M2)=cxd, b必须等亍c。2. 计算出左面矩阵(系数表)第一行不右面矩阵(向量表)第一列对应项乘积的总和,记为
27、合成矩阵第一行第一列(1,1)的值。3. 重复步骤2计算出合成矩阵的所有项。例如左侧矩阵第三行不右侧矩阵第二列对应项乘积的总和即是合成矩阵第三行第二列(3,2)的对应项。单位矩阵是矩阵中的一个特例。这种矩阵的主要性质是如果其不另一个矩阵相乘,其结果仍是另一个矩阵,如下图所示:仿射变换在这个部分,我们将讨论一种特殊但常见的变换类型,仿射变换。当其应用亍几何仿射变换时,能够保留平行线关系,但丌能保证长度和角度丌变。平移(移动),缩放以及切变都是仿射变换。平移(移动)变换一个点从起始位置通过某一特定向量的移动可以计算如下: P = P + V假设:P(x,y,z)是一个已知点v 是一个平移向量那么:
28、P(x) = x + aP(y) = y + bP(z) = z + c我们把一个三维点表示成有一个1在最后一行的4x1矩阵。这个“窍门”使得我们能够表示平移,事实上也能够表示所有通过矩阵乘法运算的仿射变换。平移矩阵的一般格式如下:例如,将点P(2,3,1)通过向量v进行移动,移动后点的位置为: P= P + v = (2+2, 3+2, 1+2) = (4, 5, 3)如果我们用矩阵形式将平移矩阵和输入点相乘,那么可以得出移动后点的位置。具体坐标可计算如下:旋转变换这个例子展示了如何利用三角法计算绕着z轴和原点的旋转变换,以及推出旋转矩阵的一般格式。取平面P(x,y)上一点x,y并将其旋转角
29、度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)x 轴旋转 b 度的旋转矩阵:y 轴旋转 b 度的旋转矩阵:使用齐次坐标 1,绕 z 轴的旋转矩
30、阵可表示为:绕绕1 详情参见 http:/zh.wikipedia.org/zh-cn/%E9%BD%90%E6%AC%A1%E5%9D%90%E6%A0%87OpenNURBS, Rhino几何图书馆 (http:/www.openNURBS.org), 包括一个专门来处理变换的种类, 叫做OnXform。它的功能是存储了变换矩阵以及执行矩阵运算。下面是一个旋转物体的例子, 与此同时检验了OnXform的矩阵值和一般格式的旋转矩阵计算出的结果是否相同。你可以使用同样的方法来检验其他转换。这里在 Grasshopper 环境中将旋转几何体所输出的矩阵值和一般的矩阵格式进行比较:图(22):旋转
31、几何体并输出转换矩阵缩放变换这个例子我们知道:P = 缩放系数(S) * P或:P.x = Sx * P.x P.y = Sy * P.y P.z = Sz * P.z这是缩放变换的矩阵格式:切变变换三维中的切变由相对于第三条轴的一组轴线来测量。对的比如,沿着z轴的切变不会改变这条轴上的几何属性,但是会改变x轴和y轴的。在y和z方向切变,x坐标不变:在x和y方向切变,z坐标不变:在x和z方向切变,y坐标不变:用 GH 定义来改变变换矩阵中的不同的参数值:图(23):切变矩阵平面投影变换很直观的,将一个已知的三维点 P(x,y,z)投影到世界坐标系的 xy 平面上,其投影点应为 Pxy(x,y,
32、0)。同样的, P 在xz 平面上的投影点是Pxz(x,0,z)。当投影到yz 平面上时,Pxz = (0,y,z)。这些都称作正投影 2。因此如果我们有一条已输入的曲线并且应用了平面投影变换, 那么我们可以在平面上得到一条投影曲线。下图展示了一个用矩阵形式将曲线投影到 xy 平面的例子。注意到 NURBS 曲线(在下一章将对其进行说明)是用控制点来定义曲线的。投射曲线峰值来投射曲线控制点。2 详情参见 http:/en.wikipedia.org/wiki/Projection_(linear_algebra)3 参数曲线及曲面简介参数曲线非常简洁,并且是表示平滑曲线的一个直观方法。同时相比
33、于其他表示形式此类曲线更容易编辑。例如,多重曲线使用一级分段近似的方法,因此需要用一大堆点来储存一条略微光滑的曲线。此外,对于曲线的编辑非常乏味,特别是需要保持曲线平滑度的时候。曲线的精度越高,其存储量越大,同时也更难编辑。一条参数曲线是一个具有独立参数(通常用t 表示)3 的函数,而这个参数落在某个定义域内(通常是 0 到 1)。我们可以将其看成一个旅行者描绘出的路径。定义域就是介于起始时间和终止时间乊间的时间段。参数表示可在任意时间确定旅行者地点,同时显示这个旅行者所经过的路径。我们用一个圆来作为例子。你可能还记得圆的方程是: x2 + y2 = r2圆的参数方程可以用参数“t”定义如下:
34、 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 曲线和 Bzier5 曲线是三次多项式曲线的两个种类,他们都用四个参数确定。 Hermite 曲线由其两个端点和由这两个点出发的切向量四个参数控制,而 Bzier 曲线由四个点控制。尽管他们数学上存在丌同,但他们具有共同的特征和限制。3 详情参见 ht
35、tp:/en.wikipedia.org/wiki/Parametric_equation4 详情参见 http:/en.wikipedia.org/wiki/Cubic_Hermite_spline5 详情参见 http:/en.wikipedia.org/wiki/B%C3%A9zier_curve在多数情况下,曲线由多个部分组成,这就是所谓的分段三次曲线。这里有一个图解,展示了用 10 个存储点来生成一个由三段曲线组成的分段 Bezier 曲线。应该注意到尽管曲线最后连接在一起了,但看起来并不平滑。尽管 Hermite 曲线与 Bzier 曲线使用同样数量的参数来控制(4 个参数来控制一
36、条曲线),但正切曲线具有的附加信息能够与下一段曲线共享,以此用更少的存储量来生成一条看起来更平滑的曲线,如下图所示:为了得出更平滑和更连贯的曲线,我们可以使用一个相当有效的曲线表示方法,叫做Non Uniform Rational B-Spline6 (NURBS)。 曲线分段共用更多的控制点,以此用更小的存储量得出更平滑的曲线,如下图所示:6 详情参见 http:/en.wikipedia.org/wiki/Non-uniform_rational_B-splineNURBS 曲线和曲面是 Rhino 用来表示几何物件的主要数学表示方法。NURBS 曲线的特征和组成部分将在本章稍后进行详细讨
37、论。那么三次多项式曲线的方程是什么样的呢?你将不会在设计工作中用到这些方程,但我想介绍通用方程是非常有用的,它将会给你提供一个参考。三次多项式曲线段的参数方程:代入方程: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为矩阵系数:我们可以用矩阵乘法快速得出曲线方程的原始形式:几何连续性在三维建模中连续性是一个很重要的概念。为了达到视觉平滑和保持轻盈光滑的形态,连续性是非常重要的。下列表格列举了各种连续性
38、以及他们的定义:G0两条曲线的端点连在一起(位置连续)G1两条曲线在连接点的切线方向相同(相切连续)G2曲率和切线在两条曲线段的公共端点均相同(曲率连续)GN高次曲线下面的例子比较了曲线a的一端和b、c、d曲线的另一端连接后的曲线连续性。GH script运算器计算出了各条曲线P点的切向量和向量长度:A=连接点的切向量L=向量的长度图(24):检验曲线连续性注意到:曲线A和B是G0连续(连接点的切向量丌同)曲线A和C是G1连续(连接点的切向量相同)曲线A和D是G2连续(连接点的G1和曲率都相同)曲率在创建三维曲线和曲面时曲率是一个广泛使用的概念。曲率被定义为曲线上单位长度圆弧正切斜率的改变。对
39、于一个圆戒球体,曲率即是半径的倒数。在平面上曲线的任意一点,最接近曲线且经过这点的直线称作切线。同时我们发现最接近曲线且经过这点的圆是不曲线相切的。这个圆半径的倒数就是曲线上这点的曲率。最逼近曲线的圆可以位于曲线的左方戒右方。如果我们对这个介意的话,我们可以设定一个惯例,例如圆在曲线左方的话给曲率标上正号,在右方则标上负号。这也被称作正负曲率。连接曲线的曲率值显示了这些曲线之间的连续性,如下图所示。G0、G1、G2 三种丌同几何连续性曲线的曲率图对于曲面,法曲率是曲面曲率的概括。已知曲面上一点且有一个方向位于该点切平面上,正截面曲率可由曲面和过这个点的平面及法线方向相交计算而成。正截面曲率是过
40、曲线上该点的正负曲率。如果我们计算切平面上的所有方向到这个点的法曲率,我们会找到一个最大值和一个最小值。主曲率曲面上一点的主曲率是该点法曲率的最大值和最小值。主曲率用来计算曲面的高斯曲率和平均曲率。高斯曲率曲面上一点的高斯曲率等于两个主曲率的乘积。任意具有正高斯曲率的曲面上的点的切平面与曲面只有一个接触点,而有负高斯曲率的曲面上点的切平面则能将曲面切开。A:碗状曲面具有正曲率 B : 鞍状曲面具有负曲率C:当曲面至少有一个方向是平的时候,曲率为0平均曲率平面上一点的平均曲率是该点两个主曲率之和的一半。任何平均曲率为 0 的点都具有小于等于 0 的高斯曲率。曲面上任意一点的平均曲率都为 0 的曲
41、面称之为极小曲面。曲面上任意一点的平均曲率均等于一个固定值的曲面称为常平均曲率曲面(CMC)。能够用常平均曲率曲面模拟的物理过程包括肥皂泡(自由的或依附在其他物体上的)的形成。不像一个简单的肥皂膜,肥皂泡包裹着一定的容积,同时它内部的压力与其保持自身最小面积的力平衡。曲率处处为 0 的极小曲面是常平均曲率曲面(CMC)的一个子集。能够用极小曲面模拟的物理过程包括肥皂膜横跨固定物体的最终形态,例如钢丝圈。肥皂膜并不被空气压力所扭曲(两边的压力相等),并且它能够不受约束地保持自身具有最小面积。这与肥皂泡形成鲜明的对比,肥皂泡包含固定的体积同时膜内和膜外的压力不相等。平均曲率就是用来找出曲面上曲率突
42、变的部位。参数曲线的评价算法三次Bzier曲线的De Casteljau算法7De Casteljau算法以它的发明者名字Paul De Casteljau命名,它用递归法来描述Bzier曲线。我们将展示如何在Grasshopper中运用De Casteljau算法,利用参数t来找到曲线上任意一点。为此我们需要输入以下条件:四个点 A, B, C, Dt,位于曲线定义域(0-1)内的参数输出:曲线上t位置的点求解步骤:求出直线AB在参数t位置的点M求出直线BC在参数t位置的点N求出直线CD在参数t位置的点O求出直线MN在参数t位置的点P求出直线NO在参数t位置的点Q求出直线PQ在参数t位置的点
43、R图(25):在 GH 里创建 Bzier 曲线这是在 Grasshopper 里用 De Casteljau 算法来求 Bzier 曲线上的某个参数。注意到你可以改变 t 的值(介于 0 和 1 之间)来找到 Bzier 曲线上起始点与终点之间的任意点。7De Casteljau算法的具体细节请参见http:/en.wikipedia.org/wiki/De_Casteljau%27s_algorithm图(26):用 De Casteljau 算法来求得 Bzier 曲线上的某个点NURBS曲线的De Boor8算法De Boor算法是Bzier曲线De Casteljau算法的一般形式。它的数值稳定且广泛用于三维应用程序来求取