OpenGL的几何变换
来源:互联网 发布:淘宝能发布多少个宝贝 编辑:程序博客网 时间:2024/05/17 22:20
1.实验目的:
理解掌握一个OpenGL程序平移、旋转、缩放变换的方法。
2.实验内容:
(1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移、旋转、缩放变换的方法;
(2)根据示范代码,尝试完成实验作业;
3.实验原理:
(1)OpenGL下的几何变换
在OpenGL的核心库中,每一种几何变换都有一个独立的函数,所有变换都在三维空间中定义。
平移矩阵构造函数为glTranslate
#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 myDraw1(void){ glClear(GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glColor3f(1.0, 0.0, 0.0); drawSquare(); //在原点处绘制边长为2红色正方形 glTranslatef(2.0,3.0,0.0); //向右移动2单位,向上移动3单位 glColor3f(0.0, 1.0, 0.0); drawSquare(); //绘制边长为2绿色正方形 glTranslatef(0.0,-3.0,0.0); //再向下移动3单位 glColor3f(0.0, 0.0, 1.0); drawSquare(); //绘制边长为2蓝色正方形 glFlush();}void myDraw2(void){ glClear(GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glColor3f(1.0, 0.0, 0.0); drawSquare(); //在原点处绘制边长为2红色正方形 glPushMatrix(); { glTranslatef(2.0,3.0,0.0); //向右移动2单位,向上移动3单位 glColor3f(0.0, 1.0, 0.0); drawSquare(); //绘制边长为2绿色正方形 } glPopMatrix(); glTranslatef(2.0,0.0,0.0); //再向右移动2单位 glColor3f(0.0, 0.0, 1.0); drawSquare(); //绘制边长为2蓝色正方形 glFlush();}void main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(600, 600); glutCreateWindow("Translate函数示例"); init(); glutDisplayFunc(myDraw1); glutMainLoop();}
注意理解:myDraw1()和myDraw2()生成的图形完全相同,为什么?
(2)、Rotate示例
#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 myDraw1(void){ glClear(GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glColor3f(1.0, 0.0, 0.0); drawSquare(); //在原点处绘制边长为2红色正方形 glTranslatef(2.0,3.0,0.0); //向右移动2单位,向上移动3单位 glRotatef(30,0.0,0.0,1.0); //逆时针旋转30角度 glColor3f(0.0, 1.0, 0.0); drawSquare(); //绘制边长为2绿色正方形 glLoadIdentity(); //将当前矩阵设为单位矩阵 glTranslatef(-2.0,-3.0,0.0); //向左移动2单位,向下移动3单位 glRotatef(-30,0.0,0.0,1.0); //顺时针旋转30角度 glColor3f(0.0, 0.0, 1.0); drawSquare(); //绘制边长为2蓝色正方形 glFlush();}void myDraw2(void){ glClear(GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glColor3f(1.0, 0.0, 0.0); drawSquare(); //在原点处绘制边长为2红色正方形 glPushMatrix(); //把当前矩阵压入堆栈 { glTranslatef(2.0,3.0,0.0); //向右移动2单位,向上移动3单位 glRotatef(30,0.0,0.0,1.0); //逆时针旋转30角度 glColor3f(0.0, 1.0, 0.0); drawSquare(); //绘制边长为2绿色正方形 } glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵 glTranslatef(-2.0,-3.0,0.0); //向左移动2单位,向下移动3单位 glRotatef(-30,0.0,0.0,1.0); //顺时针旋转30角度 glColor3f(0.0, 0.0, 1.0); drawSquare(); //绘制边长为2蓝色正方形 glFlush();}void main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(600, 600); glutCreateWindow("Rotate函数示例"); init(); glutDisplayFunc(myDraw1); glutMainLoop();}
(3)拉伸 glScalef
#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 myDraw1(void){ glClear(GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glColor3f(1.0, 0.0, 0.0); drawSquare(); //在原点处绘制边长为2红色正方形 glTranslatef(2.0,3.0,0.0); //向右移动2单位,向上移动3单位 glScalef(1.0,1.5,1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍 glColor3f(0.0, 1.0, 0.0); drawSquare(); //绘制边长为2绿色正方形 glLoadIdentity(); //将当前矩阵设为单位矩阵 glTranslatef(-2.0,-3.0,0.0); //向左移动2单位,向下移动3单位 glScalef(0.5,1.5,1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍 glColor3f(0.0, 0.0, 1.0); drawSquare(); //绘制边长为2蓝色正方形 glFlush();}void myDraw2(void){ glClear(GL_COLOR_BUFFER_BIT); //清空 glLoadIdentity(); //将当前矩阵设为单位矩阵 glColor3f(1.0, 0.0, 0.0); drawSquare(); //在原点处绘制边长为2红色正方形 glPushMatrix(); //把当前矩阵压入堆栈 { glTranslatef(2.0,3.0,0.0); //向右移动2单位,向上移动3单位 glScalef(1.0,1.5,1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍 glColor3f(0.0, 1.0, 0.0); drawSquare(); //绘制边长为2绿色正方形 } glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵 glTranslatef(-2.0,-3.0,0.0); //向左移动2单位,向下移动3单位 glScalef(0.5,1.5,1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍 glColor3f(0.0, 0.0, 1.0); drawSquare(); //绘制边长为2蓝色正方形 glFlush();}void main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutInitWindowSize(600, 600); glutCreateWindow("Scale函数示例"); init(); glutDisplayFunc(myDraw1); glutMainLoop();}
(4)、综合示例
#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); glScalef(3.0,0.5,1.0); glColor3f(1.0, 0.0, 0.0); drawSquare(); //上面红色矩形 } glPopMatrix(); glPushMatrix(); { glTranslatef(-3.0,0.0,0.0); glPushMatrix(); { 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();}
5.实验作业:
绘制如下图形:
提示:
(1)写一个绘制菱形的函数drawDiamond(void);
void drawDiamond(void) //绘制中心在原点的菱形{ glBegin(GL_POLYGON); //顶点指定需要按逆时针方向 { glVertex2f(0.0f,-1.0f);//下点 glVertex2f(2.0f,0.0f);//右点 glVertex2f(0.0f, 1.0f);//上点 glVertex2f(-2.0f,0.0f);//左点 } glEnd();}
(2)用几何变换绘制三个不同位置、旋转角度、颜色的菱形。
0 0
- OpenGL的几何变换
- 我对 OpenGL 几何变换的理解
- OpenGL的几何变换-纹理贴图
- 【OpenGL】几何变换的常用函数
- OpenGL几何变换
- OpenGL三角形几何变换
- OpenGL几何变换详解
- OpenGL开发 几何变换:管线
- perl-opengl几何变换函数
- perl-opengl几何变换函数
- OpenGL: 用户自定义几何变换
- 实验3 OpenGL几何变换
- OpenGL ES几何变换和坐标变换
- OpenGL ES几何变换和坐标变换
- OpenGL图形变换——几何变换(世界变换)
- OpenGL学习——二维几何变换
- OpenGL学习08_几何变换
- OpenGL学习08_几何变换
- jquery的datatables,第一次加载没问题,再次加载datatables弹窗报错:cannot reinitialise datatable
- 最短路径 Dijkstra算法 HDOJ_2544
- MemSQL 取代 HDFS 与 Spark 结合,性能大幅提升
- DOM对象篇
- Error installing libwebp
- OpenGL的几何变换
- F检验 Ftes算法t我的见解
- 大数加法
- Android studio插件大全
- 条件随机场(CRF)及CRF++安装使用
- 使用Jquery操作DOM
- 购物车界面(Bootstrap)
- Ionic2可以有两种方式来存储数据,Local Storage和SQLite
- jQuery取得select选择的文本与值