运算化设计的基础数学(第二版)简体中文版grasshopper

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

由Robert McNeel & Associates编著的《运算化设计的基本数学(第二版)》已在Creative
Commons Attribution-Share Alike 3.0 United States License下注册。


随着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@,以便于日后的更正与更新。

Bryan Shih
GSAPP Columbia University
Aug 21st 2011
前言
《运算化设计的基础数学》向设计人员介绍了有效开发3D建模和计算机图像的计算方法所涉及的必要基本数学概念。

但这并不意味着此书将提供一个完整且综合的资源,而仅是对基本的最常用概念的一个概述。

此书针对那些没有或者只有少量高中以后数学基础的设计者。

所有的概念都以可视化的图像来解释。

而这些图像是在Rhinoceros® (Rhino)的插件Grasshopper® (GH)模型生成环境中生成的。

详情请见和 .
所有的概念被分成三个部分。

第一部分讨论了向量数学,包括向量表示、向量运算以及线、面方程。

第二部分综述了矩阵运算和转换。

第三部分包括参数曲线(特别是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
目录
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)
向量表示
向量是一个具有“方向”和“大小”的量,例如速度、力等。

向量在二维坐标系中用两个实数表示如下:
v = <a1, a2>
同理,在三维坐标系中,向量可用三个实数表示,如下:
v = <a1, a2, a3>
我们用小写粗体字母表示向量,同时向量分量被包括在角括号内。

点用大写字母表示,点坐标用圆括号表示。

使用坐标系和该系统中的任何一组锚点(anchor points ),我们可以用线段来表示这些向量或者使其可视化。

我们通常加上箭头来表示向量的方向。

例如,有一个向量,其方向平行于一个已知的三维坐标系的X 轴,并且其大小等于5.18个单位,那么我们可以将向量表示为:
v = <5.18, 0, 0>
为了表示一个向量,我们需要坐标系中的一个锚定点。

比如,下图的所有红色线段是对同一个向量的等效表示。

因此,我们如何通过一个代表已知向量的线段来定义它的端点呢?让我们先用Grasshopper 的“x,y,z point” 运算器来定义一个锚点:
P0 = (1,2,3)
1 向量数学
图(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 xyz vector 运算器表示的一个向量需要输入三个实数:
v = <2,2,2>
向量的顶点(P1)是在锚点加上向量v 相应的分量而计算出来的。

P1 = (1+2, 2+2, 3+2) = (3,4,5)
如下显示了用Grasshopper vector display 运算器表示的这个向量,在所显示的向量端点做上记号以期与点P1重合:
位置向量
有一种特殊的向量表示方法,用原点P0 (0,0,0)作为向量的锚点。

位置向量v = <a1,a2,a3>表示成在两点(P0和P1)之间的线段,因此:
P0 = (0,0,0)
P1 = (a1,a2,a3)
非常重要的一点是不要将向量和与其具有等效分量的点混淆。

他们是两个不同的概念。

在下
图Grasshopper 的定义中,点P1的坐标等于向量的分量。

图(2):向量、向量锚点、和向量顶点位置重合的点之间的关系
对于一个已知的向量v = < a1, a2, a3 >,位置向量是一段从原点(0,0,0)到点(a1, a2, a3)的特定线段。

向量运算
向量加法
我们在向量相加时将其相应的分量相加。

即如果我们有两个向量,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):位置向量
上图得出的合并向量和通过Grasshopper 嵌入式向量加法运算器计算出来的结果是一样的:
向量加法在寻找多个向量的平均方向也是很有用的。

在这种情况下,我们通常使用同样长度
的向量。

这里有一个例子,展示了用等长向量和不等长向量相加所产生的结果之间的区别:
输入的向量并非都具有相同的长度。

为了找到平均方向,你需要使用输入向量中的“单位向
量”。

正如我们将在后面看到的,单位向量是一个长度为1的向量。

这里有一个例子,展示了在Grasshopper 里如何用不同长度的向量相加来求解平均方向。

图(4):通过相加相应的分量来完成向量的相加 通过相加两个向量相应的分量来完成它们的相加。

图(5):用GH vector addition 运算器来进行向量相加
图(6):通过向量相加以找到平均方向
向量长度
我们将用符号|a |来表示一个已知向量a 的长度。

向量a = <a1, a2, a3>的大小或长度可以用
如下方法计算:
|a | = sqrt(a12 + a22 +a32)
这里有一个用Grasshopper function 运算器计算出向量大小的例子。

注意Grasshopper vector 运算器有一个输出端口“L ”表示的是向量大小。

用上面例子中的同一个向量,你会发现输出的长度值与之前的例子是相等的。

