2. 旋转变换

Download Report

Transcript 2. 旋转变换

计算机图形学
河南理工大学 计算机学院
徐文鹏 [email protected]
教学博客http:// Opengl.cnblogs.com
1
问题的提出
组合场景
10:43
2
问题的提出
雪花的构造
10:43
3
问题的提出
构造三维场景
10:43
4
问题的提出
在计算机动画中,在相邻帧图像中,几个对象相对彼此
的位置进行移动
10:43
5
一般变换
• 所谓变换就是把点映射到其它点,把向量映射到其
它向量
10:43
6
平移
• 把一个点移到新的位置
• 平移由一个向量d确定
– 三个自由度
– P’= P + d
10:43
7
对象的平移
• 把一个对象上的所有点沿同一向量平移
对象
10:43
平移后的对象
8
平移的表示
平移变换:将p点从一个坐标位置移到另一个坐标位置的过程.
Y
P'
T
P
Ty
Tx
新点坐标?
X
图6-1
10:43
平移变换
9
平移的表示
• 向量表示:
P'
Y
 x  x  t x

 y '  y  t y
'
T
P
Ty
Tx
P  P T
'
t x 
T  
t y 
10:43
X
平移变换
10
旋转
10:43
11
旋转变换
将p点绕坐标原点转动某个角度(逆时针为正,顺时针为负)
得到新的点p’的过程
Y
P'
r
θ r
α
10:43
图6-4
P
X
旋转变换
12
旋转变换表示
r
'

 x  r cos  cos  r sin  sin 


 y '  r sin  cos   r cos  sin 
 x  x cos   y sin 

 y '  x sin   y cos 
'
10:43
P'
Y
• 向量表示:
 x '  r cos(   )

 y '  r sin(   )
θ r
α
P
X
图6-4 旋转变换
 x '  cos
 y '   sin 
  
'
P  RP
 sin    x 



cos   y 
13
旋转变换表示
• 向量表示:
Y
P'
 x '  cos
 y '   sin 
  
P'  R  P
cos
R
 sin
 sin    x 



cos   y 
r
θ r
 sin  

cos 
α
P
X
图6-4 旋转变换
顺时针旋转θ
角?
10:43
14
齐次坐标
P  P T
'
P  R P
1. 平移变换:

 x  x  tx


 y '  y  ty
'
 x  x  tx

 y '  y  ty

1  1
'
10:43
'
P  P  T  P  P  T
tx,ty称为平移参数
 x '  1 0 t x   x 
 y '   0 1 t   y 
y 
  
 1  0 0 1   1 
1 0 t x 


T (t x , t y )  0 1 t y 
 0 0 1 
P  T (t x , t y )  P
15
齐次坐标
2. 旋转变换:
逆时针旋转θ角
 x '  cos
 y '   sin 
  
 1   0
10:43
 x '  x cos   y sin 

 y '  x sin   y cos 
 sin 
cos
0
0  x 
0  y 
1   1 
cos 

R ( )   sin 
 0
P  R ( )  P
齐次坐标
 sin 
cos 
0
0

0
1 
16
齐次坐标
• 齐次坐标表示法是由n+1维向量表示一个n维向量。
如:n维向量(P1,P2, … ,Pn)表示为(hP1,hP2,hPn,h),
其中h称为哑坐标。
• 普通坐标与齐次坐标的关系为“一对多”
由普通坐标h→齐次坐标
由齐次坐标÷h→普通坐标
如:普通坐标(2,3)→齐次坐标 (4,6,2), (6,9,3)
• 当h=1时产生的齐次坐标称为“规格化坐标”,因为前n个
坐标就是普通坐标系下的n维坐标。
齐次坐标的作用
10:43
17
齐次坐标
1. 齐次坐标是所有计算机图形系统的关键
2. 将各种变换用阶数统一的矩阵来表示。提供了用
矩阵运算把二维、三维甚至高维空间上的一个点
从一个坐标系变换到另一坐标系的有效方法。
3. 便于变换合成, 以利于硬件实现
几何意义?
10:43
18
齐次坐标
齐次坐标
(x,y)点对应的齐次坐标为
( x, y )  ( x, y ,1)  ( hx, hy , h)
( x, y, z )  ( hx, hy, h)
z
齐次坐标为三维空间的一条直线
P
Z=1平面
O
Y
x
10:43
19
放缩
• 沿每个坐标轴伸展或收缩(原点为不动点)
10:43
20
放缩变换
对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放
缩Sy倍。其中Sx和Sy称为比例系数。
Sx
S   0
 0
