开始学习矩阵时,知道旋转、移动都可以由矩阵乘法来实现,想着也是挺简单的。
比如一个点,
第一次绕X轴旋转,设绕X轴旋转矩阵为
,
这样
,
得到点绕X轴旋转后的
点,这时如果再绕Y轴旋转,可以看做是新的点P1绕Y轴旋转,设绕Y轴旋转的的矩阵为
,
这样
如果旋转后得到的新点,又要继续绕世界某坐标轴旋转,只需如下
是不是觉得很简单,因为这种理解方式是很常规理解方式,把每次的旋转都理解成是某个点绕某轴旋转,也就是点直接与旋转矩阵相乘,即,但由于矩阵结合率,只要相乘顺序不变,如
,所以
上面这个理解,我觉得大多数人都能理解。可是在实际应用中,常常看到的是矩阵乘点,如
,
为了使,即
,发现之前是点P乘A矩阵的列,现在是矩阵
的行乘以
,可得
之前点乘
矩阵后的点
的x坐标
现在矩阵乘点
后的点
的x坐标
很明显要让,需要让
的列成为
的行,所以
,即
即
这时可得,
到了这,之前我犯了个错,因为,就以为所有矩阵
,可有天发现教材写的是
,当时我就想
与
相等不.
后来我觉得当P为只有一行或只有一列时,上式与
相等是成立的,现在简单证明下。
因为矩阵乘法结合率,只要顺序不变,可以先去求右边的结果,手动计算方式从右往左乘,即
.
因为,则
因为P1只有一行且在最右端,实际上矩阵乘点时,是把P1作为列相乘,所以
因为根据点乘矩阵,,然后又根据
,所以
,
从而得到。
本来点依次乘矩阵,哪怕是点去乘多个矩阵的组合也很好理解,为什么实际使用是用矩阵去乘点呢?
我想可能是为了矩阵相乘的效率,比如一个节点下面连了很多多层的子节点,如果用点乘矩阵,那么每个子节点的矩阵会从下一直往上乘,到父节点时,父节点无法利用从子节点得到的矩阵乘积,当对父节点进行操作时,父节点会重复向上相乘,一直乘到根节点才能得到完整的矩阵乘积。
而如果采用矩阵乘点,即矩阵从上往下乘,可以把父节点所得的乘积传给子节点,子节点只需要直接将自身的矩阵乘父矩阵乘积就可以,减少计算消耗。
还有一个我发现的是在opengl里,因为opengl的矩阵采用的是列优先,那么用点乘矩阵的方式推出来的矩阵,在opengl里用矩阵乘点时,可以直接使用点乘矩阵方式退出来的矩阵,不需要行列互换,即
(行优先,点乘矩阵)=
(行优先,矩阵乘点)
在opengl用列优先存储时,可得
,居然在opengl最终使用的还是点乘矩阵方式推导出的矩阵,只不过顺序颠倒而已,我在想这会不会就是opengl为什么采用列优先存储。