向量标量乘法
已知向量a = <a1, a2, a3>,而t =某个实数,
a *t = <a1*t , a2*t , a3*t >
如下是在Grasshopper 环境中应用的等式:
图(7):用单位向量来找到两个或多个向量的平均方向
图(8):计算向量长度
图(9):向量长度作为GH vector 运算器的一个输出参数
图(10):向量标量运算
单位向量
单位向量是大小等于一个单位的向量。

单位向量经常被用来比较向量的方向。

向量性质
向量有八个性质。

如果a 、b 和c 是向量且s 和t 是标量,那么:
1. a + b = b + a
2. a +0= a
3. s (a +b )= s a +s b
4. st (a )= s (t a )
5. a +(b + c )=(a +b )+ c
6. a + (-a )=0
7. (s + t )a = s a + t a
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 等式相同的结果:
Grasshopper 有一个嵌入式的vector dot product 运算器,如下图所示:
图(11):两个向量的点积是相应分量进行乘法运算后的总和
当一个向量的长度等于一个单位时,这个向量被称作单位向量。

当计算两个单位向量的点积时,其结果总是介于-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 的例子,通过比较使用点积运算器的结果和向量与自身相乘的结果展示了这个特性:
点积和向量夹角
向量点积中一个重要的定理是:
a.b =|a ||b |cos(θ), 或者
cos(θ)= a.b / (|a ||b |)
θ是位置向量之间的夹角。

如果向量a 和b 都是单位向量,我们可以简化成:
cos(θ)= a.b
图(13):一个向量与自身做点积运算
图(12):用GH vector dot product 对两个向量进行点积运算
证明:
在三角形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 |)
那么两个平行的单位向量应如何计算点积呢?
最实用的办法是,你可以想象两个向量的点积等于一个向量在另一个向量上的投影长度。

这里用了Grasshopper 来解释这个概念。

在第一张图中,我们计算x 轴单位向量和输入向量v 的点积。

在第二张图中,我们将位置向量v 的端点投影到x 轴直线上,并计算出从原点到投影点的距离。

你会发现点积和投影长度相等。

两个单位向量的点积等于他们之间夹角的余弦值。

当且仅当a.b = 0时,向量a 与b 垂直。

点积性质
如果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. (s a ). b = s (a . b )= a .(s b )
向量叉积
两个三维向量的叉积是同时垂直于两者的第三个三维向量。

已知:
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)
图(14):点积与向量间的夹角
a x
b = <a2*b3 – a3*b2, a3*b1 -a1*b3, a1*b2 -a2*b1>
这是一个Grasshopper 对叉积的定义。

如果比较用以上公式和vector cross product 内嵌式运算器计算出的结果,你会发现他们产生的结果是一样的。

定理
对于任何一对三维向量a 和b
|a x b | = |a ||b |sin(θ)
Θ是a 和b 位置向量之间的夹角
或者如果a 和b 是单位向量,那么他们叉积的长度等于他们之间夹角的正弦值。

换句话说:
|a x b | = sin(θ) 图(15):计算两个向量的叉积
向量a x b 同时垂直于向量a 和b 。

图(16):用GH cross product 运算器计算两个向量的叉积
这里有一个例子,比较了用GH 嵌入式cross product 运算器计算和用上述公式运算的叉积的结果。

正如我们所预期的,他们产生的结果是相同的。

在求解叉积的过程中,运算对象的顺序是非常重要的。

例如:
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 =中指,而结果=拇指)
图(17):用函数和GH 嵌入式运算器计算向量叉积的大小

叉积性质
如果a 、b 和c 是向量而s 是标量,那么:
1. a X b = -b X a
2. (s a ) X b = s (a X b ) = a X (s b )
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
例子
我们目前所回顾的所有概念都可以直接应用于解决建模中遇到的几何问题。

比如,给定一个点和一个曲面,我们如何来确定这个点是对着曲面的正面还是背面呢?这需要几个步骤来解决这个问题:
这里有一个具有与上述例子相同步骤的Grasshopper 解决方案。

注意到在这种情况下点积大于0意味着点对着曲面的正面。

如果点积小于0则点对着曲面的背面。

图(18):确定点的位置是对着曲面的正面还是背面
当且仅当a x b = 0时,向量a 和b 平行。

1-定义曲面和点 2-将点拉到曲面上 3-从投射点到点定义一个向量 4-比较向量和曲面法线方向
直线的向量方程
直线的向量方程被用于三维建模和计算机图像中。

这里有一个对于直线方程以及如何应用它的说明。

在图中:
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> + <t a, t b, t c>
<x,y,z> = <x0+t a, y0+t b, z0+t c>
因此
x = x0 + t a
y = y0 + t b
z = z0 + t c
也可以等效为:
P = P0 + t v
这是表示直线上任意一点的Grasshopper定义:
图(19):找出直线上的点
例子
在下图中,已知点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 定义:
一般而言,你可以通过改变t 的值(0到1)来找到P0和P1之间的任意一点。