10:43
0
Sy
0
Y
 x  xS x

 y '  yS y
0
0
1 
P'(4,3)
P(2,1)
X
放缩变换(Sx=2,Sy=3)
21
错切变换
Y
Y
Y
用于产生弹性物体的变形处理。在游戏中用它扭曲
整个场景,产生虚幻效果.
(a)
X
原图
(b)
图6-7
10:43
沿x方向错切
错切变换
X
X
(c)
沿y方向错切
22
错切变换
(1)沿x方向错切
每一点的y坐标不变,x坐标平移一个y坐标的线性量.
 x '  1 a 0   x 
 y '   0 1 0   y 
  
 
 1  0 0 1   1 
Y
 x  x  ay

 y'  y
1
SH x  0
0
10:43
a
1
0
0
0 
1 
(b)
沿x方向错切
X
23
错切变换
(2)沿y方向错切
 x  x

 y '  y  bx
 x '  1 0 0   x 
 y '   b 1 0   y 
  
 
 1  0 0 1   1 
1 0 0 


SH y  b 1 0
0 0 1 
10:43
Y
每一点的x坐标不变,y坐标平移一个x坐标的线性量.
X
(c) 沿y方向错切
24
仿射变换
 x'  ax  by  m

 y'  cx  dy  n
• 平移、比例、旋转、错切和反射等变换均是
二维仿射变换的特例
• 仿射变换具有平行线不变性和有限点数目的
不变性
10:43
25
二. 复合变换
• 基本变换
• 任何一复杂的几何变换都可以看作基本几何变换的
组合形式。
• 复合变换具有形式:
P'  P  T  P  (T1  T2  T3  Tn )
 P  T1  T2  T3  Tn
10:43
(n  1)
26
二. 复合变换
1. 二维复合平移
两个连续平移是加性的
P  T (t x , t y )  P
P  T (mx , my )  P
1 0 t x 
T1  T (t x , t y )  0 1 t y 
0 0 1 
 1 0 mx 
T2  T (mx , m y )  0 1 m y 
0 0 1 
 T (mx , my )  T (t x , t y )  P
 T (mx  t x , my  t y )  P
10:43
27
二. 复合变换
2. 二维复合比例
连续放缩变换是相乘的
S (mx , my )  S (t x , t y )  S (mx  t x , my  t y )
3. 二维复合旋转
连续旋转变换是相加的
R(1 )  R( 2 )  R(1   2 )
10:43
28
二. 复合变换
4. 相对任一参考点的二维几何变换
思路?
例. 相对点O’的旋转变换
相对某个参考点O’作二维几何变换,其变换过程为:
(1) 平移
y
p(xp,yp)
(2) 对原点进行几何变换
(3) 反平移
y0
O
10:43
O'
x0
相对任一参考点的变换
29
x
二. 复合变换
5. 相对任意方向的二维几何变换
Y
例. 相对直线l的反射变换
相对任意方向作二维几何变换,其变换的过程是:
(1) 旋转变换
(2) 针对坐标轴进行二维几何变换;
(3) 反向旋转
P(x,y)
X
l
10:43
P'(x,-y)
(a)关于x轴对称 30
二. 复合变换
例. 将正方形ABCO各点沿图6-8所示的(0,0)→(1,1)方向进行
Y
拉伸,结果为如图所示的,写出其变换矩阵和变换过程。
2
A'
B'
3/2
B
A
1/2
C'
C
O
1/2
图6-8
10:43
1
3/2
2
X
针对固定方向的拉伸
31
二. 复合变换
• Example:
10:43
32
一.3D基本几何变换
• 三维基本几何变换都是相对于坐标原点和
坐标轴进行的几何变换
• 假设三维形体变换前一点为p(x,y,z),变
换后为p'(x',y',z')。
10:43
33
一.3D基本几何变换
平移变换
10:43
0
1
0
0
0
0
1
0
X
tx 

