谈论矩阵之前要先明确一下使鼡的约定。约定不同用法迥异。
图形API或shader语言中常常把矩阵存储为一维数组这就带来了一个问题,按什么顺序将一维数组中的元素填入箌矩阵中以及要访问矩阵的元素应该指定什么样的下标。
如果遍历一维数组的元素然后依次填入矩阵的每一行,这就是行主以CG语言為例:
以上的代码构建出的矩阵是这样的:
按顺序填入元素时,是按列填入的则是列主。以glsl语言为例:
以上代码构建出的矩阵同样是:
不光昰shader中需要分清楚行主列主的约定在3D程序代码中使用矩阵时,也是要注意这个约定无论是使用3D引擎的数学库的时候,还是自己写3D程序时洎行撰写Matrix类以笔者的开源项目中的为例。这个矩阵类使用列主的约定其中设置位移的方法:
这是一个4x4齐次变换矩阵,因为是列主约定位置向量被设置到一维数组的12,13,14三个下标位置中。在后期从世界矩阵获取世界坐标时遵循这一约定,从12,13,14三个下标位置取出世界坐标不過如果数学库封装的足够好,对于一般的应用倒是不会直接去获取元素,但总有一些特殊的需求需要自己构建矩阵,此时必须知道所使用引擎数学库的约定
矩阵和向量相乘时,也就是使用矩阵变换向量时按照向量所在的位置,可以汾为左乘和右乘两种约定
向量在左边,比较符合从左向右的阅读顺序例如:
还是上面的向量和矩阵,右乘就是这样写:
在CG/HLSL/GLSL的shader中向量和矩阵之间相乘既可以写成左乘也可以写成右乘。而一般的3D引擎会提供一个函数去用矩阵变换向量或者对于一些C++引擎,會使用运算符重载一般而言你没有机会在调用时放错向量的位置。但是是左乘还是右乘决定了矩阵应该如何构造和串接。
以上面的mini3d.js中嘚位移矩阵为例这个矩阵约定是要使用向量右乘,因此位移矢量<Tx?,Ty?,Tz?>位于矩阵的第四列这个矩阵乘以列向量的时候是这样的:
?????1000?0100?0010?Tx?Ty?Tz?1????????????2341??????=?????2+Tx?3+Ty?4+Tz?1??????
为什么要约定左乘还是右乘?
MA?>B???????1000??????=?????XAx??XAy??XAz??0?YAx??YAy??YAz??0?ZAx??ZAy??ZAz??0?Ox?Oy?Oz?1????????????1000??????=?????XAx??XAy??XAz??0?????? 得到的向量正是A坐标系的X轴在B坐标系中表示
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。