【从 0 上路图形学】变换(Transformation)

216 阅读2分钟

本文是Games101 Lecture 03的学习笔记

变换的种类

  • 模型变换(Modeling):例如摄像机在空间中的移动,机器人模型关节的移动
  • 视图变换(Viewing):例如从 3D 到 2D 的变换,投影(Projection)

2D 上的变换

  • 缩放变换(Scale)

\begin{pmatrix}           x\prime \           y\prime \         \end{pmatrix}         =         \begin{pmatrix}           s_x & 0 \           0 & s_y \         \end{pmatrix}         \begin{pmatrix}         x \         y \         \end{pmatrix}

  • 对称变换(Reflection)

\begin{pmatrix}           x\prime \           y\prime \         \end{pmatrix}         =         \begin{pmatrix}           -1 & 0 \           0 & 1 \         \end{pmatrix}         \begin{pmatrix}         x \         y \         \end{pmatrix}

  • 错切变换(Sheer)

\begin{pmatrix}           x\prime \           y\prime \         \end{pmatrix}         =         \begin{pmatrix}           1 & a \           0 & 1 \         \end{pmatrix}         \begin{pmatrix}         x \         y \         \end{pmatrix}

  • 旋转变换(Rotation) 这里可以找两个特殊点来验证,设旋转的角度为 \theta(1, 0)经旋转后 (cos\theta, sin\theta)(0, 1)经旋转后 (-sin\theta, cos\theta)

\begin{pmatrix}           x\prime \           y\prime \         \end{pmatrix}         =         \begin{pmatrix}           cos\theta & -sin\theta \           sin\theta & cos\theta \         \end{pmatrix}         \begin{pmatrix}         x \         y \         \end{pmatrix}

  • 平移变换及齐次坐标(Homogenous Coordinates) 因为平移变换无法用普通的矩阵形式表示,但我们又想只用一次矩阵乘法来表示,所以需要引入齐次坐标。

\begin{pmatrix}           x\prime \           y\prime \           w\prime \         \end{pmatrix}         =         \begin{pmatrix}           1 & 0 & t_x \           0 & 1 & t_y \           0 & 0 & 1   \         \end{pmatrix}         \begin{pmatrix}           x \           y \           1 \         \end{pmatrix}         =         \begin{pmatrix}           x + t_x \           y + t_y \           1 \         \end{pmatrix}

值得一提的是,2D 上的一个点用齐次坐标表示为

\begin{pmatrix} x & y & 1 \end{pmatrix}^\top

而 2D 上的一个向量用齐次坐标表示为

\begin{pmatrix} x & y & 0 \end{pmatrix}^\top

关于点和向量在 w 坐标的值,可以这样理解

  1. vector + vector = vector(向量和向量相加根据平行四边形法则得到另一个向量,0 + 0 = 0)
  2. point - point = vector(一个点减去另一个点得到一个向量,1 - 1 = 0)
  3. vector + point = point(向量和一个点相加得到另一个点,相当于将该点按向量方向平移,1 + 0 = 1)
  4. point + point = point(点和点相加得到另一个点,并且为中点,1 + 1 = 2)
  • 逆变换(Inverse Transform) 逆变换等价于线性代数中对矩阵求逆 M^{-1}

变换的组合

将多个变换的矩阵相乘,可以得到一个组合后的矩阵。但是要注意,变化的顺序不同,得到的结果可能也不相同。合理地将一个陌生的变换拆分成我们熟悉的上述几种变换是解决复杂变换的基本思路。举个🌰,我们要以正方形任意一个顶点为原点进行旋转,可以先将那一点平移到原点,旋转完后再平移回去。

T(C) * R(\alpha) * T(-C)

三D空间

变化和 2D 下的类似,在齐次坐标系下,可以认为 \begin{pmatrix}    x & y & z & 1 \end{pmatrix}^T\begin{pmatrix} x * w & y * w & z * w & w \end{pmatrix}^T 表示的是同一个点。基于此定理可以推导下为什么上文中提到的两个点相加得到的是中点~