ty 
tz 

1
Z
1
0

0

0
(x,y,z)
 x '  x  Tx

 y '  y  Ty

 z '  z  Tz
(x',y',z')
1.
Y
图7-5 平移变换
34
一.3D基本几何变换
2. 旋转变换
z
z
o
y
X
X
旋转变换
10:43
o
y
旋转变换的角度方向
35
一.3D基本几何变换
(1)绕z轴旋转
TRZ
cos 
 sin 

 0

 0
 sin 
cos 
0
0
0
0
1
0
0
0 
0

1
z
y
X
10:43
36
一.3D基本几何变换
(2)绕x轴旋转
TRX
0
1
0 cos 

0 sin 

0
0
0
 sin 
cos 
0
0

0
0

1
z
y
X
10:43
37
一.3D基本几何变换
(3)绕y轴旋转
TRY
 cos 
 0

  sin 

 0
0 sin 
1
0
0 cos 
0
0
0

0
0

1
z
y
Flash演示
10:43
X
38
一.3D基本几何变换
3.
放缩变换
 sx
0
Ts  
0

0
10:43
0
sy
0
0
0
0
sz
0
0

0
0

1
39
一.3D基本几何变换
例:对如图7-6所示的长方形体进行放缩变换,
其中Sx=1/2,Sy=1/3,Sz=1/2,求变换后的长
方形体各点坐标。
z
z
2 E
F
2
3
H
1
G
A
B
D y
y
1
C
x
10:43
1
x
图7-6
比例变换
40
二.3D复合变换
• 三维复合变换是指图形作一次以上的基本变
换,变换结果是基本变换矩阵相乘。
P'  P  T  P  (T1  T2  T3  Tn )
10:43
(n  1)
41
二.3D复合变换
1.
相对任一参考点的三维变换
相对于参考点F(xf,yf,zf)作比例、旋转、错
切等变换的过程分为以下三步:
(1)将参考点F移至坐标原点
(2)针对原点进行三维几何变换
(3)进行反平移
10:43
42
二.3D复合变换
例:相对于F(xf,yf,zf)点进行放缩变换
x
(a)原图
y
10:43
y
x
(b)移至坐标原点
图7-8
z
(x',y',z')
(x',y',z')
F
z
(x',y',z')
z
(x',y',z')
z
y
x
(c)基本比例变换
F
y
x
(d)移回F点原来位置
相对参考点F的比例变换
43
二.3D复合变换
2.
绕任意轴的三维旋转变换
[ x'
y' z' 1]  [ x
y
AB与Z轴重合
Z
z 1]  TRAB
P'
B
θ
问题:如何求出TRAB?
P
向基本变换转化
A
Y
X
P点绕AB轴旋转
10:43
44
二.3D复合变换
(1) 将A点平移到坐标原点
下一步?
z
E
b
B
B'
a
c
o
D
y
x
10:43
45
二.3D复合变换
欲使OB绕x轴旋转至xoz坐标平面内,旋转角
度应为
,原因是
.
A)  EOB
B)  AOB
z
E
b
B
A
B'
a
c


y
o
x
F
10:43
D
G
46
二.3D复合变换
(2) 将OB绕x轴逆时针旋转α角,则OB旋转到
xoz平面上, a, b, c 已知
z
z
b
E
B
B'

a
b
E
B
B'
a
c
c

o
D
x
o
y
D
x
(a)
α=?
10:43
y
(b)
若绕z轴, α?
47
二.3D复合变换
(3) 将OB绕y轴顺时针旋转β角,则OB旋转到
z轴上
β =?
F
B
z
E
b
B
F
a
c


o
D
y
x
10:43
48
二.3D复合变换
(4) 经以上三步变换后,AB轴与z'轴重合,此时
绕AB轴的旋转转换为绕z轴的旋转。
(5) 最后,求TtA,TRx,TRy的逆变换,回到AB原
来的位置。
Z
P'
1
1
TRAB  TtATRxTRyTRzTRy TRx TtA
B
1
θ
P
A
Y
X
10:43
P点绕AB轴旋转 49
二.3D复合变换
针对任意方向轴的变换可用五个步骤来完成:
(1)平移:使任意方向轴起点与坐标原点重合
(2)旋转:使方向轴与某一坐标轴重合,变换可
能不止一次
(3)针对该坐标轴完成所需变换
(4)逆旋转:使方向轴回到其原始方向
(5)逆平移:使方向轴回到其原始位置。
10:43
50
OpenGL旋转、平移、放缩
• 上载单位阵:
glLoadIdentity();
• 在右边相乘:
glRotatef(theta, vx, vy, vz);
–theta以角度为单位,(vx,vy,vz)定义旋转轴
glTranslatef(dx, dy, dz);
glScalef(sx, sy, sz);
每个函数的参数还可以是d(double)类型
10:43
51
示例
• 固定点为(1.0, 2.0, 3.0), 绕z轴旋转30°
glMatrixMode(GL_MODEL_VIEW);
glLoadIdentity();
glTranslated(1.0, 2.0, 3.0);
glRotated(30.0,0.0,0.0,1.0);
glTranslated(-1.0,-2.0,-3.0);
• !!在程序中最后指定的矩阵是最先被执行的操作
10:43
52
变换的应用
• 例如:应用空闲函数旋转立方体,鼠标函数改变旋
转的方向
• 从一个画立方体的程序开始(cube.c)
– 立方体中心在原点
– 各方向与坐标轴平行
10:43
53
OpenGL中的矩阵
• 在OpenGL中矩阵是状态的一部分
• 有三种类型
– 模型视图(GL_MODELVIEW)
– 投影(GL_PROJECTION)
– 纹理(GL_TEXTURE)
• 用于操作的单组函数
• 选择所操作的对象
– glMatrixMode(GL_MODEL_VIEW);
– glMatixMode(GL_PROJECTION);
10:43
54
当前变换矩阵(CTM)
• 从概念上说,当前变换矩阵(CTM)就是一个4x4阶
的齐次坐标矩阵,它是状态的一部分,被应用到经
过流水线中的所有顶点
• CTM是在应用程序中定义的,并被上载到变换单
元中
10:43
55
CTM运算
• CTM可以被改变,改变的方法是上载一个新的
CTM或者右乘一个矩阵
– 上载单位阵:C ← I
– 上载任意矩阵:C ←M
– 上载一个平移矩阵:C ← T
– 上载一个旋转矩阵:C ←R
– 上载一个放缩矩阵:C ← S
– 右乘任意矩阵:C ←CM
– 右乘一个平移矩阵:C ←CT
– 右乘一个旋转矩阵:C ←CR
10:43
– 右乘一个放缩矩阵:C ←CS
56
绕固定点的旋转
•
•
•
•
•
•
•
从单位阵开始:C ← I
把固定点移到原点:C ← CT−1
旋转:C ← CR
把固定点移回到原处:C ← CT
结果:C = T−1RT
其中每个运算对应于程序中的一个函数调用
!!在程序中最后指定的运算是最先被执行的运算
10:43
57
在OpenGL中的CTM
• 在OpenGL的流水线中有一个模型视图矩阵和一个
投影矩阵,这两个矩阵复合在一起构成CTM
• 可以通过首先设置正确的矩阵模式处理每个矩阵
10:43
58
任意矩阵
可以上载应用程序中定义的矩阵,或者使之与CTM
相乘
glLoadMatrixf(m)
glMultMatrixf(m)
•矩阵m是有16个元素的一维数组,其按列定义了4x4
矩阵
•在glMultMatrixf(m)中m乘在已有乘法的右边
10:43
59
矩阵堆栈
• 许多情况中需要保存变换矩阵,待稍后再用
– 遍历层次数据结构
– 当执行显示列表时避免状态改变
• OpenGL为每种类型的矩阵维持一个堆栈
– 应用下述函数处理矩阵堆栈(也是由 glMatrixMode设置
矩阵类型)
glPushMatrix()
glPopMatrix()
10:43
60
读入后台矩阵
• OpenGL状态中有些信息是以矩阵形式保存的
• 可以利用查询函数读入矩阵(以及其它部分的 状
态)
glGetIntegerv
glGetFloatv
glGetBooleanv
glGetDoublev
• 例如,对于CTM:
double m[16];
glGetDoublev(GL_MODELVIEW,m);
10:43
61