四、变换2:三维变换

4.0 有关旋转的补充

旋转矩阵的逆 == 旋转矩阵的转置 ==> 旋转矩阵为正交矩阵 $$ R_{}= ( \[\begin{matrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{matrix}\]

) \

R_{-}= ( \[\begin{matrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{matrix}\]

) =R_{}^T \

R_{-}=R_^{-1} $$

正交矩阵:\(R^T=R^{-1}\)

4.1 3D Transformations

4.4.1 齐次坐标

  1. 3维点:\((x,y,z,1)^T\)
  2. 3维点的补充形式:\((x,y,z,w)^T\)\((\frac{x}{w},\frac{y}{w},\frac{z}{w},1)^T\)等价
  3. 3维向量:\((x,y,z,0)^T\)

4.4.2 仿射变换

Affine Transform

  1. 变换的顺序:先线性变换,后加平移

image-20220812113815122

4.4.2.1 缩放

image-20220812113919856

4.4.2.2 平移

image-20220812113927686

4.4.2.3 旋转

4.4.2.3.1 绕坐标轴旋转
  1. 绕X轴:X不变,YZ旋转

    image-20220812114205936

  2. 绕Y轴:Y不变,ZX旋转

    image-20220812114238231

  3. 绕Z轴:Z不变,XY旋转

    image-20220812114220868

4.4.2.3.2 绕任意过原点的轴旋转

有两种形式:欧拉角、四元数

  1. 四元数:多应用于旋转的插值操作
  1. 绕任意轴旋转:分解为欧拉角

    1. 将任意轴方向的旋转,分解为绕X、Y、Z轴的旋转:\(R_{x,y,z}(\alpha,\beta,\gamma)\)
    2. \(\alpha,\beta,\gamma\)也被称为欧拉角

    image-20230226070451531

  2. Rodrigues’ Rotation Formula 罗德里格旋转公式

    1. 向量v绕过原点的轴n旋转\(\alpha\)
    2. 向量I为向量v方向的单位向量

    image-20230226070549341

推导思路:

  1. vn垂直时,\(\vec{v'}=\cos\alpha*\vec{v}+\sin\alpha*(\vec{n}×\vec{I})\)

  2. vn不垂直时,将v分解为 垂直于n的向量v 和平行于n的向量v

    1. \(\vec{v_∥'}=\vec{v_∥}=|\vec{v}|*cos<\vec{v},\vec{n}>=\vec{v}·\vec{n}·\vec{n}\)
    2. \(\vec{v_⊥}=\vec{v}-\vec{v_∥}=\vec{v}-\vec{v}·\vec{n}·\vec{n}\)
    3. \(\vec{v_⊥'}=\cos\alpha*\vec{v_⊥}+\sin\alpha*(\vec{n}×\vec{v_⊥})\)
    4. 综上可得:\(\vec{v'}=\vec{v_∥'}+\vec{v_⊥'}=\cos\alpha*\vec{v}+(1-\cos\alpha)*\vec{v}·\vec{n}·\vec{n}+\sin\alpha*(\vec{n}×\vec{v})\)
  3. 矩阵形式:\(\vec{v'}=\cos\alpha*\vec{v}+(1-\cos\alpha)*\vec{v}·\vec{n}·\vec{n}+\sin\alpha*(\vec{n}×\vec{v})\)$

    \(=[\cos\alpha*\vec{I}+(1-\cos\alpha)*\vec{n}·\vec{n}^T+\sin\alpha*(\vec{n}×\vec{I})]·\vec{v}\)

4.4.2.3.2 绕过任意点的任意轴旋转

绕过任意轴n旋转\(\alpha\)

  1. 先将轴平移至过原点
  2. 然后旋转
  3. 最后平移回去

4.2 Model & View Transformation

4.2.1 什么是视图变换

  1. 与照相类比:MVP变换
照相 对应变换
找一个好的地方、人物排列 模型变换 model transformation
找一个好的角度放置摄像机 视图变换 view transformation
拍照,三维空间投影到二维平面 投影变换 projection transformation

4.2.2 定义Camera

  1. 位置Position\(\vec{e}\)
  2. 往哪看Look-at/gaze direction\(\vec{g}\)
  3. 向上方向Up direction\(\vec{t}\)

image-20220812123220752

4.2.3 关键点:相机与物体的相对位置决定看到的图像

  1. 只要摄像机物体的相对位置一样,所看到的图形就是一样的

    image-20220812123524813
  2. 将摄像机永远放在一个标准的位置

    1. Position:原点
    2. Up direction:Y轴
    3. Look-at direction:-Z轴
  3. 当相机变换时,将物体随着相机变换

4.2.4 将相机移动到标准位置

  1. 方法

    1. \(\vec{e}\)平移到原点
    2. 旋转 \(\vec{g}\)-Z的方向
    3. 旋转 \(\vec{t}\)Y的方向
    4. 旋转 \(\vec{g}×\vec{t}\)X方向
  2. 矩阵表示:设\(M_{view}=R_{view}T_{view}\)

    1. \(\vec{e}\)平移到原点

      image-20220812164249448

    2. 旋转 \(\vec{g}\)-Z\(\vec{t}\)Y\(\vec{g}×\vec{t}\)X:考虑逆矩阵

      image-20220812164531901

4.2.5 总结

  1. 将物体与相机一起旋转:Model Transformation ==> \(M_{model}\)
  2. 将相机变换到标准位置:View Transformation ==> \(M_{view}\)
    1. Position:原点
    2. Up direction:Y轴
    3. Look-at direction:-Z轴

4.3 Projection Transformation

  1. 正交投影 Orthographic Projection:不存在近大远小
  2. 透视投影 Perspective Projection:存在近大远小,平行线不再平行

image-20220812165450522

4.3.1 正交投影

Orthographic Projection

  1. 思想:直接扔掉物体的Z坐标,然后将其移动到[-1,1]的标准范围内
  1. 实际做法:将一个立方体\([l, r]×[b, t]×[f, n]\)映射到标准立方体\([-1, 1]^3\)

    1. 首先,通过平移操作,将立方体的中心移到原点
    2. 然后,通过缩放操作,将立方体缩放为标准立方体
    3. 立方体的定义:X轴\([l,r]\);Y轴\([b,t]\);Z轴\([f,n]\)
    4. 变换之后,物体一定会有拉伸

    image-20220812170410007

  2. 变换矩阵:先平移到原点,再将\(x,y,z\)缩放到\(2\)

    $$ M_{ortho}= (

    \[\begin{matrix} \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{matrix}\]

    )

    (

    \[\begin{matrix} 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{matrix}\]

    )

    = (

    \[\begin{matrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1 \\ \end{matrix}\]

    ) $$

4.3.2 透视投影

Perspective Projection

  1. 基础知识:\((x,y,z,1)\)\((kx,ky,kz,k)\)表示同一个点,因此\((xz,yz,z^2,z)\)表示的也是这个点
  2. 思想:将透视投影转化为正交投影\(M_{persp->ortho}\),然后再进行正交投影变换\(M_{ortho}\)

4.3.2.1 如何进行透视投影

image-20220812171751431

  1. 首先,定义从相机点向外的两个平面n、ff平面要比n平面大
  2. 此时就相当于f平面上的点全部投影到n平面上
  3. 透视投影的做法
    1. 先将Frustum挤成Cuboid(\(n \rightarrow n,f \rightarrow f'\)),满足如下三个定义:\(M_{persp->ortho}\)
      1. 近平面\(n\)永远不变
      2. 远平面\(f\)的Z值永远不变
      3. 远平面\(f\)的中心点\((0,0,f)\)永远不变
    2. 再进行一次正交投影:\(M_{ortho}\)

4.3.2.2 计算矩阵\(M_{persp->ortho}\)

  1. 思路:找到变换后的点\((x',y',z')\)与原来的点\((x,y,z)\)的对应关系

  2. 从YZ平面上看,挤压前后存在相似三角形,从而可得到\(y'=\frac{n}{z}*y\)

    1. 同理,\(x'=\frac{n}{z}*x\)

    image-20220812172142284

  3. 齐次坐标表示

    image-20220812172516140

  4. 矩阵表示

    由3得 image-20220812172528972
    因此 image-20220812172545755
  5. 对于矩阵的第三行(对于Z值),有以下性质

    在近平面上的点,坐标不变
    image-20220812173013770
    image-20220812173047212
    image-20220812173249005
    在远平面上的中心点\((0,0,f)\),坐标不变
    image-20220812173205858
    根据两个等式,可以解出\(A,B\)
    image-20220812173341348
  6. 综上 \[ M_{persp \rightarrow ortho}= \left( \begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0 \\ \end{matrix} \right) \]

  7. 最后,再进行正交投影:\(M_{persp}=M_{ortho}M_{persp->ortho}\)

$$ M_{persp}= ( \[\begin{matrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1 \\ \end{matrix}\]

)

( \[\begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0 \\ \end{matrix}\]

)

=

( \[\begin{matrix} \frac{2n}{r-l} & 0 & -\frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & -\frac{t+b}{t-b} & 0 \\ 0 & 0 & \frac{n+f}{n-f} & -\frac{2nf}{n-f} \\ 0 & 0 & 1 & 0 \\ \end{matrix}\]

) $$

4.3.3.3 对于不在近/远平面上的点

$$ ( \[\begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0 \\ \end{matrix}\]

)

( \[\begin{matrix} x \\ y \\ z \\ 1 \\ \end{matrix}\]

)

( \[\begin{matrix} nx \\ ny \\ (n+f)z-nf \\ z \\ \end{matrix}\]

)

==> ( \[\begin{matrix} \frac{n}{z}x \\ \frac{n}{z}y \\ (n+f)-\frac{nf}{z} \\ 1 \\ \end{matrix}\]

) $$

  1. 近平面上的点\((z=n)\)
    1. \(z'=(n+f)-\frac{nf}{n}=n\)
    2. \(z'=z\)
  2. 远平面上的点\((z=f)\)
    1. \(z'=(n+f)-\frac{nf}{f}=f\)
    2. \(z'=z\)
  3. 不在近/远平面上的点\((f<z<n)\)
    1. \(z'=(n+f)-\frac{nf}{z}\)
      1. \(n=1,f=-1,z=0.5\),则\(z'=2\)
      2. \(n=1,f=-1,z=-0.5\),则\(z'=-2\)
    2. 可得:若\(z<0\),则\(z'\)更靠近远平面\(f\);若\(z>0\),则\(z'\)更靠近近平面\(n\)

4.3.3.4 定义视锥

定义一个视锥,需要

  1. 宽高比:Aspect ratio
  2. 垂直的可视角度:Vertical Field of View

image-20220813112938428

  1. Aspect ratio 纵横比\(\frac{width}{height}\)

  2. field-of-view(fovY)视野:从摄像机所在位置出发,连接屏幕宽的两个中点,两条线所夹的角度

  3. fovYAspect推出l, r, b, t

    image-20220813113243520