变换 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⎠⎟⎟⎞