Transcript 样条曲线
课程内容进展
综述
‘图形学’和‘图形系统’
建模
曲线曲面 实体造型
观察
观察流水线 裁剪
显示
可见面判别
其它
UI 动画 ……
光照 面绘制
坐标系统
基本图元
几何变换
第六讲 三维对象的表示
之 曲线曲面
引子一:什么对象?
真实的、艺术的、科学的… :生物、山海云石、房屋、服
饰图案、股票行情图、动画设计、汽车飞机的外形、卫星的轨
道、气流的运动…
从几何角度看:直线(平面)、曲线(曲面)
一:可以用标准的解析式即方程来表示。直线、圆、抛物
线、椭圆、平面、圆柱面、圆锥面、球面等等
二:自由曲线曲面。由从实际测量得到的一组离散数据点
(控制点/型值点)来确定。通过数学方法惟一地定义其
形状(计算机辅助几何设计CAGD-Computer Aided Geometric Design,综合了微分几何、代数几何、数值计算
、逼近论、拓扑学、数控技术等的一门边缘性学科 )
引子二:对象如何表示?
核心问题:建立既适合于计算机处理,又有效地满足形
状表示与几何设计要求,同时还便于进行形状信息传递
和产品数据交换的形状描述的数学方法。
建立数学模型的方法:
内部数据的表示方法:
欧氏几何方法:多边形、(超)二次曲线(面)、样条曲线(面)
过程式方法:分形几何,形状语法,粒子系统
基于物理的建模方法:例如织物的非刚性行为
等值面显示、体绘制等可视化技术:三维离散数据集合
边界表示:多边形表面、样条曲面
空间分区表示:八叉树(描述内部特征如颜色等)
显示处理的基本方法:
三角形或四边形面片
利用多边形的对象表示
几何数据表:
点、边和面
如果多边形的顶点数>3,有
可能不在一个平面上。
将多边形分成三角形。
估算平面参数A、B和C。
第六讲主要内容
简单曲线面表示
自由曲线面表示
插值,逼近,光顺
样条(Bezier,B)
线、面的数学描述
非参数式表示:
显式表示:
y = f ( x ) , z = f ( x, y )
隐式表示: f ( x , y ) = 0 , f ( x , y , z) = 0
参数式表示:
线:x = x ( u ) , y = y ( u ), z = z ( u )
面:x = x ( u , v ), y = y ( u , v) , z = z ( u , v )
P(u)=[x y z]=[x(u) y(u) z(u)] u∈[u0,u1]
曲线的首末点分别为P(u0)、P(u1)。
曲线上任意点的切向量: P’(u)=dP/du=[dx/du dy/du dz/du]
圆弧的三种表示方法
x cos
0 / 2
y
y
y
1.
0
1.
0
x o
o
y 1 x
y sin
2
0 x 1
显示方式
1.
0
1.
0
参数方式(一)
x
1.
0
o
1 t 2
x
1 t 2
y
2t
1 t 2
x
0 t 1
参数方式(二)
二次曲线曲面
由二次方程所描述。包括球面、椭球面、环面、抛物面
和双曲面。可以用来构造更复杂的物体
球面 x2+y2+z2=r2
椭球面
环面
将圆或其它二次曲线绕指定轴旋转而成。
超二次曲线曲面
由二次曲线/面方程添加参数而成,更便于调整物体形状。
增加的参数个数=物体的维数:曲线一个参数,曲面二个参数
超椭圆
s是任意实数。当s=1时,可以得到一般椭圆
x=rxcossθ
-π≤θ≤π
y=rysinsθ
超椭球面
(x/rx)2/s+(y/ry)2/s=1
当s1=s2=1时,得到一般的椭球面
x=rxcoss1Ψcoss2θ -π/2≤Ψ≤π/2
y=rycoss1Ψsins2θ -π≤θ≤π
z=rzsins1Ψ
[(x/rx)2/s2+(y/ry)2/s2]s2/s1+(z/rz)2/s1=1
表示方式的比较
非参数方式
与坐标轴相关
非平面曲线、复杂曲面
难以用常系数表示
会出现斜率为无穷大的
情况
不便于计算和编程
参数方式
几何不变性:在不同的坐标系中度量
控制点时,所生成的几何形状保持不变
与坐标轴无关(几何不变
性),以至于可以表示任意
维空间中的复杂曲线,
便于处理斜率无穷大情况
便于用参数变量的范围(例
如限制在[0 ,1]内),获得唯
一有界曲线或曲线分段描述
便于编程实现,易于计算曲
线上的点、导数等。
有更大的自由度来控制曲线
曲面的形状
OpenGL多面体函数
glutWireTetrahedron ( ); glutSolidTetrahedron ( );
四面规则三棱锥
glutWireCube (edgeLength); glutSolidCube (edgeLength);
立方体
glutWireOctahedron ( ); glutSolidOctahedron ( );
规则8面体
glutWireDodecahedron ( );glutSolidDodecahedron ( );
规则12面体
glutWireIcosahedron ( ); glutSolidIcosahedron ( );
规则20面体
OpenGL曲面函数
glutWireSphere (r, nLongitudes, nLatitudes);
球面
glutWireCone (rBase, height, nLongitudes, nLatitudes);
圆锥面
glutWireTorus (rCrossSection, rAxial, nConcentrics, nRadialSlices);
环面
glutWireTeapot (size);
茶壶
gluCylinder (quadricName, rBase, rTop, height, nLongitudes,
nLatitudes);
圆柱、圆台、圆锥面
柔性对象
形状不固定且具有一定的“流动性”:当其处于运动
状态或接近其它物体时会变化其表面特征。例如分子
结构、水滴和其它液体、带状物体、人类肌肉等。
人的肌肉形状
分子分离时分子形状的延伸、分裂和收缩效果
柔性对象的表示
思路:模拟表面形状而总体积不变
高斯密度函数、非指数型密度函数等
其中:
三维高斯凸形的切面,
中心在0
高度为b,方差为a
4个三维高斯凸形复合后的切面
T的选择决定了坐标重叠情况
柔性对象建模方法例(续)
——元球(meta-ball)模型
——软对象(soft object)模型
各种效果图片
自由曲线曲面的表示
根据一组离散的坐标点即控制点,结
合应用需求,得到最贴近物体形状的数
学函数描述。
核心思路:插值、逼近、光顺
插值
生成的曲线通过所有控制点。
当控制点太多时,构造一个插值函数使其通
过所有的控制点相当困难,也没必要。
分段线性插值
分段抛物线(二次)插值
分段三次多项式插值
y
y f (x)
y1
o x1
y2
(a)线性插值
x2
y f (x)
y
y1
x
o
x1
y2
x2
y (x)
y3
x3
(b)抛物线插值
x
PC曲线(三次多项式插值曲线)
美国波音公司的弗格森Ferguson J.C.于1963年
首先在飞行器中用三次参数方程来定义曲线和曲
面。参数三次曲线简称PC曲线(弗格森曲线)。
x(u)=axu3+bxu2+cxu+dx
y(u)=ayu3+byu2+cyu+dy
u∈[0,1]
z(u)=azu3+bzu2+czu+dz
曲线的首末端点分别在u=0和u=1处,方程组中的
12个常数系数称为代数系数(algebraic
coefficients),这组系数唯一确定了一条PC曲线
逼近、光顺
逼近:部分或全部控制点不在
所生成的曲线上
最小二乘法。逼近的好坏用各点
偏差的平方和或加权平方和衡量
参数多项式法。
曲线的逼近
• 光顺通俗的几何解释是:无论插值还是逼近,曲线的
拐点(曲线由增变减或由减变增的转折点,上凹弧与
下凹弧的分界点 )不能太多
• 对于平面曲线,相对光顺的条件是:
• 曲线具有二阶几何连续性
• 不存在多余拐点;
• 曲线的曲率变化较小;
;
几个概念
参数连续性、几何连续性
控制多边形
凸包
连续性条件
当许多参数曲线段首尾相连构成一整条曲线时,
需要保证相邻曲线段在连接处具有一定的连续性。
假定参数曲线段pi以参数形式进行描述:
pi pi (t )
t[ti0 , t i1 ]
可以定义两种意义上的连续性:
参数连续性
几何连续性
0阶参数连续性
记作C0连续性,是指曲线的几何位置连接,即第一
个曲线段在ti1处的x,y,z值与第二个曲线段在t(i+1)0
处的x,y,z值相等:
pi (ti1 ) p(i1) (t(i 1) 0 )
i
i+1
1阶参数连续性
记作C1连续性,指两个相邻曲线段的方程在交点处
有相同的一阶导数(切线):
pi (ti1 ) p( i 1) (t ( i 1) 0 )
且pi (ti1 ) p(i 1) (t ( i 1) 0 )
i
i+1
2阶参数连续性
记作C2连续性,指两个相邻曲线段的方程在相交点
处具有相同的一阶和二阶导数。
几何含义:交点处的切向量变化率相等,即切线从一个
曲线段平滑地变化到另一个曲线段。
(a)0阶连续性
(b)1阶连续性
类似地,还可定义高阶参数连续性。
(c)2阶连续性
几何连续性
与参数连续性差别在于:曲线段在相交处的
参数导数只需要成比例。
0阶几何连续性,记作G0连续性,同0阶参数连续性
1阶几何连续性,记作G1连续性,指一阶导
数在相邻段的交点处成比例。
2阶几何连续性,记作G2连续性,指相邻曲
线段在交点处其一阶和二阶导数均成比例。
参数连续
几何连续
控制多边形和凸壳(凸包)
按控制点的次序连接得到的
直线序列称为控制多边形或
P3
P2
P4
特征多边形(不闭合)
P0
包含一组控制点的凸多边形边界称为凸壳(凸包)
P5
曲面的两组控制多边形构成了
二次曲面网的多边形面片
样条(自由曲线曲面的表示)
引入的原因
经典样条定义方法
样条(spline)的引入
样条有效解决了大量形态的自由曲线曲面的数学表示问
题,且是最简单、理论和应用最成熟的参数曲线(面)。
设计新物体形状
数字化一张图
描述动画路径。
……
在工程绘图术语中,采用模线样板法表示和传递
自由曲线曲面的形状称为样条。
样条曲线:由多项式曲线段连接而成的曲线,在
每段的边界处满足特定的连续条件。
样条曲面:用两组正交样条曲线描述的曲面。
样条的引入(续)
定义样条的核心步骤
给出控制点
给出边界条件(曲线通过哪些控制点,在哪些
控制点上满足何种连续性条件)
列出(分段)多项式方程组
将条件代入方程组,解出所有多项式系数
样条的引入(续2)
三次插值样条(hermite,cardinal,KochanekBartels):
插值,参数边界条件
Bezier样条,B样条:
逼近,参数边界条件
Beta:
逼近,使用几何边界的B样条
有理样条:两个样条相除
非均匀有理B样条:NURBS
三次样条插值方法
给定 n+1个点,可得到n条分段三次多项式曲线:
x(t ) axt 3 bxt 2 cxt d x
3
2
y (t ) a yt byt c yt d y
z (t ) a t 3 b t 2 c t d
z
z
z
z
注意:4个点3组方程
PC曲线——4个点1组方程
t [0,1]
三次多项式方程的特点
与更高次相比:计算量较少,存储较稳定;
与低次相比:模拟曲线形状时更灵活。能够表
示曲线段的端点通过特定点且在连接处保持连续性。
自然三次样条
给定 n+1 个控制点
构造n个参数方程组(x,y,z)--共n*4*3个系数
要求相邻曲线段在连接处具有0、1、2阶参数连续性。
对于(n-1)个内部点,每组有4*3个条件----(n-1)*4*3
对于两端点,每组只有1*3个条件----2*1*3
再附加两个端点上的两个边界条件----2*1*3
假设二阶导数为0,或者两端各增加一个隐含控制点
解出方程组
特点:
具有 C2 连续性
不能“局部控制”
只适用于控制点分布比较均匀的场合
P1(1)=p1
P1’’(1)=P2’’(0)
P2(0)=p1
P1’(1)=P2’(0)
P1(0)=p0
P1’’(0)=0
P3’’(1)=0
P3(1)=p3
P3(0)=p2
P2(1)=p2
P2’(1)=P3’(0)
P2’’(1)=P3’’(0)
三次 Hermite 样条
给定控制点
给定每对控制点Pk和Pk+1之间曲线段的边界条件
假设曲线方程
p(t) , t∈[0,1] ,
给定矢量Pk、Pk+1、Rk 和 Rk+1 ,
且p(t)满足下列条件:
p(0) Pk , p(1) Pk 1
斜率 p(0) Rk , p(1) Rk 1
Rk
端点
Pk
Pk+1
Rk+1
t=0
t=1
推导1:
p(t ) [t
3
[t 3 t 2
[ 0 0 0 1]
t
2
ax
b
x
t 1]
cx
d x
ay
by
cy
dy
a
b
t 1] T C
c
d
a
a
b
b
c
d
az
bz
cz
d z
= Pk
[ 1 1 1 1]
c
d
= Pk+1
推导2:
p' (t ) [3t 2
2t
a
b
1 0]
c
d
a
a
[ 0 0 1 0]
b
c
d
= Rk
[ 3 2 1 0]
b
c
d
= Rk+1
a
a
[ 0 0 0 1]
b
c
= Pk
[ 1 1 1 1]
c
a
a
b
b
c
= Pk+1
d
d
[ 0 0 1 0]
b
= Rk
d
0
1
p(t ) T C
0
3
[ 3 2 1 0]
c
= Rk+1
d
0 0 1 a Pk
1 1 1 b Pk 1
0 1 0 c Rk
2 1 0 d Rk 1
a 0
b 1
C
c 0
d 3
2 2
3 3
0
0
0
1
1
0 0 1 Pk
1 1 1 Pk 1
0 1 0 Rk
2 1 0 Rk 1
1
1 Pk
2 1 Pk 1
M h Gh
1
0 Rk
0
0 Rk 1
Mh是Hermite矩阵。Gh是Hermite几何矢量。
因此,三次Hermite样条曲线的方程为:
p(t ) T M h Gh
t [0,1]
T•Mh :Hermite基函数(混合函数,调和函数)
H 0 (t ) 2t 3t 1
3
2
H1 (t ) 2t 3t
3
2
H 2 (t ) t 2t t
3
2
H 3 (t ) t t
3
2
p(t ) Pk H0 (t ) Pk 1H1 (t ) Rk H 2 (t ) Rk 1H3 (t )
p(t ) Pk H0 (t ) Pk 1H1 (t ) Rk H 2 (t ) Rk 1H3 (t )
H(t)
1
H0(t)
H1(t)
0.8
0.6
`
0.4
H2(t)
0.2
0.2
-0.2
0.4
0.6
0.8
H3(t)
Hermite基函数
1
t
Hermite样条
连续性倚赖于给出的几何矢量数据
可以局部调整,因为每个曲线段仅依
赖于端点约束。
可以将切线矢量用其它形式给出,从
而得到另外的样条形式:Cardinal样
条和Kochanek-Bartels样条
具有几何不变性
应用:模拟运动路径,图像轮廓提取
样条表示方法的转换
给定数据点p0, p1,确定一条三次曲线通过这两个点, 以x分量
x(u)为例,假设其满足端点和切线条件构成如下矩阵:
Mgeom = { x(0),x(1),x’(0),x’(1) }
普通多项式表示
普通矩阵表示
加上边界
条件后的
矩阵表示
混合函数表示
插值还是逼近?
初始给出的数据点往往并不精确;
为了美观而宁可放弃或不通过个别数据点。
为了便于曲线(面)的设计者的交互操作,应易
于实时局部修改,并且反映直观
因此,往往最终曲线无需通过所有控制点。
例子:汽车、船舶、飞机等的外形设计。
Bezier样条和B样条的由来
1962年,法国雷诺汽车公司的P.E. Bezier 提
出了一种以逼近为基础的新的参数曲线表示方
法,称为Bezier曲线。
后来又经过 Gordon、Forrest 和 Riesenfeld
等人的拓展,提出了B样条曲线。
这两种曲线都能较好地将函数逼近同几何表示
结合起来,使得外形设计师在计算机上就象使
用作图工具一样得心应手。
Bezier曲线
曲线参数方程的定义
曲线的性质(特点)
曲线的拼接
OpenGL绘制Bezier曲线面
Bezier曲线:概念
Bezier曲线是参数多项式曲线,它由一组控制多
边形的顶点(即控制点)唯一地定义。
--第一个和最后一个顶点在曲线上,
--其它的顶点用来定义曲线的导数、阶次和形状。
--曲线的形状趋向于控制多边形的形状
--改变多边形的顶点就会改变曲线的形状,关系直观。
Bezier曲线参数方程
n
p(t ) Pk BENk ,n (t )
t [0,1]
k 0
Pk(xk,yk,zk),k=0,1..n是控制多边形的n+1个顶点
BENk,n(t)是Bernstein基函数,具有如下形式:
n!
nk
nk
k
k k
BENk , n (t )
t 1 t
Cn t 1 t
k!n k !
k 0,1,, n
显然,p(t)是参数t的n次多项式,具有n+1项。
性质1:两端点在曲线上
n
p(0) Pk Bk ,n (0)
k 0
规定:00和0!均为1
P0 B0,n (0) P1 B1,n (0) Pn Bn ,n (0)
n! 0 n
n! 1 n 1
n! n 0
P0
0 1 P1
0 1 Pn
01
0!n!
1!n!
n!0!
p(0) P0
n
p (1) Pk Bk ,n (1)
k 0
n! 0 n
n! 1 n 1
n! n 0
P0
1 0 P1
1 0 Pn
10
0!n!
1!n!
n!0!
p(1) Pn
一次Bezier曲线=直线段
n=1
有两个控制点p0和p1,
Bezier参数方程变为如下形式:
1
p(t ) Pk BENk ,1 (t ) (1 t ) P0 tP1
k 0
即:连接起点p0和终点p1的一个直线段。
t[0,1]
二次Bezier曲线=抛物线段
n=2,
有3个控制点p0、p1和p2,
P’(t)=2(t-1)P0+2(1-2t)P1+2tP2
P1
Bezier参数方程变为如下形式:
P'(1/2)
P(1/2)
2
p (t ) Pk BENk , 2 (t )
P0
k 0
Pm
(1 t ) 2 P0 2t (1 t ) P1 t 2 P2
( P2 2 P1 P0 )t 2 2( P1 P0 )t P0
P2
t [0,1]
三次Bezier曲线
n=3,有4个控制点P0、P1、P2和P3,
Bezier参数方程变为如下形式 :
3
p(t ) Pk BENk ,3 (t ) (1 t )3 P0 3t (1 t ) 2 P1 3t 2 (1 t ) P2 t 3 P3
k 0
因此,可以定义三次Bezier曲线的基函数如下:
BEN0, 3 (t ) (1 t ) 3
BEN1,3 (t ) 3t (1 t ) 2
BEN2,3 (t ) 3t 2 (1 t )
BEN3, 3 (t ) t 3
p(t) BEN0,3 (t ) P0 BEN1,3 (t )P1 BEN2,3 (t ) P2 BEN3,3 (t )P3
三次Bezier曲线四个Bezier基函数
B0,3(t)
B1,3(t)
B3,3(t)
B2,3(t)
1
0
t
这四条曲线均是三次曲线,任何三次Bezier曲线
都是这四条曲线的线形组合。
三次Bezier曲线的矩阵表示
BEN0, 3 (t ) (1 t ) 3
BEN1,3 (t ) 3t (1 t ) 2
BEN2,3 (t ) 3t 2 (1 t )
BEN3, 3 (t ) t 3
将各基函数展开,即可转换为矩阵形式:
p (t ) t
3
t
2
1
3
t 1
3
1
3
6
3
0
3 1 P0
3 0 P1
0 0 P2
0 0 P3
t [0,1]
T M be Gbe
只需给出控制点,无需定义其他边界条件(如切线斜率等)
问题:如何保证边界上的连续性?
性质2:一阶导数
1
3
2
p' (t ) 3t 2t 1 0
3
1
3
6
3
0
3
3
0
0
1 P0
0 P1
0 P2
0 P3
p(0) n( P1 P0 )
起点处切线为P0 P1 方向
p(1) n( Pn Pn1 )
终点处切线为Pn-1 Pn 方向
特别的:三次Bezier曲线段在起始点和
终止点处的一阶导数为: p(0) 3( P P )
1
0
p(1) 3( P3 P2 )
P1
P3
P0
P2
P1
P0
P2
P3
性质3:二阶导数
p(0) n(n 1)((P2 P1 ) ( P1 P0 ))
p(1) n(n 1)((Pn2 Pn1 ) ( Pn1 Pn ))
三次Bezier曲线段在起点和终点处的二阶导数为:
p(0) 6( P0 2P1 P2 )
p(1) 6( P1 2P2 P3 )
性质4:对称性
由控制顶点 Pi* Pni ,(i 0,1,..., n), 构造出的新Bezier
曲线,与原Bezier曲线形状相同,走向相反。因为:
n i
n
n ( n i )
Bni ,n (t ) C [1 (1 t )]
C t (1 t )
i i
n
n i
(1 t )
n i
Bi ,n (1 t )
Bezier曲线在起点的几何性质与在终点处的性质相同。
性质5:几何不变性和凸包性
几何不变性:Bezier曲线位置与形状与其特征多
边形顶点的位置有关,而不依赖坐标系的选择。
凸包性:曲线落在所有控制点构成的凸包之内
凸包
性质5:凸包性(续)
重复的起止点可以获得封闭曲线
重复的控制点导致曲线更加靠近该点
性质6:变差缩减性
若Bezier曲线的特征多边形是一个平面图形,则平面内
任意直线与曲线的交点个数不多于该直线与其特征多边
形的交点个数。即:Bezier曲线比其特征多边形的波动
小(比特征多边形的折线更光顺)。
凸包
Bezier曲线的拼接
高次Bezier曲线计算比较复杂,且有许多问题有待理论上解决,
所以工程上往往使用分段三次Bezier样条曲线来描述复杂形状。
设有两Bezier曲线段P1(t)和P2(t),其控制多边形顶点
分别为P0,P1,P2,P3和Q0,Q1,Q2,Q3,且P3=Q0。
0阶连续性:Bezier曲线通过端点P3(Q0)
1阶连续性: P1 ' (1) 3( P3 P2 ); P2 ' (0) 3(Q1 Q0 )
P2 ' (0) a P1 ' (1) 即:Q1 Q0 a ( P3 P2 )
2阶连续性:
p2(0) p1(1)
P2
P1
(Q0 2Q1 Q2 ) ( P1 2P2 P3 )
P0
P3(Q0)
“三点一线”
Q1
Q3
Q2
Bezier曲面
双线性Bezier曲面(m=n=1)
1
1
p(u, v) Pi , j Bi ,1 (u) B j ,1 (v)
i 0 j 0
(u, v)[0,1] [0,1]
p(u, v) (1 u )(1 v) P0,0 (1 u )vP0,1
u (1 v) P1,0 uvP1,1
如果四点共面,则此曲面退化为平面
双二次Bezier曲面(m=n=2)
2
2
p(u, v) Pi , j Bi , 2 (u ) B j , 2 (v)
i 0 j 0
(u, v) [0,1] [0,1]
双三次Bezier曲面(m=n=3)
3
3
p(u, v) Pi , j Bi ,3 (u ) B j ,3 (v)
i 0 j 0
(u, v) [0,1] [0,1]
P0,3
P0,0
P0,1
P0,2
P1,3
P1,0
P1,2
P1,1
P2,0
P2,1
P2,2
P3,0
P2,3
Bezier曲面的性质
1.控制网格的四个角点是Bezier曲面的四个角点
p(0,0) P0,0 ;
p(1,0) Pm,0 ;
p(0,1) P0,n ;
p(1,1) Pm,n
2.控制网格最外一圈控制点定义了Bezier曲面的四
条边界,即四条Bezier曲线。
3. 几何不变性。
4. 对称性。
5. 凸包性。
Bezier曲面的拼接
0阶连续性:相连接的曲面片具有公共的边
界曲线。
1阶连续性:对于公共边界曲线上的任何一
点,两个曲面片跨越边界的切线矢量共线,
且长度之比为常数。
OpenGL的Bezier曲线曲面函数
曲线
glMap1* (GL_MAP1_VERTEX_3, uMin, uMax, stride, nPts, *ctrlPts);
glEnable (GL_MAP1_VERTEX_3);
glEvalCoord1* (uValue);
glDisable (GL_MAP1_VERTEX_3);
曲面
glMap2* (GL_MAP2_VERTEX_3, uMin, uMax, uStride, nuPts,vMin,
vMax, vStride, nvPts, *ctrlPts);
glEnable (GL_MAP2_VERTEX_3);
glEvalCoord2* (uValue, vValue);
glDisable {GL_MAP2_VERTEX_3}
OpenGL曲线例程
GLfloat ctrlpoints[4][3] = { { 10.0, 100.0, 0.0},
{ 55.0, 160.0, 0.0}, {135.0, 30.0, 0.0}, {210.0,
100.0, 0.0}};
void main(int argc, char **argv)
{……
init();
glutDisplayFunc(display);
glutReshapeFunc(winReshapeFcn);
glutMainLoop();
}
void init()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);
}
void display()
{……
glMap1f(GL_MAP1_VERTEX_3, 0.0,
1.0, 3, 4, &ctrlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
void winReshapeFcn(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord1f((GLfloat) i/30.0);
glEnd();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glBegin(GL_POINTS); 画控制点……
glBegin(GL_LINE_STRIP); 画控制多边
形……
glOrtho(0.0, 500.0, 0, 500, -5.0, 500.0);
glMatrixMode(GL_MODELVIEW);
}
glFlush();
}
OpenGL例子
OpenGL例子
for (i = 0; i <= 8; i++)
glEvalCoord1f((GLfloat) i/8.0);
OpenGL曲面例程
GLfloat ctrlpoints[4][4][3] = {….}
void main(int argc, char **argv)
{……同曲线例程}
void init() { ……同曲线例程}
void winReshapeFcn(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat hw = (GLfloat)h/(GLfloat)w;
GLfloat wh = (GLfloat)w/(GLfloat)h;
if (w <= h)
glOrtho(-4.0, 4.0, -4.0*hw, 4.0*hw, -4.0, 4.0);
else
glOrtho(-4.0*wh, 4.0*wh, -4.0, 4.0, -4.0, 4.0);
glMatrixMode(GL_MODELVIEW);
}
void display()
{……
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3,
4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
int i, j; ……
for (j = 0; j <= 8; j++)
{
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
glEnd();
}
glPointSize(5.0);…绘制控制点
glFlush();}
GLfloat ctrlpoints4[4][4][3] = {
{{-1.5, 3.5, 0}, {0, 3, 1.0},{1, 3, 1.2}, {0.5, 3.5, -0.5}},
{{-2.5, 2.5, 1.0}, {-0.5, 2.2, 1.8},{0.8, 2.2, 1.5}, {3.2, 3, 1.2}},
{{-2, 1.5, 0.7}, {-0.2, 1.2, 1.5},{0.5, 1.2, 1.5}, {1.5, 1.5, 1.2}},
{{0, 0, 1.0}, {0, 0, 1.0},{0, 0, 1.0}, {0, 0, 1.0}} };
Bezier样条的缺憾
阶次缺乏灵活性 m个控制点,生成的曲线的阶次
只能为(m-1次) ;
控制性较差 当控制点数较多时,曲线的阶次将较
高,此时,控制点对曲线形状的控制将明显减弱;
或者只能添加额外的拼接条件。
不能局部修改 曲线的混合函数值在开区间 ( 0 , 1 )
内均不为零。因此,曲线在 ( 0 < t < 1) 区间内的任
何一点均要受到全部控制点的影响。 (而在外形
设计中,局部修改往往是要随时进行的)
B样条曲线
将不同 Bezier 曲线拼接的问题,转换为同
一个样条函数内部的分段问题,并且希望
新的曲线:
易于进行局部修改;
更逼近特征多边形;
是低阶次曲线。
B样条曲线
曲线参数方程的定义
B样条曲线的分类和特点
均匀B样条
均匀二次、三次B样条
非均匀B样条
NURBS
OpenGL绘制B样条曲线面
B样条曲线参数方程
n
p(t) Pk Bk,m(t)
k 0
1
Bk ,1 (t )
0
若t k t tk 1
其它
t tk
tk m t
Bk ,m (t )
Bk ,m 1 t
Bk 1,m 1 t
tk m1 t k
tk m t k 1
n+1个控制点,获得的B样条曲线为m-1次(m
阶),且曲线在连接点处具有m-2阶连续性。
分段特性的分析
B0,1# t0-t1
B1,1# t1-t2
B0,2# t0-t1; t1-t2
B1,2# t1-t2; t2-t3
B0,m# t0-t1; t1-t2; tm-1-tm
B1,m# t1-t2; t2-t3; tm-tm+1
Bn,1# tn-tn+1
0
Bn,2# tn-tn+1; tn+1-tn+2
0
Bn,m# tn-t1+n; t1+n-t2+n;
tm-1+n-tm+n
n
p(t) Pk Bk,m(t)
P0 B0m(t) # t0-tm
P1 B1m(t) # t1-tm+1
k 0
n+m+1
个节点
Pn Bnm(t) # tn-tm+n
B样条分类
均匀B样条函数:
节点沿参数轴均匀等距分布,即tk+1-tk=常数。
非均匀B样条函数:
节点分布不等距,即(tk+1-tk)≠常数。
1.均匀B样条曲线
例如:T=(-2,-1.5,-1,-0.5,0,0.5,1,1.5,2)
例如:T=(0,1,2,3,4,5,6,7)
特点:均匀B样条的基函数呈周期性
Bk ,m (t ) Bk 1,m (t t ) Bk 2,m (t 2t )
Bk ,m (t ) B0,m (t kt )
均匀二次(三阶)B样条曲线
m=3,假设取n=3,且T=(0,1,2,3,4,5,6)
Tk = k,因此有:
1
Bk ,1 (t )
0
k t k 1
其它
t k
k mt
Bk ,m (t )
Bk ,m1 t
Bk 1,m1 t
m 1
m 1
1
B0,1 (t )
0
0 t 1
其它
B0, 2 (t ) tB0,1 (t ) (2 t ) B1,1 (t )
t
0 t 1
tB0,1 (t ) (2 t ) B0,1 (t 1)
2 t 1 t 2
t
3t
B0,3 (t ) B0, 2 (t )
B0, 2 (t 1)
2
2
1 2
0 t 1
2t
1
1
t (2 t ) (t 1)(3 t )
1 t 2
2
2
1 (3 t ) 2
2t 3
2
1
2
2 (t 1)
1
1
B1,3 (t ) (t 1)(3 t ) (t 2)(4 t )
2
2
1 (4 t ) 2
2
1
2
(
t
2
)
2
1
1
B2,3 (t ) (t 2)(4 t ) (t 3)(5 t )
2
2
1 (5 t ) 2
2
1 t 2
2t3
3 t 4
2t3
3 t 4
4t5
1
2
(
t
3
)
3 t 4
2
1
1
B3,3 (t ) (t 3)(5 t ) (t 4)(6 t )
4t5
2
2
1 (6 t ) 2
5 t 6
2
四个基函数均有定义的参数范围是:
B (t ) 1
n
k 0
Tm-1 ~ Tn+1(T2~ T4)
t [t m-1 , t n 1 ]
Bk,3(t)
1
k ,m
m-1 < n+1
n>m–2
B0,3(t) B1,3(t) B2,3(t)
1
2
3
B3,3(t)
4
nm-1
5
四段二次(三阶)均匀B样条基函数
t
曲线的起点和终点值:
1
1
p (t 2 2) ( P0 P1 ), p (t 4 4) ( P2 P3 )
2
2
均匀二次B样条曲线起点和终点处的导数:
p(t2 ) P1 P0 , p(t4 ) P3 P2
P1
P0
P2
P3
四个控制点的二次周期性B样条曲线
结论:
二次均匀B样条曲线的起始点(终止点)
为第(倒数)一、二个控制点连线中点
(控制点数目任意)。
若次数>2,起点和终点是m-1个控制点的
加权平均值点。
m=3,n=2,分段二次B样条示意图
Pi (t ) B0,3 (t ) Pi B1,3 (t ) Pi 1 B2,3 (t ) Pi 2
i=0,1…5,7个控制点,三点一段,共6段。
P3
P1 P1(t)
B: P1,P2,P3
B: P0,P1,P2 P2
P0(t)
P0
P4
均匀三次(四阶)B样条
取m=4,n=3:且T=(0,1,2,3,4,5,6,7)
t
4t
B0, 4 (t ) B0,3 (t )
B0,3 (t 1)
3
3
1 3
6 t
1
1
1
2
t (2 t ) t (3 t )(t 1) (4 t )(t 1) 2
6
6
6
1
1
1
2
t (3 t ) (4 t )(3 t )(t 1) (4 t ) 2 (t 2)
6
6
6
1
3
(
4
t
)
6
有效参数区间为3~4,映射到0~1
0 t 1
1 t 2
2t3
3 t 4
1
B0, 4 (t ) (1 t )3
6
混合函数和矩阵表示
t[0,1]
n
p(t ) Pk Bk ,m
k 0
1 3
B0, 4 (t ) (t 3t 2 3t 1)
P0
6
P1
B0 ,4(t) B1,4(t) B2 ,4(t) B3 ,4(t)
1 3
2
P2
B1, 4 (t ) (3t 6t 4)
6
P3
1
B2, 4 (t ) (3t 3 3t 2 3t 1)
P0
1
3
3
1
6
1 3 6 3 0 P1
2
3
1 3
t t t 1
B3, 4 (t ) t
0
3
0
3
P2
6
6
1 4 1 0 P
3
T M B GB
t [0,1]
三次均匀B样条的边界条件
n
p(t ) Pk Bk ,m
k 0
1
1 3
3 2
t t t 1
6 3
1
t
3t
3
2
3
3
3
1
1 P0
0 P1
0 P2
0 P3
0,0,0,1
0,0,1,0
t t1
2
3
6
0
4
2t 1 0
1,1,1,1
3,2,1,0
1
p (0) ( P0 4 P1 P2 )
6
1
p (1) ( P1 4 P2 P3 )
6
1
p(0) ( P2 P0 )
2
1
p(1) ( P3 P1 )
2
P2
P1
P3
P0
四个控制点的三次均匀B样条曲线
性质:连续性验证
取m=4,n=3,控制点
数>4,则可构造分段
三次均匀B样条。
容易验证,各相邻段
之间具有以下连续性:
pi (1) pi 1 (0)
pi ' (1) pi 1 ' (0)
pi ' ' (1) pi 1 ' ' (0)
•一般情况Cm-2连续性
•因此要求:m
2
P0
P1
3
2
p0 (t ) t t t 1 M B
P2
p0 ' (t ) 3t 2 2t 1 0
P3
p0 ' ' (t ) 6t 2 0 0
P1
P2
3
2
p1 (t ) t t t 1 M B
P3
P4
......
Pi
Pi 1
3
2
pi (t ) t t t 1 M B
Pi 2
Pi 3
m=3; n=2
性质:局部控制性
—— 1个控制点改变,最多影响m段曲线
性质:凸包性等
B样条曲线
凸包性
n
B
k 0
k ,m
(t ) 1
Bezier曲线
t [t m-1 , t n 1 ]
几何不变性
(坐标系无关)
变差缩减性
Bezier曲线
B样条曲线
性质:节点或控制点的重复
重节点:降低连续性阶次
t0
t1
t2
t3
t4
具有重节点的三次B样条
重复控制点
二重,曲线趋近该点
三重,曲线经过该点
四点共线,生成一段直线
Bk,m(t)
非均匀B样条曲线
1
每个基函数曲线不同,每个控制点的影响范围以及对
整个曲线形状的影响效果也不同,不等间隔的节点反
而可能获得均匀变化的曲线段(曲面网格),更便于
灵活、精细的控制曲线形状。
T=(0,0,0,1,2,3,3,3)
1
2
非均匀B样条曲线的基函数
3
t
B样条曲线特殊效果
三次均匀B样条构造封闭曲线:n+1个控制点
P0,P1,…,Pn
Pi
P
0<=i<=n
(
i
1
)
mod(
n
1
)
3
2
pi (t ) t t t 1 M B
P(i 2 ) mod( n 1) 共获得n+1段曲线
P(i 3) mod( n 1)
P0
P5
B4
B3
P4
P1
B0
B2
P3
B5
B1
P2
除了封闭曲线之外,方便的顶点控制还可以
使整个B样条曲线在某些部位满足一些特殊
的技术要求。如:
在曲线中构造一段直线;
使曲线通过指定点;
使曲线与特征多边形相切;
指定曲线的端点;
指定曲线端点的约束条件。
n1
n2
B样条曲面 p(u, v) Pk ,k Bk ,m (u) Bk ,m (v)
k1 0 k 2 0
1
2
1
1
2
2
两组正交控制点构成控制网格(特征网格)。
B样条曲面具有与B样条曲线相同的局部控制性、凸包性、
连续性、几何不变性等性质。
P12
P12
P22
P02
v
P21
P11
P01
P00
P02
v
P10
u
P22
P20
P21
P11
P01
P10
P00
u
P20
双二次Bezier曲面和B样条曲面
p(u, v) UM B PM V
双三次B样条曲面
U u
V v
3
2
u
3
v2
u
v
T
B
1
1
T
1 3 3
3 6 3
1
MB
3
6 3 0
4
1
1
P0, 0
P
1, 0
P
P2, 0
双三次B样条曲面的突出特点就在于轻
p3 , 0
松地解决了曲面片之间的连接问题。
P0,1
P0, 2
P1,1
P1, 2
P2,1
P2, 2
P3,1
P3, 2
1
0
0
0
P0,3
P1,3
P2,3
P3,3
一架原型直升飞机,由SOFTIMAGE公司的Daniel Langlois设计并进
行模拟,使用了180,000个B-样条曲面片。然后使用光线追踪、凸
映射和反射映射方法绘制这一场景(由SGI公司提供)
有理B样条曲线
n
p(t )
W0=1
W 1=
3
k 0
n
k
k
k ,m
(t )
wk Bk ,m (t )
矢量多项式
标量多项式
W6=1
k 0
0.3
1
w P B
W3=1
0
W5=1
W4=1
W2=1
Wi:加权因子,具有几何推拉作用
NURBS
非均匀有理B样条
(Non-uniform Rational B-Spline)
二次曲面是NURBS的特殊情形
例子:取m=3,n=2:且T=(0,0,0,1,1,1)
r
w0 w2 1 ;w1
0 r 1
1 r
B0,3(u)=(1-u)2
B1,3(u)=2u(1-u)
B2,3(u)=u2
u[0,1]
双曲线
抛物线
直线
椭圆
NURBS的特点
自由曲线面和其它简单曲线面的统一表达。
具有仿射变换不变性。
灵活、局部性:少量的控制点调节出宽广平滑的表面。权因
子或者节点值的修改,便于更灵活的控制曲线面形状。
广泛适应性。尤其适合流线型表面(人的身体、生活用品、
果实 )和工业产品表面(如汽车、飞机整体或零件) 等。
CAM领域的广泛应用。具有一系列强有力的几何造型的配套
技术(包括节点插入、细分、升阶等)。
不太适合用nurbs建模的对象:山或行星等有较多棱角的物体,脸或手指
等需要有许多细节的物体,建立简单模型(如盒子)需要的面比多边形建
模复杂的多,需要更多的存储空间。
反求曲线面上点的参数值时,计算量较大,有时存在数值不稳定问题。
OpenGL的B样条曲线面函数
曲线
gluNurbsCurve
(curveName, nknots, *knotVector,
stride, *ctrlPts,degParam, GL_MAP1_VERTEX_3);
曲面
gluNurbsSurface
(surfName, nuKnots, uKnotVector,
nvKnots,vKnotVector, uStride, vStride, &ctrlPts
[0][0][0],uDegParam, vDegParam,
GL_MAP2_VERTEX_3);
均匀三次B样条绘制例程
float knotVector[8]={0,1,2,3,4,5,6,7};
GLfloat ctrlPts[4][3] =
{{ -3.5, -1.0, 0.0}, { -2.5, 0.5, 0.0}, {-1.5, -1, 0.0}, {-0.5, 0.5, 0.0}};
{……
GLUnurbsObj *nurb1;
nurb1 = gluNewNurbsRenderer ( );
gluNurbsProperty (nurb1,GLU_SAMPLING_TOLERANCE,1);
glEnable(GL_MAP1_VERTEX_3);
gluBeginCurve (nurb1);
gluNurbsCurve (nurb1, 8, knotVector, 3, &ctrlPts[0][0], 4,
GL_MAP1_VERTEX_3);
gluEndCurve (nurb1);
……绘制控制点等
glFlush();
}
分段三次B样条绘制例程
float knotVector[8]={0,1,2,3,4,5,6,7};
GLfloat ctrlPts[6][3] = {{ -3.5, -1.0, 0.0}, { -2.5, 0.5, 0.0}, {-1.5, -1, 0.0}, {-0.5,
0.5, 0.0},{1.5, 0.5, 0.0}, {3.5, 2, 0.0}};
{……
GLUnurbsObj *nurb[3];
for(i=0;i<3;i++) {
nurb[i] = gluNewNurbsRenderer ( );
gluNurbsProperty (nurb1,GLU_SAMPLING_TOLERANCE,1); }
glEnable(GL_MAP1_VERTEX_3);
for(i=0;i<3;i++) { glColor(…);
gluBeginCurve (nurb[i]);
gluNurbsCurve (nurb[i], 8,
knotVector, 3, &ctrlPts[i][0],
4, GL_MAP1_VERTEX_3);
gluEndCurve (nurb[i]);}
……}
均匀三次B样条绘制例程
float knotVector[8]={0,1,2,3,4,5,6,7};
GLfloat ctrlPts4[4][4][3] = {同Bezier曲面例程……};
{…….
GLUnurbsObj *surfName;
surfName = gluNewNurbsRenderer ( );
gluNurbsProperty(surfName,GLU_SAMPLING_TOLERANCE,1);
gluNurbsProperty(surfName,GLU_SAMPLING_TOLERANCE,1);
glEnable(GL_MAP2_VERTEX_3);
gluBeginSurface (surfName);
gluNurbsSurface (surfName,
8, knotVector,
8, knotVector, 3, 12,
&ctrlPts4 [0][0][0], 4, 4,
GL_MAP2_VERTEX_3);
gluEndSurface (surfName);
……
}
样条曲线面的显示(计算)
Horner-rule方法
向前差分方法
细分方法
样条曲线面的显示(计算)
Horner规则
逐次分解因子
每步需要一次乘法,一次加法
三次多项式需要三步(即:3乘,3加)
样条曲线面的显示(计算)
向前差分
假定参数u以同样步长
从0到1递增
一次性计算x、y、z的增量(向前差分)
递归累加
三次多项式:每步需3次加法
线性样条:向前差分是一个常量(每步需1次加法)
高阶样条:向前差分是u的一个函数
……
……
u0=0,步长为
x的初始值和第一
组向前差分——
三
次
样
条
的
向
前
差
分
推
导
样条曲线面的显示(计算)
Bezier样条的细分显示方法
细分的目标:控制多边形近似等于Bezier曲线
一次细分过程如图所示。
P1
所有生成点均为相关线段的中点。
递归实现
细分的结束条件可以是以下之一:
P1,1
新生成的4点接近共线
P0 P1,0
P2
P2,1
P1,2
起止点足够近
相邻点足够近
T
P2,0
P1,3
P2,2
P2,3 P3
Bezier细分方法的验证
p(t ) (1 t )3 P0 3t (1 t )2 P1 3t 2 (1 t )P2 t 3 P3
2
2
2
2
p' (t ) 3(1 t ) P0 (3 12t 9t )P1 (6t 9t ) P2 3t P3
边界条件
P1,0 = p(0)=P0
2*3*(P1,1-P1,0)= p’(0) =3*(P1-P0)
P1,3 = p(0.5)
2*3*(P1,3-P1,2)=p’(0.5)
P1
T
P2
P1,2
P1,1
P0 P1,0
P1,3
P3
Bezier细分方法的验证(续)
p(t ) (1 t )3 P0 3t (1 t )2 P1 3t 2 (1 t )P2 t 3 P3
p1 (t1 ) (1 t1 ) P1,0 3t1 (1 t1 ) P1,1 3t1 (1 t1 ) P1, 2 t P
3
t1 2t
2
2
3
1 1, 3
( t1 [0,1],t [0,0.5])
p2 (t 2 ) (1 t 2 ) P2,0 3t 2 (1 t 2 ) P2,1 3t 2 (1 t 2 ) P2, 2 t 2 P2,3
3
t 2 2t 1
2
2
3
( t 2 [0,1],t [0.5,1])
将P1,i和t1=2t,代入p1(t1),即得p1(t1)=p(t) ,且t[0,0.5]
将P2,i和t2=2t-1,代入p2(t2),即得p2(t2)=p(t),且t[0.5,1]
即:细分后的曲线分别等同于原bezier曲线的前(后)半段
细分曲面造型方法
从20世纪70年代中后期起,发展成为继NURBS之后的一
种重要的自由曲面造型方法,几乎相对独立的一门学科。
应用在物体建模、古代器件和艺术领域的雕塑作品三维重构、电
影动画、玩具制造等。
能够从任意的初始网格出发产生光滑的曲面。 Catmull
Clark法、Doo-Sabin法、Loop细分法、蝴蝶改进法……
逼近型:是一种收缩方法,较难通过顶点对曲面进行控制。
插值型:保持初始网格顶点不变,曲面的光顺性较难控制。
第六讲小结
自由曲线面的表示方法
样条的定义和特点
Bezier
样条,B样条
样条计算的基本方法
练习题
概念
插值曲线、Bezier曲线、B样条曲线各有什么特点?
画一个五边形,再画五条Bezier曲线,它们两两相连在五个
顶点处,且具C1连续性,请给出画法。
编程
用OpenGL绘制一个用三次Bezier曲面或三次B样条(四点)
围成的任意闭合三维物体的表面。
End of 第六讲