Games101----Transformation(2)

1. V i e w / C a m e r a    T r a n s f o r m a t i o n View/Camera \space\space Transformation View/Camera  Transformation

1.1 什么是 v i e w    t r a n s f o r m a t i o n ? view \space\space transformation? view  transformation?

  • 想象一下如何拍照
    • 找一个好的地方,安排好人的站位、姿势等( m o d e l    t r a n s f o r m a t i o n model \space\space transformation model  transformation)
    • 找一个好的拍照“角度”( v i e w    t r a n s f o r m a t i o n view \space\space transformation view  transformation)
    • 茄子!( p r o j e c t i o n    t r a n s f o r m a t i o n projection \space\space transformation projection  transformation)

1.2 如何实现一个 v i e w    t r a n s f o r m a t i o n ? view \space\space transformation? view  transformation

  • 首先定义一个相机
    • Position: e ⇀ ; \overrightharpoon{e}; e ;
    • Look-at/gaze direction: g ˆ ; \text{\^{g}}; gˆ;
    • Up direction: t ⇀ \overrightharpoon{t} t .
      在这里插入图片描述
  • 关键点:如果所有的物体跟着相机以相同的方式一起移动,拍摄出来的照片不变。
    在这里插入图片描述
  • 根据上一点,我们永远可以把相机变换到
    • 位置在原点,up direction为Y轴正向,look at -Z方向;如下图所示。
    • 而其他物体跟着相机一起移动。
      在这里插入图片描述
  • 假设将相机变换到“位置在原点,up direction为 Y Y Y轴正向,look at − Z -Z Z方向”的变换矩阵为 M v i e w M_{view} Mview,则 M v i e w M_{view} Mview要实现:
    • 移动 e ⇀ \overrightharpoon{e} e 到原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0);
    • g ⇀ \overrightharpoon{g} g 旋转到 − Z -Z Z;
    • t t t旋转到 Y Y Y.

很明显,直接写出来非常困难!!!

  • 换一种思路,将 M v i e w M_{view} Mview变成几种变换的组合形式,即先将相机平移到原点,然后再旋转到指定的形式,有 M v i e w = R v i e w T v i e w M_{view}=R_{view}T_{view} Mview=RviewTview. 现在变成求 R v i e w R_{view} Rview T v i e w T_{view} Tview.
    • T v i e w T_{view} Tview,很明显有:
      T v i e w = [ 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ] . T_{view}=\begin{bmatrix}1 & 0 & 0 & -x_e \\ 0 & 1 & 0 & -y_e \\ 0 & 0 & 1 & -z_e \\ 0 & 0 & 0 & 1 \end{bmatrix}. Tview=100001000010xeyeze1.
    • R v i e w R_{view} Rview,可以考虑反向的旋转,即: X → g × t X \rightarrow g \times t Xg×t, Y → t Y \rightarrow t Yt, Z → − g Z \rightarrow -g Zg
      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 ] . R_{view}^{-1}=\begin{bmatrix}x_{\text{\^{g}}\times \text{\^{t}}} & x_t & x_{-g} & 0 \\ y_{\text{\^{g}}\times \text{\^{t}}} & y_t & y_{-g} & 0 \\ z_{\text{\^{g}}\times \text{\^{t}}} & z_t & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}. Rview1=xgˆ×tˆygˆ×tˆzgˆ×tˆ0xtytzt0xgygzg00001.
      由于旋转矩阵的逆就是旋转矩阵的转置,从而可求得:
      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{bmatrix}x_{\text{\^{g}}\times \text{\^{t}}} & y_{\text{\^{g}}\times \text{\^{t}}} & z_{\text{\^{g}}\times \text{\^{t}}} & 0 \\ x_t & y_t & z_t & 0 \\ x_{-g} & y_{-g} & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}. Rview=xgˆ×tˆxtxg0ygˆ×tˆytyg0zgˆ×tˆztzg00001.

1.3 旋转矩阵的逆就是旋转矩阵的转置的简单证明

以二维为例,旋转 θ \theta θ角的旋转矩阵为:
R θ = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] . R_{\theta}=\begin{bmatrix}\cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}. Rθ=[cosθsinθsinθcosθ].
其逆变换为反向旋转 θ \theta θ角,即旋转 − θ -\theta θ角:
R − θ = [ cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ] . R_{-\theta}=\begin{bmatrix}\cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}. Rθ=[cosθsinθsinθcosθ].
显然,有:
R − θ = R θ T . R_{-\theta}=R_{\theta}^T. Rθ=RθT.

2. 投影变换( P r o j e c t i o n    T r a n s f o r m a t i o n Projection \space\space Transformation Projection  Transformation)

  • 从3D到2D的变换
  • 正交投影(Orthographic Transformation)
  • 透视投影(Perspective Transformation)

2.1 正交投影和透视投影的对比

在这里插入图片描述
在这里插入图片描述

