变换 Transformation
什么是变换
变换就是将一个点或向量从一个位置移动到另一个位置的过程。
变换的类型
以二维的形式给出。
缩放
变换公式
x
′
=
s
x
y
′
=
t
y
x'=sx\\y'=ty
x′=sxy′=ty
对应的矩阵
(
s
0
0
t
)
\begin{pmatrix} s & 0\\ 0 & t \end{pmatrix}
(s00t)
反射
变换公式
x
′
=
−
x
y
′
=
y
x'=-x\\ y'=y
x′=−xy′=y
变换矩阵
(
−
1
0
0
1
)
\begin{pmatrix}-1 & 0\\0 &1\end{pmatrix}
(−1001)
切变(shear transformation)
变换公式
x
′
=
x
+
a
y
y
′
=
y
x'=x+ay\\y'=y
x′=x+ayy′=y
变换矩阵
(
1
a
0
1
)
\begin{pmatrix}1 & a\\0 &1\end{pmatrix}
(10a1)
旋转变换(Rotate)
旋转变换一般认为是认为绕过原点的旋转轴逆时针旋转,假设点 ( x , y ) (x,y) (x,y)绕 Z Z Z轴旋转 β \beta β得到了 ( x ′ , y ′ ) (x',y') (x′,y′),公式推导如下
对于
(
x
,
y
)
(x,y)
(x,y),有
x
=
r
c
o
s
α
y
=
r
sin
α
.
x=rcos\alpha\\y=r\sin\alpha.
x=rcosαy=rsinα.
旋转了
β
\beta
β后,得到
x
′
=
r
c
o
s
(
α
+
β
)
y
′
=
r
s
i
n
(
α
+
β
)
.
x'=rcos(\alpha + \beta)\\y'=rsin(\alpha + \beta).
x′=rcos(α+β)y′=rsin(α+β).
展开后可得到
x
′
=
r
(
c
o
s
α
c
o
s
β
−
s
i
n
α
s
i
n
β
)
=
x
c
o
s
β
−
y
s
i
n
β
y
′
=
r
(
s
i
n
α
c
o
s
β
+
c
o
s
α
s
i
n
β
)
=
x
s
i
n
β
+
y
c
o
s
β
.
x'=r(cos\alpha cos\beta - sin\alpha sin\beta)=xcos\beta - ysin\beta\\y'=r(sin\alpha cos\beta + cos\alpha sin\beta) = xsin\beta+ycos\beta.
x′=r(cosαcosβ−sinαsinβ)=xcosβ−ysinβy′=r(sinαcosβ+cosαsinβ)=xsinβ+ycosβ.
可以得到旋转矩阵为
R
β
=
(
c
o
s
β
−
s
i
n
β
s
i
n
β
c
o
s
β
)
R_\beta=\begin{pmatrix} cos\beta & -sin\beta \\ sin\beta & cos\beta \end{pmatrix}
Rβ=(cosβsinβ−sinβcosβ)
已知上述矩阵为正交矩阵,因此有
R
−
β
=
R
β
T
R_{-\beta}=R_{\beta}^T
R−β=RβT
线性变换
上面提到的变换都可以统一为如下形式
x
′
=
a
x
+
b
y
y
′
=
c
x
+
d
y
x'=ax+by\\y'=cx+dy\\
x′=ax+byy′=cx+dy
从而写成矩阵的形式
(
a
b
c
d
)
\begin{pmatrix} a & b\\ c & d\\ \end{pmatrix}
(acbd)
但是,对于平移来说,其公式如下
x
′
=
x
+
t
x
y
′
=
y
+
t
y
.
x'=x+t_x\\y'=y+t_y.
x′=x+txy′=y+ty.
无法统一到矩阵的表示当中,这就导致了齐次坐标的引入。
齐次坐标
在二维空间中,齐次坐标引入了一个与 x , y x,y x,y无关的一个维度来表示二维空间中的点和向量。
- 2D point = ( x , y , 1 ) T (x,y,1)^T (x,y,1)T
- 2D vector = ( x , y , 0 ) T (x,y,0)^T (x,y,0)T
为什么区别点和向量?向量具有平移不变性(方向不变),做任何平移后不变,即向量的坐标表示的是方向。但点平移之后坐标需要发生变化。因此规定, ( x , y , w ) T = ( x / w , y / w , 1 ) T (x,y,w)^T=(x/w,y/w,1)^T (x,y,w)T=(x/w,y/w,1)T
由齐次坐标可以引出
- v + v = v v + v = v v+v=v
- p − p = v p - p = v p−p=v
- p + v = p ( 点 沿 向 量 的 方 向 移 动 向 量 模 的 大 小 ) p + v = p (点沿向量的方向移动向量模的大小) p+v=p(点沿向量的方向移动向量模的大小)
- p 1 + p 2 = p , p 是 p 1 , p 2 的 中 点 p_1 + p_2 =p,\ p是p_1,p_2的中点 p1+p2=p, p是p1,p2的中点
上述结果可以直接推广到三维空间中
- 3D point = ( x , y , z , 1 ) T (x,y,z,1)^T (x,y,z,1)T
- 3D vector = ( x , y , z , 0 ) T (x,y,z,0)^T (x,y,z,0)T
规定
(
x
,
y
,
z
,
w
)
T
=
(
x
/
w
,
y
/
w
,
z
/
w
,
1
)
T
(x,y,z,w)^T=(x/w,y/w,z/w,1)^T
(x,y,z,w)T=(x/w,y/w,z/w,1)T
使用了齐次坐标后,上面的变换都可以统一到矩阵的表示上来。
-
缩放
( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) \begin{pmatrix} s_x & 0 & 0 & 0\\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} ⎝⎜⎜⎛sx0000sy0000sz00001⎠⎟⎟⎞ -
旋转
-
绕 Z Z Z轴旋转
( c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 0 0 0 0 1 ) \begin{pmatrix} cos\alpha & -sin\alpha & 0 & 0 \\ sin\alpha & cos\alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} ⎝⎜⎜⎛cosαsinα00−sinαcosα0000100001⎠⎟⎟⎞ -
绕 X X X轴旋转
( 1 0 0 0 0 c o s α − s i n α 0 0 s i n α c o s α 0 0 0 0 1 ) \begin{pmatrix} 1 & 0 & 0 & 0\\ 0 & cos\alpha & -sin\alpha & 0\\ 0 & sin\alpha & cos\alpha & 0\\ 0 & 0 & 0 & 1 \end{pmatrix} ⎝⎜⎜⎛10000cosαsinα00−sinαcosα00001⎠⎟⎟⎞ -
绕 Y Y Y轴旋转
( c o s α 0 s i n α 0 0 1 0 0 − s i n α 0 c o s α 0 0 0 0 1 ) \begin{pmatrix} cos\alpha & 0 & sin\alpha & 0\\ 0 & 1 & 0 & 0\\ -sin\alpha & 0 & cos\alpha & 0\\ 0 & 0 & 0 & 1 \end{pmatrix} ⎝⎜⎜⎛cosα0−sinα00100sinα0cosα00001⎠⎟⎟⎞
-
-
平移
( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) \begin{pmatrix} 1 & 0 & 0 & t_x\\ 0 & 1 & 0 & t_y\\ 0 & 0 & 1 & t_z\\ 0 & 0 & 0 & 1 \end{pmatrix} ⎝⎜⎜⎛100001000010txtytz1⎠⎟⎟⎞
Rodrigues‘ Rotation Formula
view/camera transformation视图变换
什么是view transformation
view rransformation:take a photo
成像过程(MVP):model transfomation,view transformation(find a angle ),projection transformation
设照相机的三个参数,position e e e, gaze at direction g g g, up direction t t t。
视图变换的最终目的是将照相机变换到原点,向上为 Y Y Y轴,朝 − Z -Z −Z方向看。为了使变换后照相的结果不变,并且注意有若相机和物体做同样的移动,则“拍照”的结果不变。因此,视图变换将相机和物体做同样的变换。为后面的投影变换做准备。
变换过程
变换步骤:
- 将 e e e变换到原点
- 将 g g g旋转到 − Z -Z −Z轴
- 将 t t t旋转到 Y Y Y轴
- 将 ( g × t ) (g\times t) (g×t)旋转到x轴
变换公式
M
v
i
e
w
=
R
v
i
e
w
T
v
i
e
w
O
r
i
g
i
n
v
i
e
w
=
(
x
g
×
t
x
t
x
g
y
g
×
t
y
t
y
g
z
g
×
t
z
t
z
g
0
0
0
)
F
i
n
a
l
v
i
e
w
=
(
1
0
0
0
1
0
0
0
−
1
0
0
0
)
F
i
n
a
l
v
i
e
w
=
M
v
i
e
w
O
r
i
g
i
n
v
i
e
w
M_{view}=R_{view}T_{view}\\ Origin_{view} = \begin{pmatrix} x_{g\times t} & x_{t} & x_{g} \\ y_{g\times t} & y_{t} & y_{g} \\ z_{g\times t} & z_{t} & z_{g} \\ 0 & 0 & 0 \end{pmatrix}\\ Final_{view} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ 0 & 0 & 0 \end{pmatrix}\\ Final_{view}=M_{view}Origin_{view}
Mview=RviewTviewOriginview=⎝⎜⎜⎛xg×tyg×tzg×t0xtytzt0xgygzg0⎠⎟⎟⎞Finalview=⎝⎜⎜⎛1000010000−10⎠⎟⎟⎞Finalview=MviewOriginview
T
v
i
e
w
T_{view}
Tview的目的是首先将
e
e
e移动到原点,表示如下
(
1
0
0
−
x
e
1
0
0
−
x
e
1
0
0
−
x
e
0
0
0
1
)
\begin{pmatrix} 1 & 0 & 0 & -x_{e} \\ 1 & 0 & 0 & -x_{e} \\ 1 & 0 & 0 & -x_{e} \\ 0 & 0 & 0 & 1 \end{pmatrix}
⎝⎜⎜⎛111000000000−xe−xe−xe1⎠⎟⎟⎞
为了求
R
v
i
e
w
R_{view}
Rview,可以从求
R
v
i
e
w
−
1
R_{view}^{-1}
Rview−1入手,因为
R
v
i
e
w
−
1
R_{view}^{-1}
Rview−1容易看出,如下所示
R
v
i
e
w
−
1
=
(
x
g
×
t
x
t
−
x
g
0
y
g
×
t
y
t
−
y
g
0
z
g
×
t
z
t
−
z
g
0
0
0
0
1
)
=
(
x
g
×
t
x
t
x
−
g
0
y
g
×
t
y
t
y
−
g
0
z
g
×
t
z
t
z
−
g
0
0
0
0
1
)
R_{view}^{-1}=\begin{pmatrix} x_{g\times t} & x_t & -x_g & 0\\ y_{g\times t} & y_t & -y_g & 0\\ z_{g\times t} & z_t & -z_g & 0\\ 0 & 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} x_{g\times t} & x_t & x_{ -g} & 0\\ y_{g\times t} & y_t & y_{-g} & 0\\ z_{g\times t} & z_t & z_{-g} & 0\\ 0 & 0 & 0 & 1 \end{pmatrix}
Rview−1=⎝⎜⎜⎛xg×tyg×tzg×t0xtytzt0−xg−yg−zg00001⎠⎟⎟⎞=⎝⎜⎜⎛xg×tyg×tzg×t0xtytzt0x−gy−gz−g00001⎠⎟⎟⎞
显然
R
v
i
e
w
−
1
R_{view}^{-1}
Rview−1是正交矩阵,所以有
R
v
i
e
w
T
=
R
v
i
e
w
−
1
R_{view}^T=R_{view}^{-1}
RviewT=Rview−1
R
v
i
e
w
=
(
x
g
×
t
y
g
×
t
z
g
×
t
0
x
t
y
t
z
t
0
x
−
g
y
−
g
z
−
g
0
0
0
0
1
)
R_{view}=\begin{pmatrix} x_{g\times t} & y_{g\times t} & z_{g\times t} & 0\\ x_{t} & y_{t} & z_{t} & 0\\ x_{-g} & y_{-g} & z_{-g} & 0\\ 0 & 0 & 0 & 1 \end{pmatrix}
Rview=⎝⎜⎜⎛xg×txtx−g0yg×tyty−g0zg×tztz−g00001⎠⎟⎟⎞
projection transformation 投影变换
投影变换的目的是将3D物体变换到2D空间,按投影的结果可以分为正交投影和透视投影。
正交投影
摆好照相机的位置后,然后去掉各个点的 Z Z Z坐标即可得到各个物体的正交投影结果。一般做法如下
- 定义立方体的空间 [ l , r ] × [ b , t ] × [ f , n ] [l,r]\times[b,t]\times[f,n] [l,r]×[b,t]×[f,n]( n n n更靠近 z z z的正方向,所以有 f < n f < n f<n),然后试图将其映射到“canonical cube”,以原点为中心,范围是 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3的立方体。
- 变换步骤:先平移其中心到原点,然后缩放
所以变换矩阵为
M
v
i
e
w
=
S
v
i
e
w
T
v
i
e
w
S
v
i
e
w
=
(
2
r
−
l
0
0
0
0
2
t
−
b
0
0
0
0
2
n
−
f
0
0
0
0
1
)
T
v
i
e
w
=
(
1
0
0
−
l
+
r
2
0
1
0
−
b
+
t
2
1
0
1
−
f
+
n
2
0
0
0
1
)
M_{view}=S_{view}T_{view}\\ S_{view}=\begin{pmatrix} \frac{2}{r-l} & 0 & 0 & 0\\ 0 & \frac{2}{t-b} & 0 & 0\\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}\\ T_{view} = \begin{pmatrix} 1 & 0 & 0 & -\frac{l+r}{2}\\ 0 & 1 & 0 & -\frac{b+t}{2}\\ 1 & 0 & 1 & -\frac{f+n}{2}\\ 0 & 0 & 0 & 1 \end{pmatrix}
Mview=SviewTviewSview=⎝⎜⎜⎛r−l20000t−b20000n−f200001⎠⎟⎟⎞Tview=⎝⎜⎜⎛101001000010−2l+r−2b+t−2f+n1⎠⎟⎟⎞
投影变换
相比于正交变换,投影变换在计算机图形学中更加常见,也比较符合人的视觉系统。
投影变换可以使得物体达到近大远小的效果,平行线不会再保持平行,会相交于某一点。
投影变换的一般步骤为如下。投影变换是以视锥体去观察物体,而正交变换以一个长方体去观察物体。因此,我们希望先将视锥体变换到一个长方体,然后在进行正交投影即可得到透视投影的结果。如下所示
M
p
e
r
s
=
M
o
r
t
h
M
p
e
r
s
−
>
o
r
t
h
M_{pers}=M_{orth}M_{pers->orth}
Mpers=MorthMpers−>orth
视锥体的点的
X
,
Y
X,Y
X,Y轴坐标变换到长方体空间的做法是通过三角形相似。公式如下
y
′
=
n
z
y
x
′
=
n
z
x
z
′
i
s
u
n
k
n
o
w
n
y'=\frac{n}{z}y\\x'=\frac{n}{z}x\\z'\ is\ unknown
y′=znyx′=znxz′ is unknown
所以可表示如下
(
x
y
z
1
)
→
(
n
z
x
n
z
y
?
1
)
=
(
n
x
n
y
?
z
z
)
\begin{pmatrix} x\\y\\z\\1 \end{pmatrix} \to \begin{pmatrix} \frac{n}{z}x\\\frac{n}{z}y\\?\\1 \end{pmatrix} = \begin{pmatrix} nx\\ny\\?z\\z \end{pmatrix}
⎝⎜⎜⎛xyz1⎠⎟⎟⎞→⎝⎜⎜⎛znxzny?1⎠⎟⎟⎞=⎝⎜⎜⎛nxny?zz⎠⎟⎟⎞
用矩阵表示为
M
p
e
r
s
−
>
o
r
t
h
=
(
n
0
0
0
0
n
0
0
?
?
?
?
0
0
1
0
)
M_{pers->orth}=\begin{pmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ ? & ? & ? & ?\\ 0 & 0 & 1 & 0 \end{pmatrix}
Mpers−>orth=⎝⎜⎜⎛n0?00n?000?100?0⎠⎟⎟⎞
由于近平面和远平面上的点的
Z
Z
Z轴坐标依然为
n
,
f
n,f
n,f所以,矩阵可以简化为
M
p
e
r
s
−
>
o
r
t
h
=
(
n
0
0
0
0
n
0
0
0
0
A
B
0
0
1
0
)
M_{pers->orth}=\begin{pmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & A & B\\ 0 & 0 & 1 & 0 \end{pmatrix}
Mpers−>orth=⎝⎜⎜⎛n0000n0000A100B0⎠⎟⎟⎞
同时,有以下两个条件
(
0
0
n
1
)
→
(
0
0
n
2
n
)
,
(
0
0
f
1
)
→
(
0
0
f
2
f
)
\begin{pmatrix} 0\\ 0 \\ n\\ 1 \end{pmatrix} \to \begin{pmatrix} 0\\ 0 \\ n^2\\ n \end{pmatrix}, \begin{pmatrix} 0\\ 0 \\ f\\ 1 \end{pmatrix} \to \begin{pmatrix} 0\\ 0 \\ f^2\\ f \end{pmatrix}
⎝⎜⎜⎛00n1⎠⎟⎟⎞→⎝⎜⎜⎛00n2n⎠⎟⎟⎞,⎝⎜⎜⎛00f1⎠⎟⎟⎞→⎝⎜⎜⎛00f2f⎠⎟⎟⎞
所以有
A
n
+
B
=
n
2
A
f
+
B
=
f
2
.
An+B=n^2\\ Af+B=f^2.
An+B=n2Af+B=f2.
解得
A
=
n
+
f
,
B
=
−
n
f
A = n+f,B=-nf
A=n+f,B=−nf
所以有
M
p
e
r
s
−
>
o
r
t
h
=
(
n
0
0
0
0
n
0
0
0
0
n
+
f
−
n
f
0
0
1
0
)
M_{pers->orth}=\begin{pmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0 \end{pmatrix}
Mpers−>orth=⎝⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎞