OpenGL旋转平移 变换
2016-05-08 15:32
537 查看
#include<gl/glut.h> #include<gl/GL.h> #include<gl/GLU.h> #include<math.h> #include<iostream> #define R 100 #define r 50 #define PI 3.1415926 double a1[5], b1[5], a2[5], b2[5]; double Height = 320; double Width = 400; void Calculate() { int angle = 70; for (int i = 0; i < 5; i++) { a1[i] = R*cos(angle*PI / 180); b1[i] = R*sin(angle*PI / 180); a2[i] = r*cos(PI / 5 + angle*PI / 180); b2[i] = r*sin(PI / 5 + angle*PI / 180); angle += 72; } } void Init() { Calculate(); } double target = 0.00; double theta = 0.00; bool right = true; bool left = true; bool top = true; bool bottom = true; int count = 0; double sc = 1; bool scflg1 =true; bool scflg2 = true; void draw() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /*glMatrixMode设置当前矩阵模式: GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作. GL_PROJECTION,对投影矩阵应用随后的矩阵操作. GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作. 与glLoadIdentity()一同使用*/ glClearColor(0, 0, 0, 0); gluOrtho2D(-450, 450, -300, 300);//左右下上 //glPushMatrix(); /* glTranslatef(0.0f,-20.0f,-40.0f)表示将当前图形向x轴平移0,向y轴平移-20,向z轴平移-40 glScaled(10.0f,10.0f,10.0f)表示将当前图形沿x,y,z轴分别放大为原来的10倍 glRotatef(-80.0f,10.0f,1.0f,0.0f)表示将当前图形沿方向向量(-10,1,0)顺时针旋转80度。 */ //glPopMatrix(); //glPushMatrix(); if (target < Width-60 && right&&target<Height-100) {//平移到最右边 target += 1; } else if(target>-Width+160 && left&&Height>-Height+150) {//到最右边返回到最左边 right = false; target -= 1; } else { right = true; } glTranslatef(target, target, 0);//沿着 X, Y 和 Z 轴移动。 /*注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动 而是相对与当前所在的屏幕位置。其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量*/ glRotated(theta, 0, 0, 1);//围绕z轴进行旋转 theta += 2.5; if(sc>1.4) { sc=0.5;//进行模型缩放 }else{ sc += 0.001;} glScalef(sc, sc, 1);//模型缩放函数 glBegin(GL_LINE_LOOP); for (int i = 0;i < 5;i++) { glVertex2d(a1[i], b1[i]); glVertex2d(a2[i], b2[i]); } glEnd(); //glPopMatrix(); //glFlush(); //glutSwapBuffers(); //glLoadIdentity(); glColor3d(0, 0, 1); glFlush();//用于强制刷新缓冲,保证绘图命令将被执行,而不是存储在缓冲区[2] 中等待其他的OpenGL命令。 glutSwapBuffers();//调换前后缓存 } void DisPlay() { glClearColor(1.0, 1.0, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT);//白色背景 draw(); } void main() { glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowSize(900, 600); glutCreateWindow("第四次作业"); Init(); glutDisplayFunc(DisPlay);//glutDisplayFunc函数用于注册一个绘图函数, 这样操作系统在必要时刻就会对窗体进行重新绘制操作 glutIdleFunc(DisPlay);//glutIdleFunc设置全局的回调函数,当没有窗口事件到达时,GLUT程序功能可以执行后台处理任务或连续动画 glutMainLoop();//glutMainLoop进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环。 system("pause"); }
相关文章推荐
- Linux根文件系统制作
- Nginx与Apache对比
- 优秀网站博客集锦
- 《大型网站系统与JAVA中间件实践》读书笔记
- Linux mysql设置表名不区分大小写,设置编码
- Linux mysql设置表名不区分大小写,设置编码
- 2016年学习Linux决心书(老男孩教育在线课程班第二期)
- apache+mysql+php网站访问慢,重启就好了~如何解决
- ecshop和ucenter的整合
- VirtualBox + CentOS 使用 NAT + Host-Only 方式联网
- 我的archlinux中安装的关于xfce4的软件
- Linux CentOS6系统环境安装VNC可视化
- 如何让域名可以直接访问到tomcat下web应用
- maven tomcat 插件实现热部署
- CPU的内部架构和工作原理
- CentOS6.5安装RHadoop
- Linux系统启动过程分析
- DayDayUP_linux运维_将linux默认python升级到所需版本
- CentOS6.5安装HBase集群及多HMaster配置
- 硬盘的存储原理和内部架构