计算机图形学 变换

变换 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 pp=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, pp1,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α00sinα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α00sinα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α0sinα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×t0xtytzt0xgygzg0Finalview=100001000010Finalview=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} 111000000000xexexe1
为了求 R v i e w R_{view} Rview,可以从求 R v i e w − 1 R_{view}^{-1} Rview1入手,因为 R v i e w − 1 R_{view}^{-1} Rview1容易看出,如下所示
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} Rview1=xg×tyg×tzg×t0xtytzt0xgygzg00001=xg×tyg×tzg×t0xtytzt0xgygzg00001
显然 R v i e w − 1 R_{view}^{-1} Rview1是正交矩阵,所以有 R v i e w T = R v i e w − 1 R_{view}^T=R_{view}^{-1} RviewT=Rview1
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×txtxg0yg×tytyg0zg×tztzg00001

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=rl20000tb20000nf200001Tview=1010010000102l+r2b+t2f+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} xyz1znxzny?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} 00n100n2n,00f100f2f
所以有
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+f100nf0

猜你喜欢

转载自blog.csdn.net/NelsonCheung/article/details/109088130