平面的向量方程
在上图中:
图(20):找出输入的两点间的中点
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):找到通过三个点的平面
简介
尽管设计人员不需要在运算化设计中直接用到矩阵数学,但基础知识的掌握对于理解屏幕背后发生的事件是非常有用的。

变换矩阵作用于移动,旋转,投影以及缩放物件。

变换矩阵同时用于坐标系转换,例如从三维世界坐标系转变到二维屏幕坐标系。

我们可以将转换定义为一个将一个点(或向量)映射到另一个点(或向量)的方程。

那么什么是矩阵,我们为什么需要它转换?
矩阵是矩形阵列的数字。

矩阵维度是m 乘n :
m : 行数
n : 列数
因此如果我们有一个两行三列的矩阵M ,那么我们可以将矩阵的维度表示如下:
dim(M ) = [2,3]
矩阵已经被证明是转换的有效表示法。

通过这个表示法,可以很快地执行多重变换。

而关键是找到一个可以代表所有变换的格式,例如平移(移动),旋转和缩放。

矩阵乘法
矩阵乘法被用于几何体的转化。

一系列的变换矩阵首先相乘得到一个最后的变换矩阵,以此来进行几何体的转化。

矩阵乘法是矩阵运算里使用频率较高的一种,因此有必要对其进行详细说明。

两个矩阵要相乘,必须有匹配的维度。

换句话说,第一个矩阵的行数和列数必须等于第二个矩阵的行数和列数。

而合成矩阵具有与第一个矩阵相同的行数以及与第二个矩阵相同的列数。

比如我们有两个矩阵M1和M2,他们的维度分别为[2x4] 和 [4x5],那么合成矩阵M1.M2的维度将是[2x5],如下图所示:
下面是运算两个矩阵相乘的一般步骤:
2 矩阵和变换
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矩阵。

这个“窍门”使得我们能够表示平移,事实上也能够表示所有通过矩阵乘法运算的仿射变换。

平移矩阵的一般格式如下:
例如,将点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详情参见/zh-cn/%E9%BD%90%E6%AC%A1%E5%9D%90%E6%A0%87
OpenNURBS™, Rhino几何图书馆 ( ), 包括一个专门来处理变换的种类, 叫做OnXform 。

它的功能是存储了变换矩阵以及执行矩阵运算。

下面是一个旋转物体的例子, 与此同时检验了OnXform 的矩阵值和一般格式的旋转矩阵计算出的结果是否相同。

你可以使用同样的方法来检验其他转换。

这里在Grasshopper 环境中将旋转几何体所输出的矩阵值和一般的矩阵格式进行比较:
缩放变换
这个例子我们知道:
P' = 缩放系数(S) * P
或:
P'.x = Sx * P .x
P'.y = Sy * P .y
P'.z = Sz * P .z
这是缩放变换的矩阵格式:
图(22):旋转几何体并输出转换矩阵
切变变换
三维中的切变由相对于第三条轴的一组轴线来测量。

对的比如,沿着z轴的切变不会改变这条轴上的几何属性,但是会改变x轴和y轴的。

在x和z方向切变,y坐标不变:
在y和z方向切变,x坐标不变:
在x和y方向切变,z坐标不变:
用GH定义来改变变换矩阵中的不同的参数值:
图(23):切变矩阵
平面投影变换
很直观的,将一个已知的三维点P(x,y,z)投影到世界坐标系的xy平面上,其投影点应为
Pxy(x,y,0)。

同样的, P在xz平面上的投影点是Pxz(x,0,z)。

当投影到yz平面上时,Pxz = (0,y,z)。

这些都称作正投影2。

因此如果我们有一条已输入的曲线并且应用了平面投影变换, 那么我们可以在平面上得到一条投影曲线。

下图展示了一个用矩阵形式将曲线投影到xy平面的例子。

注意到NURBS曲线(在下一章将对其进行说明)是用控制点来定义曲线的。

投射曲线峰值来投射曲线控制点。

2详情参见/wiki/Projection_(linear_algebra)
简介
参数曲线非常简洁,并且是表示平滑曲线的一个直观方法。

同时相比于其他表示形式此类曲线更容易编辑。

例如,多重曲线使用一级分段近似的方法,因此需要用一大堆点来储存一条略微光滑的曲线。

此外,对于曲线的编辑非常乏味,特别是需要保持曲线平滑度的时候。

曲线的精度越高,其存储量越大,同时也更难编辑。

