样条曲线

Download Report

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(i1) (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!
nk
nk
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+2tP2
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  Pn1 )
终点处切线为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)((Pn2  Pn1 )  ( Pn1  Pn ))
三次Bezier曲线段在起点和终点处的二阶导数为:
p(0)  6( P0  2P1  P2 )
p(1)  6( P1  2P2  P3 )
性质4:对称性
由控制顶点 Pi*  Pni ,(i  0,1,..., n), 构造出的新Bezier
曲线,与原Bezier曲线形状相同,走向相反。因为:
n i
n
n ( n i )
Bni ,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  m1  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  2t )
Bk ,m (t )  B0,m (t  kt )
均匀二次(三阶)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  mt
Bk ,m (t ) 
Bk ,m1 t  
Bk 1,m1 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
3t
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
2t 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
2t3
3 t  4
2t3
3 t 4
4t5
1
2
(
t

3
)
3 t 4
2
 1
1
B3,3 (t )   (t  3)(5  t )  (t  4)(6  t )
4t5
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
nm-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
4t
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
2t3
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 第六讲