基本的矩阵变换:旋转、平移、缩放
基本的矩阵变换:旋转、平移、缩放
矩阵变换时,一定要注意以下三点:
所使用的向量是行向量还是列向量。
- 如果是行向量,按照数学领域中矩阵相乘的规则,向量要放在左侧相乘。
- 如果是列向量,向量要放在右侧相乘。
矩阵是
行主序
还是列主序
。- 如果是行主序,内存存储矩阵的数组的前四个元素表示的是对应数学矩阵的
第一行
- 如果是列主序,内存存储矩阵的数组的前四个元素表示的是对应数学矩阵的
第一列
- 如果是行主序,内存存储矩阵的数组的前四个元素表示的是对应数学矩阵的
多个矩阵变换时的相乘顺序。
- 在多个矩阵变换时,不同的相乘顺序会导致不同的结果,所以我们要保证矩阵相乘的顺序是我们期望的。假设有三个变换矩阵:旋转矩阵 R,平移矩阵 T,缩放矩阵 S,以及顶点向量 P,那么 P 变换到 P1 的顺序一般是这样的: ( 先
缩放
,再旋转
,最后平移
。 )
- 在多个矩阵变换时,不同的相乘顺序会导致不同的结果,所以我们要保证矩阵相乘的顺序是我们期望的。假设有三个变换矩阵:旋转矩阵 R,平移矩阵 T,缩放矩阵 S,以及顶点向量 P,那么 P 变换到 P1 的顺序一般是这样的: ( 先
$$
P1 = T \times R \times S \times P
$$
行主序和列主序
行主序指矩阵在内存中逐行存储,列主序指矩阵在内存中逐列存储。
行主序矩阵内存布局:
列主序矩阵内存布局:( GLSL/webgl/cesium 中默认是使用列主序存储矩阵的 )
左乘和右乘
向量右乘矩阵
$$
\left[\begin{array}{ccc} a_{11}&a_{12}&a_{13}\ a_{21}&a_{22}&a_{23}\ a_{31}&a_{32}&a_{33}\end{array}\right] \left[\begin{array}{ccc} x_{1}\ x_{2}\ x_{3}\end{array}\right] = x_{1}\left[\begin{array}{ccc} a_{11}\ a_{21}\ a_{31}\end{array}\right]+ x_{2}\left[\begin{array}{ccc} a_{12}\ a_{22}\ a_{32}\end{array}\right]+ x_{3}\left[\begin{array}{ccc} a_{13}\ a_{23}\ a_{33}\end{array}\right]\
$$
向量左乘矩阵
$$
\left[\begin{array}{ccc} x_{1}& x_{2}& x_{3}\end{array}\right] \left[\begin{array}{ccc} a_{11}&a_{12}&a_{13}\ a_{21}&a_{22}&a_{23}\ a_{31}&a_{32}&a_{33}\end{array}\right] = x_{1}\left[\begin{array}{ccc} a_{11}& a_{12}& a_{13}\end{array}\right]+ x_{2}\left[\begin{array}{ccc} a_{21}& a_{22}& a_{23}\end{array}\right]+ x_{3}\left[\begin{array}{ccc} a_{31}& a_{32}& a_{33}\end{array}\right]\
$$
矩阵变换
平移矩阵 Translate Matrix
$$
T = \left[ \begin{matrix} 1&0&0&x\ 0&1&0&y\ 0&0&1&z\ 0&0&0&1\ \end{matrix} \right]
$$
缩放矩阵 Scale Matrix
$$
S = \left[ \begin{matrix} x&0&0&0\ 0&y&0&0\ 0&0&z&0\ 0&0&0&1\ \end{matrix} \right]
$$
旋转矩阵 Rotate Matrix
绕 x 轴 旋转 θ 角度
$$
R_{x} = \left[ \begin{matrix} 1&0&0&0\ 0&cos\theta &sin\theta &0\ 0&-sin\theta &cos\theta &0\ 0&0&0&1\ \end{matrix} \right]
$$
绕 y 轴 旋转 θ 角度
$$
R_{y} = \left[ \begin{matrix} cos\theta&0&-sin\theta&0\ 0&1&0&0\ sin\theta &0&cos\theta &0\ 0&0&0&1\ \end{matrix} \right]
$$
绕 z 轴 旋转 θ 角度
$$
R_{z} = \left[ \begin{matrix} cos\theta&sin\theta&0&0\ -sin\theta &cos\theta &0&0\ 0&0&1&0\ 0&0&0&1\ \end{matrix} \right]
$$
cesium中矩阵是用列主序 来存储的。但是构建的时候依然按照行主序来输入
1 |
|
如果使用 Cesium.Cartesian3.fromArray
,那么传参的时候也要按照列主序来输入
1 |
|