首页 > 其他 > 详细

openGL 矩阵的旋转-平移-缩放

时间:2015-03-25 21:36:19      阅读:240      评论:0      收藏:0      [点我收藏+]

1.  openGL的矩阵


openGL的矩阵是列优先排序的。就是说,矩阵的数据是存贮在一维数组中,数据上传到openGL处理的时候,会把一维数据的每一行当做列来处理。比如说,一个4*4的矩阵在数组中的排列如下:

matrix44 = {
   m0,   m1,   m2,   m3,
   m4,   m5,   m6,   m7,
   m8,   m9,   m10,  m11,
   m12,  m13,  m14,  m15,
}

当被传输到openGL会当做下面这样的矩阵来处理:

技术分享


由图可见,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,
};

可见单位矩阵的xyz轴都是单位向量平移向量为0



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;


平移向量即是(tx, ty, tz),  我们做乘法的时候需要按照openGL处理矩阵的方式,所以m0, m4, m8 是第一行以此类推。我们把计算的数值存贮到矩阵的平移向量里。




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;

就是把矩阵中x, y, z向量乘以对应的缩放比例即可。



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,
};

同理单位矩阵在X轴上旋转a弧度后的矩阵:

{
	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,
};

同理单位矩阵在Y轴上旋转a弧度后的矩阵:

{
       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,
}

最后把需要旋转的矩阵乘以单位矩阵的旋转矩阵,就会把旋转的数值存储到结果矩阵中了。



openGL 矩阵的旋转-平移-缩放

原文:http://blog.csdn.net/tom_221x/article/details/44622011

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!