文章目录
一、不同类型矩阵变换先后顺序
二、渲染前不设置单位阵
三、矩阵的压栈和出栈原理分析
四、矩阵的压栈和出栈代码示例
五、相关资源
一、不同类型矩阵变换先后顺序
对 OpenGL 中的 模型视图矩阵进行 缩放 , 旋转 , 平移 操作时 , 先旋转再移动 , 与先移动再旋转 的效果是不同的 ;
矩阵具有叠加性 , 先移动再旋转 , 与先旋转再移动 , 最终的模型视图矩阵的值是不同的 ;
举个例子 : 人走路时 , "先向左转 , 然后再走 100 米 " , 与 " 先走 100 米 , 再向左转 " 达到的目的地肯定是不同的 ;
先旋转后移动代码 :
// 渲染场景 // 设置单位矩阵 glLoadIdentity(); // 矩阵缩放 // 缩放的是下面设置的点的坐标 // 每个参数都影响 x , y , z 分量 //glScalef(2.0f, 2.0f, 1.0f); // 矩阵旋转 // glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); // 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , // 如果对应值设置为 1 , 则绕该轴旋转 // 这里设置的是绕 z 轴旋转 30 度 glRotatef(30.0f, 0.0f, 0.0f, 1.0f); // 平移变换 // 设置 xyz 三个方向平移的值 glTranslatef(0.0f, -2.0f, 0.0f);
效果 :
先移动后旋转代码 :
// 设置单位矩阵 glLoadIdentity(); // 矩阵缩放 // 缩放的是下面设置的点的坐标 // 每个参数都影响 x , y , z 分量 //glScalef(2.0f, 2.0f, 1.0f); // 平移变换 // 设置 xyz 三个方向平移的值 glTranslatef(0.0f, -2.0f, 0.0f); // 矩阵旋转 // glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); // 第 1 个参数是旋转角度 , 后面三个参数的值代表是否绕该轴旋转 , // 如果对应值设置为 1 , 则绕该轴旋转 // 这里设置的是绕 z 轴旋转 30 度 glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
效果 :
二、渲染前不设置单位阵
由上面的示例可知 , 矩阵的运算具有叠加性 , 每次矩阵操作前 , 都应该恢复成单位阵后 , 再进行操作 , 否则每次绘制的结果都不一样 ;
如果将 设置单位矩阵 的代码注释掉 , 此时三角形就会到处乱窜 ,
// 设置单位矩阵 //glLoadIdentity();
每次的矩阵操作都叠加上一次的矩阵操作 , 最终的结果不可预知 ;
这里除了设置单位阵之外 , 还可以使用压栈和出栈操作 ;
矩阵压栈 :
// 矩阵压栈 glPushMatrix();
矩阵出栈 :
// 矩阵出栈 glPopMatrix();