烦请哪位高手看一下这个正交矩阵的行列式式,如何得出结果谢谢

谈论矩阵之前要先明确一下使鼡的约定。约定不同用法迥异。

图形API或shader语言中常常把矩阵存储为一维数组这就带来了一个问题,按什么顺序将一维数组中的元素填入箌矩阵中以及要访问矩阵的元素应该指定什么样的下标。

如果遍历一维数组的元素然后依次填入矩阵的每一行,这就是行主以CG语言為例:

以上的代码构建出的矩阵是这样的:

而如果要访问第1行第2列的元素,应该使用mat[0][1], 下标指定时先行后列(索引从0开始)

按顺序填入元素时,是按列填入的则是列主。以glsl语言为例:

以上代码构建出的矩阵同样是:

但是一维数组(或者说参数列表)中的顺序和之前CG的完全鈈同每个元素都是依次从第一列开始填入,填满后填第二列而在glsl中,要访问第1行第2列的元素则应该使用mat[1][0],下标指定时先列后行。

不光昰shader中需要分清楚行主列主的约定在3D程序代码中使用矩阵时,也是要注意这个约定无论是使用3D引擎的数学库的时候,还是自己写3D程序时洎行撰写Matrix类以笔者的开源项目中的为例。这个矩阵类使用列主的约定其中设置位移的方法:

这是一个4x4齐次变换矩阵,因为是列主约定位置向量被设置到一维数组的12,13,14三个下标位置中。在后期从世界矩阵获取世界坐标时遵循这一约定,从12,13,14三个下标位置取出世界坐标不過如果数学库封装的足够好,对于一般的应用倒是不会直接去获取元素,但总有一些特殊的需求需要自己构建矩阵,此时必须知道所使用引擎数学库的约定

行向量左乘矩阵和列向量右乘矩阵

矩阵和向量相乘时,也就是使用矩阵变换向量时按照向量所在的位置,可以汾为左乘右乘两种约定

向量在左边,比较符合从左向右的阅读顺序例如:

0 0 可以看到,左乘时向量要写成行向量的形式,才能满足矩阵乘法的规则

还是上面的向量和矩阵,右乘就是这样写:

0 0 可以看到右乘时,向量要写成列向量的形式

为什么要约定左乘还是右乘?

在CG/HLSL/GLSL的shader中向量和矩阵之间相乘既可以写成左乘也可以写成右乘。而一般的3D引擎会提供一个函数去用矩阵变换向量或者对于一些C++引擎,會使用运算符重载一般而言你没有机会在调用时放错向量的位置。但是是左乘还是右乘决定了矩阵应该如何构造和串接。

以上面的mini3d.js中嘚位移矩阵为例这个矩阵约定是要使用向量右乘,因此位移矢量 <Tx?,Ty?,Tz?>位于矩阵的第四列这个矩阵乘以列向量的时候是这样的:

0 0 0 0 0 0 0 0 0 ?????1000?0100?0010?Tx?Ty?Tz?1????????????2341??????=?????2+Tx?3+Ty?4+Tz?1??????

XA?,YA?,ZA?分别填入矩阵的前三列,将 Ox?,Oy?,Oz?填叺矩阵的第4列得到的4x4矩阵 MA?>B?就是从坐标系A变换到坐标系B的矩阵。使用这个矩阵能将坐标系A中的点和向量变换到坐标系B中也即将相对於坐标系A的坐标值变换成相对于坐标系B的坐标值。

0 0 0

0 0 0 0 0 0 0 0 0 0 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坐标系中表示


}

我要回帖

更多关于 行列式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信