2.2 正交投影

  • 更容易理解正交投影的方式
    • 将摄像机放置在原点,对着 − Z -Z Z轴,向着 Y Y Y轴,是不是很熟悉?
    • 丢掉Z坐标
    • 通过平移和缩放操作,使得最终的显示范围为 [ − 1 , 1 ] 2 . [-1, 1]^2. [1,1]2.
      在这里插入图片描述
  • 我们需要将立方体 [ l , r ] × [ b , t ] × [ f , n ] [l,r] \times [b,t] \times [f,n] [l,r]×[b,t]×[f,n]映射到标准的立方体 [ − 1 , 1 ] 3 [-1,1]^3 [1,1]3上。
    • 先平移,将立方体的中心平移到原点为止;
    • 再缩放到标准立方体的大小;
    • 如下图所示。
      在这里插入图片描述
  • 求变换矩阵
    • 先平移,即将立方体中心点 ( ( r + l ) / 2 , ( t + b ) / 2 , ( n + f ) / 2 ) ((r+l)/2, (t+b)/2, (n+f)/2) ((r+l)/2,(t+b)/2,(n+f)/2)平移到原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),其平移矩阵为 [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] ; \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1\end{bmatrix}; 1000010000102r+l2t+b2n+f1;
    • 后缩放,缩放矩阵为 [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] ; \begin{bmatrix} \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{bmatrix}; rl20000tb20000nf200001;
    • 因此,变换矩阵为
      M o r t h o = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] . M_{ortho}=\begin{bmatrix} \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{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1\end{bmatrix}. Mortho=rl20000tb20000nf2000011000010000102r+l2t+b2n+f1.
    • 警告:由于是指向 − Z -Z Z轴, n n n f f f的大小不太符合直觉。

2.3 透视投影

  • 在计算机图形学、艺术和视觉系统更为常见;
  • 呈现出近大远小的特点;
  • 平行线不平行;收敛于某一点。
    在这里插入图片描述
  • 如何做透视投影
    • 首先,先将平截头体“挤成”一个立方体 ( n → n , f → f ) , ( M p e r s p → o r t h o ) (n \rightarrow n, f \rightarrow f), (M_{persp \rightarrow ortho}) (nn,ff),(Mpersportho),如下图;
    • 然后再进行正交变换(见上节的内容)。
      在这里插入图片描述
    • 为了得出变换,参考下图,找出变换后的点 ( x ′ , y ′ , z ′ ) (x', y',z') (x,y,z)和原来的点 ( x , y , z ) (x,y,z) (x,y,z)之间的关系;
      在这里插入图片描述
      从而有: y ′ = n z y , x ′ = n z x . y'=\frac{n}{z}y,x'=\frac{n}{z}x. y=zny,x=znx.

用齐次坐标表示就是:
[ x y z 1 ] ⇒ [ n x / z n y / z u n k n o w n 1 ] = = [ n x n y u n k n o w n z ] \begin{bmatrix} x \\ y \\ z \\ 1\end{bmatrix}\Rightarrow \begin{bmatrix} nx/z \\ ny/z \\ unknown \\ 1\end{bmatrix}==\begin{bmatrix} nx \\ ny \\ unknown \\ z\end{bmatrix} xyz1nx/zny/zunknown1==nxnyunknownz

  • 因此,有:
    M p e r s p → o r t h o ( 4 × 4 ) [ x y z 1 ] = [ n x n y u n k n o w n z ] M_{persp \rightarrow ortho}^{(4 \times 4)}\begin{bmatrix} x \\ y \\ z \\ 1\end{bmatrix}=\begin{bmatrix} nx \\ ny \\ unknown \\ z\end{bmatrix} Mpersportho(4×4)xyz1=nxnyunknownz
  • 从而,可以求得部分的 M p e r s p → o r t h o M_{persp \rightarrow ortho} Mpersportho:
    M p e r s p → o r t h o = [ n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ] . M_{persp \rightarrow ortho}=\begin{bmatrix}n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ ? & ? & ? & ? \\ 0 & 0 & 1 & 0 \end{bmatrix}. Mpersportho=n0?00n?000?100?0.
  • 如何求第三行的值?
  • 通过观察,第三行负责 z ′ z' z值:
    • 近平面上的任意一点不会改变;
    • 远平面上任意一点的 z z z值不会改变。
  • 近平面上的任意一点不会改变
    在这里插入图片描述
    所以,第三行必定是 ( 0 , 0 , A , B ) (0,0,A,B) (0,0,A,B)的形式(否则,必定包含有 x x x或者 y y y的项),从而有:
    A n + B = n 2 (1) \tag{1}An+B=n^2 An+B=n2(1)
  • 远平面上任意一点的 z z z值不会改变
    在这里插入图片描述
    (隐约记得, x x x y y y 0 0 0替代是因为第三行前两项为 0 0 0)。
    由上图,有:
    A f + B = f 2 (2) \tag{2}Af+B=f^2 Af+B=f2(2)
    联立 ( 1 ) ( 2 ) (1)(2) (1)(2)求解可得:
    { A = n + f B = − n f \begin{cases} A=n+f \\ B=-nf\end{cases} {A=n+fB=nf
  • 所以
    M p e r s p → o r t h o = [ n 0 0 1 0 n 0 0 0 0 n + f − n f 0 0 0 1 ] . M_{persp \rightarrow ortho}=\begin{bmatrix}n & 0 & 0 & 1 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 0 & 1 \end{bmatrix}. Mpersportho=n0000n0000n+f010nf1.
    最终的 M p e r s p = M o r t h o M p e r s p → o r t h o . M_{persp}=M_{ortho}M_{persp \rightarrow ortho}. Mpersp=MorthoMpersportho. 即:
    M p e r s p = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] [ n 0 0 1 0 n 0 0 0 0 n + f − n f 0 0 0 1 ] . M_{persp}=\begin{bmatrix} \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{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1\end{bmatrix}\begin{bmatrix}n & 0 & 0 & 1 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 0 & 1 \end{bmatrix}. Mpersp=rl20000tb20000nf2000011000010000102r+l2t+b2n+f1n0000n0000n+f010nf1.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值