一条参数曲线是一个具有独立参数(通常用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 参数曲线及曲面
3详情参见/wiki/Parametric_equation
4详情参见/wiki/Cubic_Hermite_spline
5详情参见/wiki/B%C3%A9zier_curve
在多数情况下,曲线由多个部分组成,这就是所谓的分段三次曲线。

这里有一个图解,展示了用10个存储点来生成一个由三段曲线组成的分段Bezier曲线。

应该注意到尽管曲线最后连接在一起了,但看起来并不平滑。

尽管Hermite曲线与Bézier曲线使用同样数量的参数来控制(4个参数来控制一条曲线),但正切曲线具有的附加信息能够与下一段曲线共享,以此用更少的存储量来生成一条看起来更平滑的曲线,如下图所示:
为了得出更平滑和更连贯的曲线,我们可以使用一个相当有效的曲线表示方法,叫做Non Uniform Rational B-Spline6 (NURBS)。

曲线分段共用更多的控制点,以此用更小的存储量得出更平滑的曲线,如下图所示:
6详情参见/wiki/Non-uniform_rational_B-spline
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为矩阵系数:
我们可以用矩阵乘法快速得出曲线方程的原始形式:
几何连续性
在三维建模中连续性是一个很重要的概念。

为了达到视觉平滑和保持轻盈光滑的形态,连续性是非常重要的。

下列表格列举了各种连续性以及他们的定义:
G0两条曲线的端点连在一起
(位置连续)
G1两条曲线在连接点的切线方向相同
(相切连续)
G2曲率和切线在两条曲线段的公共端点均相同
(曲率连续)
GN高次曲线
下面的例子比较了曲线a的一端和b、c、d曲线的另一端连接后的曲线连续性。

GH script运算器计算出了各条曲线P点的切向量和向量长度:
A=连接点的切向量
L=向量的长度
图(24):检验曲线连续性
曲线A和B是G0连续(连接点的切向量不同)
曲线A和C是G1连续(连接点的切向量相同)
曲线A和D是G2连续(连接点的G1和曲率都相同)
曲率
在创建三维曲线和曲面时曲率是一个广泛使用的概念。

曲率被定义为曲线上单位长度圆弧正切斜率的改变。

对于一个圆或球体,曲率即是半径的倒数。

在平面上曲线的任意一点,最接近曲线且经过这点的直线称作切线。

同时我们发现最接近曲线且经过这点的圆是与曲线相切的。

这个圆半径的倒数就是曲线上这点的曲率。

最逼近曲线的圆可以位于曲线的左方或右方。

如果我们对这个介意的话,我们可以设定一个惯例,例如圆在曲线左方的话给曲率标上正号,在右方则标上负号。

这也被称作正负曲率。

连接曲线的曲率值显示了这些曲线之间的连续性,如下图所示。

G0、G1、G2三种不同几何连续性曲线的曲率图
对于曲面,法曲率是曲面曲率的概括。

已知曲面上一点且有一个方向位于该点切平面上,正截面曲率可由曲面和过这个点的平面及法线方向相交计算而成。

正截面曲率是过曲线上该点的正负曲率。

如果我们计算切平面上的所有方向到这个点的法曲率,我们会找到一个最大值和一个最小值。

主曲率
曲面上一点的主曲率是该点法曲率的最大值和最小值。

主曲率用来计算曲面的高斯曲率和平均曲率。

曲面上一点的高斯曲率等于两个主曲率的乘积。

任意具有正高斯曲率的曲面上的点的切平面与曲面只有一个接触点,而有负高斯曲率的曲面上点的切平面则能将曲面切开。

A:碗状曲面具有正曲率
B : 鞍状曲面具有负曲率
C:当曲面至少有一个方向是平的时候,曲率为0
平均曲率
平面上一点的平均曲率是该点两个主曲率之和的一半。

任何平均曲率为0的点都具有小于等于0的高斯曲率。

曲面上任意一点的平均曲率都为0的曲面称之为极小曲面。

曲面上任意一点的平均曲率均等于一个固定值的曲面称为常平均曲率曲面(CMC)。

能够用常平均曲率曲面模拟的物理过程包括肥皂泡(自由的或依附在其他物体上的)的形成。

不像一个简单的肥皂膜,肥皂泡包裹着一定的容积,同时它内部的压力与其保持自身最小面积的力平衡。

曲率处处为0的极小曲面是常平均曲率曲面(CMC)的一个子集。

能够用极小曲面模拟的物理过程包括肥皂膜横跨固定物体的最终形态,例如钢丝圈。

肥皂膜并不被空气压力所扭曲(两边的压力相等),并且它能够不受约束地保持自身具有最小面积。

这与肥皂泡形成鲜明的对比,肥皂泡包含固定的体积同时膜内和膜外的压力不相等。

平均曲率就是用来找出曲面上曲率突变的部位。

相关文档
最新文档