基本的矩阵变换:旋转、平移、缩放

基本的矩阵变换:旋转、平移、缩放

矩阵变换时,一定要注意以下三点:

  • 所使用的向量是行向量还是列向量。

    • 如果是行向量,按照数学领域中矩阵相乘的规则,向量要放在左侧相乘。
    • 如果是列向量,向量要放在右侧相乘。
  • 矩阵是行主序还是列主序

    • 如果是行主序,内存存储矩阵的数组的前四个元素表示的是对应数学矩阵的第一行
    • 如果是列主序,内存存储矩阵的数组的前四个元素表示的是对应数学矩阵的第一列
  • 多个矩阵变换时的相乘顺序。

    • 在多个矩阵变换时,不同的相乘顺序会导致不同的结果,所以我们要保证矩阵相乘的顺序是我们期望的。假设有三个变换矩阵:旋转矩阵 R,平移矩阵 T,缩放矩阵 S,以及顶点向量 P,那么 P 变换到 P1 的顺序一般是这样的: ( 先缩放,再旋转,最后平移。 )

$$
P1 = T \times R \times S \times P
$$

行主序和列主序

行主序指矩阵在内存中逐行存储,列主序指矩阵在内存中逐列存储。

行主序矩阵内存布局:

img

列主序矩阵内存布局:( GLSL/webgl/cesium 中默认是使用列主序存储矩阵的 )

img

左乘和右乘

向量右乘矩阵

$$
\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
2
3
//构建一个向 x 轴平移88 个单位的矩阵
new Cesium.Matrix4( 1,0,0,0 ,0 ,1,0,88 , 0,0,1,0, 0,0,0,1 )
// 打印结构 Matrix4 {0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1, 6: 0, 7: 0, 8: 0, 9: 0, 10: 1, 11: 0, 12: 0, 13: 88, 14: 0, 15: 1}

image-20211018205407206

如果使用 Cesium.Cartesian3.fromArray ,那么传参的时候也要按照列主序来输入

1
2
Cesium.Matrix4.fromArray( [ 1,0,0,0,   0,1,0,0,  0,0,1,0,  0,88,0,1    ] )
//Matrix4 {0: 1, 1: 0, 2: 0, 3: 0, 4: 0, 5: 1, 6: 0, 7: 0, 8: 0, 9: 0, 10: 1, 11: 0, 12: 0, 13: 88, 14: 0, 15: 1}

基本的矩阵变换:旋转、平移、缩放
http://example.com/2024/05/23/webgl/基本的矩阵变换:旋转、平移、缩放/
Author
John Doe
Posted on
May 23, 2024
Licensed under