1. openGL的矩阵
openGL的矩阵是列优先排序的。就是说,矩阵的数据是存贮在一维数组中,数据上传到openGL处理的时候,会把一维数据的每一行当做列来处理。比如说,一个4*4的矩阵在数组中的排列如下:
matrix44 = { m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, }
由图可见,m0, m1, m2 表示了x轴, m4, m5, m6 表示了y轴, m8, m9, m10 表示了z轴, 而m12, m13, m14表示了平移量。而最后一行的,m3, m7, m11, m15是齐次坐标。唯有m15等于1是为了,在做矩阵计算的时候,平移量影响到平移量本身,而不会影响到xyz轴的数值。
2. 单位矩阵
没有任何旋转,平移,缩放的矩阵用单位矩阵来表示。所有的旋转,平移,缩放,都是在单位矩阵的基础上进行的。如下:
{ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, };
3. 矩阵乘法
旋转,平移,缩放的数据变化是通过矩阵乘法把数值存贮在矩阵中的。简单描述一下矩阵乘法的规则,就是左边矩阵决定结果矩阵的行,右边矩阵决定结果矩阵的列。那么计算的过程是,左边矩阵的行,元素对应乘以,右边矩阵的列,得到的值在结果矩阵的位置就是,左边矩阵的行右边矩阵的列。
4. 矩阵按照某个向量平移
matrix->m[12] += matrix->m[0] * tx + matrix->m[4] * ty + matrix->m[8] * tz; matrix->m[13] += matrix->m[1] * tx + matrix->m[5] * ty + matrix->m[9] * tz; matrix->m[14] += matrix->m[2] * tx + matrix->m[6] * ty + matrix->m[10] * tz; matrix->m[15] += matrix->m[3] * tx + matrix->m[7] * ty + matrix->m[11] * tz;
5. 矩阵在某个向量上缩放
matrix->m[0] *= sx; matrix->m[1] *= sx; matrix->m[2] *= sx; matrix->m[4] *= sy; matrix->m[5] *= sy; matrix->m[6] *= sy; matrix->m[8] *= sz; matrix->m[9] *= sz; matrix->m[10] *= sz;
6. 矩阵在某个向量上旋转
在任意向量上旋转有些复杂,只说明一下特殊的情况,按照xyz轴旋转。在数学上,我们知道点(x, y)旋转一个a弧度后的坐标是:(x * cosa - y * sina, x * sina + y * cosa), 所以我们可以得出
单位矩阵在Z轴上旋转a弧度后的一个矩阵为:
{ cosa, sina, 0.0f, 0.0f, -sina, cosa, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, };
{ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, cosa, sina, 0.0f, 0.0f, -sina, cosa, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, };
{ cosa, 0.0f, -sina, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, sina, 0.0f, ccosa, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, }
原文:http://blog.csdn.net/tom_221x/article/details/44622011