简单理解OpenGL模型视图变换
2018-01-23 14:16
260 查看
前几天学习了OpenGL的绘图原理(其实就是坐标的不停变换变换),看到网上有个比较好的例程,于是学习了下,并在自己感兴趣的部分做了注释。
首先通过glMatrixMode(GL_MODELVIEW)设置当前操作的矩阵为模型视图矩阵,然后通过glPushMatrix()和glPopMatrix()函数对矩阵进行压栈出栈操作。
对矩阵进行压栈操作实际上是将当前的模型视图矩阵保存起来,相当于:我对一份代码或者数据进行修改,我对代码或者数据改来改去之后不想再啰啰嗦嗦麻麻烦烦的“逆操作”恢复代码或者数据的原貌,很简单,在操作代码或者数据之前先备份一下。
对矩阵进行出栈操作就是恢复栈顶矩阵对应的模型视图状态。相当于:我在操作一份代码或者数据前,先备份了它,现在我操作完达到我想要的效果了; 接下来我要基于原代码或者原数据进行其他操作,怎么办?恢复之前备份的数据呗。
当然,我不仅可以保存初始模型视图矩阵(对它进行压栈),而且还可以保存任何阶段的模型视图矩阵(只要有必要)。
代码基于传统的OpenGL,参照工程的附加依赖项就知道我用的是哪个版本了:glaux.lib;glu32.lib;opengl32.lib;glut32.lib;glut.lib;
代码如下:
首先通过glMatrixMode(GL_MODELVIEW)设置当前操作的矩阵为模型视图矩阵,然后通过glPushMatrix()和glPopMatrix()函数对矩阵进行压栈出栈操作。
对矩阵进行压栈操作实际上是将当前的模型视图矩阵保存起来,相当于:我对一份代码或者数据进行修改,我对代码或者数据改来改去之后不想再啰啰嗦嗦麻麻烦烦的“逆操作”恢复代码或者数据的原貌,很简单,在操作代码或者数据之前先备份一下。
对矩阵进行出栈操作就是恢复栈顶矩阵对应的模型视图状态。相当于:我在操作一份代码或者数据前,先备份了它,现在我操作完达到我想要的效果了; 接下来我要基于原代码或者原数据进行其他操作,怎么办?恢复之前备份的数据呗。
当然,我不仅可以保存初始模型视图矩阵(对它进行压栈),而且还可以保存任何阶段的模型视图矩阵(只要有必要)。
代码基于传统的OpenGL,参照工程的附加依赖项就知道我用的是哪个版本了:glaux.lib;glu32.lib;opengl32.lib;glut32.lib;glut.lib;
代码如下:
#include <GL/glut.h> void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(-5.0, 5.0, -5.0, 5.0); // 设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0 glMatrixMode(GL_MODELVIEW); // 设置当前操作的矩阵为“模型视图矩阵” } void drawSquare(void) // 绘制中心在原点,边长为2的正方形 { glBegin(GL_POLYGON); glVertex2f(-1.0f, -1.0f); // 左下点 glVertex2f(1.0f, -1.0f); // 右下点 glVertex2f(1.0f, 1.0f); // 右上点 glVertex2f(-1.0f, 1.0f); // 左上点 glEnd(); } void myDraw(void) { glClear(GL_COLOR_BUFFER_BIT); // 清空 // 将坐标原点移动到屏幕中心 类似于复位 glLoadIdentity(); // 压栈 栈顶为屏幕中心的模型视图矩阵 glPushMatrix(); // 移动坐标原点 glTranslatef(0.0f, 2.0f, 0.0f); // 三个参数依次为模型在x,y,z轴方向的缩放比 // 参数也可取负数,也可以理解为先关于某轴翻转180°,再缩放; glScalef(3.0, 0.5, 1.0); // 设置要使用的颜色 R、G、B 这里为红色 glColor3f(1.0, 0.0, 0.0); drawSquare(); // 出栈 恢复为原始模型视图矩阵 glPopMatrix(); // 压栈 栈顶为原始模型视图矩阵 glPushMatrix(); glTranslatef(-3, 0.0, 0.0); // 压栈 栈顶为中间左菱形(-3, 0, 0)的模型视图矩阵 glPushMatrix(); // 符合右手定则 (0.0, 0.0, 1.0)为绕着Z轴 // +45.0代表右手定则按照Z轴的正向(从里到外)握,即逆时针方向 glRotatef(45.0, 0.0, 0.0, 1.0); glColor3f(0.0, 1.0, 0.0); drawSquare(); // 左边菱形 // 出栈 恢复为中间左菱形模型视图矩阵 glPopMatrix(); glTranslatef(3.0, 0.0, 0.0); // 压栈 经过坐标变换当前为屏幕中心了 栈顶为为屏幕中心模型视图矩阵 glPushMatrix(); glRotatef(45.0, 0.0, 0.0, 1.0); glColor3f(0.0, 0.7, 0.0); drawSquare(); // 中间菱形 // 出栈 恢复为屏幕中心模型视图矩阵 glPopMatrix(); glTranslatef(3.0, 0.0, 0.0); // 压栈 栈顶为中间右菱形的模型视图矩阵 glPushMatrix(); glRotatef(45.0, 0.0, 0.0, 1.0); glColor3f(0.0, 0.4, 0.0); drawSquare(); // 右边菱形 // 出栈 恢复中间右菱形的模型视图矩阵 glPopMatrix(); // 出栈 恢复屏幕中心模型视图矩阵 glPopMatrix(); glTranslatef(0.0, -3.0, 0.0); glScalef(4.0, 1.5, 1.0); glColor3f(0.0, 0.0, 1.0); drawSquare(); // 下面蓝色矩形 glFlush(); } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(600, 600); glutCreateWindow("几何变换函数综合示例"); init(); glutDisplayFunc(myDraw); glutMainLoop(); }
相关文章推荐
- 关于OpenGL中模型视图投影视口变换的理解
- OpenGL中glMatrixMode()函数以及视图变换,模型变换,投影变换,视口变换的理解
- 理解OpenGL中的模型视图矩阵变换
- OpenGl学习笔记3之模型变换、视图变换、投影变换、视口变换介绍
- OpenGL视图和模型变换中各变换发生顺序的思考
- OpenGL的视图和模型变换
- OpenGL(五) 三维变换之模型视图矩阵
- OpenGL模型变换和视图变换
- 【OpenGL编程指南】之视图和模型变换
- OpenGL.ES在Android上的简单实践:8-曲棍球(构建冰球木槌 下 & 模型视图投影矩阵)
- 详解OpenGL中的各种变换(投影变换,模型变换,视图变换)(二)——投影变换
- OpenGL模型视图变换、投影变换、视口变换(转载)
- OpenGL--3D世界(视图变换,模型变换,投影变换,视口变换)
- OpenGL模型视图变换
- OpenGL模型变换中局部坐标系和全局坐标系的理解
- OpenGL 模型视图变换、投影变换、视口变换
- OpenGL--3D世界(视图变换,模型变换,投影变换,视口变换)
- opengl中的视图变换和模型变换及代码复用
- OpenGL模型视图变换、投影变换、视口变换
- OPENGL 变换视图模型变换与部分透视变换