【GAMES101现代计算机图形学入门笔记】Lec03 变换

Lec03 变换

文章目录

为什么学习变换

  • 模型变换(Modeling):Translation/Rotation/Scaling
  • 视图变换(Viewing):3D-to-2D projection

2D变换

线性变换(Linear Transforms)

线性变化 = 同维度矩阵

[ x ′ y ′ ] = [ a b c d ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} a&b\\ c&d \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′​]=[ac​bd​][xy​]

x ′ = M x \bold{x^{\prime}}=\bold{M}\bold{x} x′=Mx

  1. 缩放(Scale): [ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} s_x&0\\ 0&s_y \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′​]=[sx​0​0sy​​][xy​](记作 S s x , s y S_{s_x,s_y} Ssx​,sy​​)

  2. 反射(Reflection): [ x ′ y ′ ] = [ − 1 0 0 1 ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} -1&0\\ 0&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′​]=[−10​01​][xy​](以y轴为对称轴)

  3. 切变(Shear): [ x ′ y ′ ] = [ 1 a 0 1 ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} 1&a\\ 0&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′​]=[10​a1​][xy​]

【GAMES101现代计算机图形学入门笔记】Lec03 变换

千层饼被推了一下:越往上变化越多)

  1. 旋转(Rotate): [ x ′ y ′ ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} \cos\theta&-\sin\theta\\ \sin\theta&\cos\theta \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′​]=[cosθsinθ​−sinθcosθ​][xy​](记作 R ( α ) R(\alpha) R(α))

    特殊点:
    【GAMES101现代计算机图形学入门笔记】Lec03 变换

    这里的旋转,默认绕原点逆时针(CCW)旋转

非线性变换

平移(Translation): x ′ = x + t x x^{\prime}=x+t_x x′=x+tx​, y ′ = y + t y y^{\prime}=y+t_y y′=y+ty​(记作 T t x , t y T_{t_x,t_y} Ttx​,ty​​)无法写成矩阵形式!!所以平移不是线性变换

Is there a unified way to represent all transformations?

齐次坐标(Homogeneous Coodinate)

上述问题的解决方案就是齐次坐标

加入第三个坐标(w-coodinate):

  • 2D point = ( x , y , 1 ) ⊤ (x,y,1)^{\top} (x,y,1)⊤
  • 2D vector = ( x , y , 0 ) ⊤ (x,y,0)^{\top} (x,y,0)⊤

平移变换的矩阵形式:
[ x ′ y ′ w ′ ] = [ 1 0 t x 0 1 t y 0 0 1 ] [ x y w ] = [ x + t x y + t y w ] \begin{bmatrix} x^{\prime}\\y^{\prime}\\w^{\prime} \end{bmatrix}= \begin{bmatrix} 1&0&t_x\\ 0&1&t_y\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\w \end{bmatrix}= \begin{bmatrix} x+t_x\\y+t_y\\w \end{bmatrix} ⎣⎡​x′y′w′​⎦⎤​=⎣⎡​100​010​tx​ty​1​⎦⎤​⎣⎡​xyw​⎦⎤​=⎣⎡​x+tx​y+ty​w​⎦⎤​
解释:对于点,平移后坐标改变,故 w w w为1,保持 t x , t y t_x,t_y tx​,ty​的效用;而对于向量,由于具有平移不变性,所以 w w w为0,消除了 t x , t y t_x,t_y tx​,ty​的效用。

0和1背后的深层次原因:

  • vector ± \pm ± vector = vector

  • point ± \pm ± vector = point

  • point - point = vector

  • point + point = middle point (w adds up to 2)

    因为在齐次坐标系中, [ x y w ] i s   t h e   2 D   p o i n t [ x / w y / w 1 ] , w ≠ 0 \begin{bmatrix} x\\y\\w \end{bmatrix} {\rm is\ the\ 2D\ point} \begin{bmatrix} x/w\\y/w\\1 \end{bmatrix},w\neq0 ⎣⎡​xyw​⎦⎤​is the 2D point⎣⎡​x/wy/w1​⎦⎤​,w​=0

仿射变换(Affine Transformation)

仿射映射 = 线性映射 + 平移

[ x ′ y ′ ] = [ a b c d ] [ x y ] + [ t x t y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} a&b\\ c&d \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}+ \begin{bmatrix} t_x\\t_y \end{bmatrix} [x′y′​]=[ac​bd​][xy​]+[tx​ty​​]

用齐次坐标表示(囊括了所有变换):
[ x ′ y ′ 1 ] = [ a b t x c d t y 0 0 1 ] [ x y 1 ] \begin{bmatrix} x^{\prime}\\y^{\prime}\\1 \end{bmatrix}= \begin{bmatrix} a&b&t_x\\ c&d&t_y\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix} ⎣⎡​x′y′1​⎦⎤​=⎣⎡​ac0​bd0​tx​ty​1​⎦⎤​⎣⎡​xy1​⎦⎤​

变换操作

  • 逆变换(Inverse transformation): M − 1 M^{-1} M−1

  • 组合变换(Composite transformation):注意顺序!后执行的变换矩阵放在最前端,也即:变换矩阵是从右往左执行的

    当然,我们也可以提前把多个矩阵相乘,得到一个组合变换矩阵。

【GAMES101现代计算机图形学入门笔记】Lec03 变换
  • 变换分解(Decomposing complex transforms):

    例:如何将物体绕给定的一点 c \bold{c} c旋转?

【GAMES101现代计算机图形学入门笔记】Lec03 变换

变换矩阵: T ( c ) ⋅ R ( α ) ⋅ T ( − c ) \bold{T(c)}\cdot\bold{R(\alpha)}\cdot\bold{T(-c)} T(c)⋅R(α)⋅T(−c)

上一篇:Numpy中的tile函数


下一篇:【GAMES101学习笔记】04 - 视图变换