Technology Matrix - chaolunner/CloudNotes GitHub Wiki

矩阵乘法

矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。

  • 当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。
  • 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
  • 乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

Unity 中的4X4矩阵

  • 平移矩阵

    在三维齐次坐标表示中,任意点P = (x, y, z)通过将平移距离tx、ty和tz,加到P的坐标上而平移到位置P’= (x’, y’, z’)

    x’= x + tx, y’= y + ty,z’= z + tz

    用齐次矩阵表示为:

    | 1 0 0 tx | | x |   | x + tx |
    | 0 1 0 ty | | y | = | y + ty |
    | 0 0 1 tz | | z |   | z + tz |
    | 0 0 0 1  | | 1 |   | 1      |
    
  • 缩放矩阵

    | kx 0 0 0 | | x |   | kx * x |
    | 0 ky 0 0 | | y | = | ky * y |
    | 0 0 kz 0 | | z |   | kz * z |
    | 0 0 0  1 | | 1 |   | 1      |
    

    如果kx=ky=kz,则称为是统一缩放。否则称为非统一缩放。

  • 为什么模型的变换是4X4而不是3X3的矩阵变换?

    从上面的平移矩阵和缩放矩阵,我们不难看出,如果我们对模型先缩放再平移,那么3X3矩阵是不够的,所以采用多一维的扩充矩阵来实现平移。

  • 旋转矩阵

    我们在处理旋转时可以绕任何轴旋转,但是绕平行于坐标轴的轴旋转时最容易的,现在我们来处理绕z轴旋转,旋转的表达式为:

    https://github.com/chaolunner/CloudNotes/wiki/Images/Technology/matrix-rotation.png

    x' = ( cosθ, sinθ)
    y' = (-sinθ, cosθ)
    
    x' =  xcosθ + ysinθ
    y' = -xsinθ + ycosθ
    z' =  z
    

    参数θ是绕Z轴的旋转角度,写成矩阵形式为:

    | cosθ  sinθ 0 0 | | x |   |  xcosθ + ysinθ |
    | -sinθ cosθ 0 0 | | y | = | -xsinθ + ycosθ |
    | 0     0    1 0 | | z |   |  z             |
    | 0     0    0 1 | | 1 |   |  1             |
    

    绕Y轴旋转则是:

    | cosθ  0 sinθ 0 | | x |   |  xcosθ + zsinθ |
    | 0     1    0 0 | | y | = |  y             |
    | -sinθ 0 cosθ 0 | | z |   | -xsinθ + zcosθ |
    | 0     0    0 1 | | 1 |   |  1             |
    

    绕X轴旋转则是:

    | 1  0    0    0 | | x |   |  x             |
    | 0  cosθ sinθ 0 | | y | = |  ycosθ + zsinθ |
    | 0 -sinθ cosθ 0 | | z |   | -ysinθ + zcosθ |
    | 0  0    0    1 | | 1 |   |  1             |