关于Stage3D中Matrix3D

来源:互联网 发布:iphone刷机后 数据恢复 编辑:程序博客网 时间:2024/06/10 02:46
一,Matrix3D表示的矩阵是按行表示的(某一轴的变换是按行表示的 )

1. 正常情况下矩阵按列表示,如下:

scaleX        0              0       0
0        scaleY              0       0
0               0       scaleZ       0
tx             tY             tZ      tW


此时,先进行A矩阵变换再进行B矩阵变换,表示如下:
总变换 = A * B


2. 仔细看Matrix3D的表示图,它与一般矩阵的按列表示不同,它是按行表示的,如下图:


 而按Matrix3D的表示方式,先进行A矩阵变换再进行B矩阵变换,则表示如下:
总变换 = B * A


为什么这里矩阵相乘是后置一个矩阵呢,因为这样运算后,才能保证与正常情况下矩阵运算结果一样(运算的行列才能对应),随便列2个矩阵试下就知道了。


所以就是为什么Matrix3D.append( )函数的表示如下:
public function append(lhs:Matrix3D):void
      在使用 append() 方法时,乘法运算将从左侧开始,这意味着 lhs Matrix3D 对象位于乘法运算符的左侧。
      thisMatrix = lhs * thisMatrix;


二,Matrix3D实际存储的是上图的转置矩阵。
Matrix3D对矩阵的表示与存储是2种不同的方式,有什么区别呢?
1. 表示的方式:决定了在实际运算时,是按后置矩阵运算的。
2. 存储的方式:决定了数据的存储顺序,如果存储与表示的顺序不同,则在使用前要做相关的操作。
存储的方式不一定非要跟表示的方式一样,比如Matrix3D中存储与表示是颠倒的,所以使用前要将存储的结构转置一下。这就是为什么在上传常矩阵时最后一个参数要设为true(上传时先转置).
m_kContext3D.setProgramConstantsFromMatrix( Context3DProgramType.VERTEX, 0, m_matFinal, true );
0 0
原创粉丝点击