1.变换的作用
对于计算机图形学从业者,掌握变换(transform)是极其重要的。掌握了transform,你就可以摆放物体(objects)、灯光(lights)和相机(cameras)的位置,变换(reshape)它们的形状,并使(animate)它们动起来。懂了transform,你就可以确保所有的计算是在同一个坐标系(the same coordinate system)中进行,而不是错误地使用坐标系。你还可以以不同的方式,把物体(objects)投影到平面上。说的这些只是transfrom的小部分作用,但足以说明transfrom在实时图形学(real-time graphics),乃至所有图形学(any kind of computer graphics)中扮演的重要角色。
2.二维变换
2.1缩放变换(Scale Transform)
2.1.1等比例缩放
一般表示:
x
′
=
s
x
x'=sx
x′=sx
y
′
=
s
y
y'=sy
y′=sy
矩阵表示:
(
x
′
y
′
)
\begin{pmatrix} x'\\ y'\\ \end{pmatrix}
(x′y′)=
(
s
0
0
s
)
\begin{pmatrix} s&0\\ 0&s\\ \end{pmatrix}
(s00s)
(
x
y
)
\begin{pmatrix} x\\ y\\ \end{pmatrix}
(xy)
仿射变换表示:
S
(
S
x
,
S
y
)
S(S_x,S_y)
S(Sx,Sy)=
(
S
0
0
0
S
0
0
0
1
)
\begin{pmatrix} S&0&0\\ 0&S&0\\ 0&0&1 \end{pmatrix}
⎝⎛S000S0001⎠⎞
(
x
y
)
\begin{pmatrix} x\\ y\\ \end{pmatrix}
(xy)
2.1.2不等比例缩放
一般表示:
x
′
=
s
x
x'=s_x
x′=sx
y
′
=
y
y'=y
y′=y
矩阵表示:
(
x
′
y
′
)
\begin{pmatrix} x'\\ y'\\ \end{pmatrix}
(x′y′)=
(
S
x
0
0
S
y
)
\begin{pmatrix} S_x&0\\ 0&S_y\\ \end{pmatrix}
(Sx00Sy)
(
x
y
)
\begin{pmatrix} x\\ y\\ \end{pmatrix}
(xy)
仿射变换表示:
S
(
S
x
,
S
y
)
S(S_x,S_y)
S(Sx,Sy)=
(
S
x
0
0
0
S
y
0
0
0
1
)
\begin{pmatrix} S_x&0&0\\ 0&S_y&0\\ 0&0&1 \end{pmatrix}
⎝⎛Sx000Sy0001⎠⎞
(
x
y
)
\begin{pmatrix} x\\ y\\ \end{pmatrix}
(xy)
2.2对称变换(Reflection Transform)
一般表示:
x
′
=
−
x
x'=-x
x′=−x
y
′
=
y
y'=y
y′=y
矩阵表示
(
x
′
y
′
)
\begin{pmatrix} x'\\ y'\\ \end{pmatrix}
(x′y′)=
(
−
1
0
0
1
)
\begin{pmatrix} -1&0\\ 0&1\\ \end{pmatrix}
(−1001)
(
x
y
)
\begin{pmatrix} x\\ y\\ \end{pmatrix}
(xy)
2.3错切变换(Shear Transform)
错切变换可以用于在游戏中扭曲整个场景,创建一种迷幻效果,或者也可用于扭曲模型的外观。有六个基本的错切变换矩阵
矩阵表示:
(
x
′
y
′
)
\begin{pmatrix} x'\\ y'\\ \end{pmatrix}
(x′y′)=
(
S
x
0
0
S
y
)
\begin{pmatrix} S_x&0\\ 0&S_y\\ \end{pmatrix}
(Sx00Sy)
(
x
y
)
\begin{pmatrix} x\\ y\\ \end{pmatrix}
(xy)
2.4旋转变换(Rotation Transform)
矩阵表示:
R
θ
R_\theta
Rθ=
(
c
o
s
θ
−
s
i
n
θ
s
i
n
θ
c
o
s
θ
)
\begin{pmatrix} cos\theta&-sin\theta\\ sin\theta&cos\theta\\ \end{pmatrix}
(cosθsinθ−sinθcosθ)
仿射变换表示:
R
θ
R_\theta
Rθ=
(
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
)
\begin{pmatrix} cos\theta&-sin\theta&0\\ sin\theta&cos\theta&0\\ 0&0&1 \end{pmatrix}
⎝⎛cosθsinθ0−sinθcosθ0001⎠⎞
3.三维变换
三维变换类似二维变换,只是在二维的基础上又增加了一个z坐标,因此以下变换均直接使用仿射变换。
3.1缩放变换(Scale Transform)
仿射变换表示:
3.2平移变换(Translation Transform)
仿射变换表示:
3.3旋转变换(Scale Transform)
3.3.1绕坐标轴旋转
3维旋转有3个矩阵,分别对应绕x轴,y轴,z轴旋转。采用右手坐标系,旋转方向为绕z轴旋转(x轴转向y轴),不难推出绕x轴旋转(y转向z),绕y轴旋转(z转向x),(右手螺旋定则)
x
→
y
→
z
→
x
x→y→z→x
x→y→z→x
绕x轴旋转:(x不变,y转向z)
绕y轴旋转:(y不变,z转向x)
绕z轴旋转:(z不变,x转向y)
注:任意旋转都是正交矩阵
正交矩阵性质:正交矩阵的逆=正交矩阵的转置
因此:旋转矩阵的逆矩阵=旋转矩阵的转置
旋转矩阵的逆:几何解释是,我反着转这么多,比如我逆时针转45°,转置便是顺时针转45°
3.3.2绕任意轴旋转
大致思路:将给定的任意轴给先旋转到任意的x,y,z轴上,然后问题转化为基本的旋转,然后再逆旋转回来。
罗德里格斯旋转公式:(绕轴n旋转角度α)
4.仿射变换
仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
4.1齐次坐标(Homogeneous Coordinates)
用三维向量表示二维向量,或者一般而言,用一个n+1维的向量表示一个n维向量的方法称为齐次坐标表示法。
引入齐次坐标后,就可以用一个公式将缩放,旋转,平移变换用矩阵表示出来。
三维空间中:齐次坐标使用四个元素来表示,即(x, y, z, w),要将齐次坐标转换为三维坐标,其关系为(x/w, y/w, z/w),其中w表示坐标轴的远近参数,通常设为1,如果要用来表示远近感,则会设定为距离的倒数(1/距离),例如表示一个无限远的距离时,我们会将w 设定为0。
2D齐次坐标:
2Dpoint =
(
x
,
y
,
1
)
T
(x,y,1)^T
(x,y,1)T
2Dvector =
(
x
,
y
,
0
)
T
(x,y,0)^T
(x,y,0)T
齐次坐标系下:
(
x
y
w
)
\begin{pmatrix} x\\ y\\ w\\ \end{pmatrix}
⎝⎛xyw⎠⎞=
(
x
/
w
y
/
w
1
)
\begin{pmatrix} x/w\\ y/w\\ 1\\ \end{pmatrix}
⎝⎛x/wy/w1⎠⎞
当w坐标为1或0时,以下结论成立:
- vector + vector = vector
- point – point = vector
- point + vector = point
- point + point = ??
4.2平移变换(Translation Transform)
一般表示:
x
′
=
x
+
t
x
x'=x+t_x
x′=x+tx
y
′
=
y
+
t
y
y'=y+t_y
y′=y+ty
矩阵表示:
(
x
′
y
′
)
\begin{pmatrix} x'\\ y'\\ \end{pmatrix}
(x′y′)=
(
a
b
c
d
)
\begin{pmatrix} a&b\\ c&d\\ \end{pmatrix}
(acbd)
(
x
y
)
\begin{pmatrix} x\\ y\\ \end{pmatrix}
(xy)+
(
t
x
t
y
)
\begin{pmatrix} t_x\\ t_y\\ \end{pmatrix}
(txty)
仿射变换表示:
T
(
t
x
,
t
y
)
T(t_x,t_y)
T(tx,ty)=
(
1
0
t
x
0
1
t
y
0
0
1
)
\begin{pmatrix} 1&0&t_x\\ 0&1&t_y\\ 0&0&1 \end{pmatrix}
⎝⎛100010txty1⎠⎞
(
x
y
1
)
\begin{pmatrix} x\\ y\\ 1\\ \end{pmatrix}
⎝⎛xy1⎠⎞=
(
x
+
t
x
y
+
t
y
1
)
\begin{pmatrix} x+t_x\\ y+t_y\\ 1\\ \end{pmatrix}
⎝⎛x+txy+ty1⎠⎞
4.3复合变换(Inverse Transform)
上面的是先平移后旋转;
下面的是先旋转后平移。(设以此变换为目的)
可以看出不同的先后变换所得到的最终图形位置不一样。(矩阵不满足结合律)
R
45
⋅
T
(
1
,
0
)
≠
T
(
1
,
0
)
⋅
R
45
R_{45} · T_{(1,0)}≠T_{(1,0)} · R_{45}
R45⋅T(1,0)=T(1,0)⋅R45
先旋转后平移计算:(从右往左计算)
T
(
1
,
0
)
⋅
R
45
T_{(1,0)} · R_{45}
T(1,0)⋅R45
(
x
y
1
)
\begin{pmatrix} x\\ y\\ 1 \end{pmatrix}
⎝⎛xy1⎠⎞=
(
1
0
1
0
1
0
0
0
1
)
\begin{pmatrix} 1&0&1\\ 0&1&0\\ 0&0&1 \end{pmatrix}
⎝⎛100010101⎠⎞
(
c
o
s
4
5
o
−
s
i
n
4
5
o
0
s
i
n
4
5
o
c
o
s
4
5
o
0
0
0
1
)
\begin{pmatrix} cos45^o &-sin45^o&0\\ sin45^o &cos45^o&0\\ 0&0&1\\ \end{pmatrix}
⎝⎛cos45osin45o0−sin45ocos45o0001⎠⎞
(
x
y
1
)
\begin{pmatrix} x\\ y\\ 1 \end{pmatrix}
⎝⎛xy1⎠⎞