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 |