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 RP
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