博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openGL 大作业之n星变换
阅读量:4627 次
发布时间:2019-06-09

本文共 3091 字,大约阅读时间需要 10 分钟。

#include "stdafx.h"#include
#define GLUT_DISABLE_ATEXIT_HACK //不写这句话总运行出错,我也不知道为啥。。。#include
#include
int change = 10;static GLfloat spin = 0.0;//static:静态全局变量,只要程序运行,内存中一直存在,文件内可见,文件外不可见void init(void){ glClearColor(0.0, 0.0, 0.0, 0.0);//将清空颜色设置为黑 }int z = -1;void fillOption(GLint selectedOption){ z = -1; switch (selectedOption) { case 1:change-=2; break; case 2:z=-z; break; case 3:z =0; break; } glutPostRedisplay();}void display(void){ glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存 glPushMatrix();//将当前矩阵压栈(保存现场) glRotatef(spin, 0.0, 0.0,z);//旋转方向,遵循右手原则 glColor3f(1.0, 1.0, 1.0); glEnable(GL_LINE_SMOOTH);//让线条更平滑 GLint x = 100; GLdouble a = 1.256637, c = 1; while (x--) { glShadeModel(GL_SMOOTH);//渐变色 glBegin(GL_LINE_STRIP); glVertex2f(50 * cos(a + c), 50 * sin(a + c)); glColor3f(1.0, 0.0, 0.0); glVertex2f(50 * cos(3 * a + c), 50 * sin(3 * a + c)); glColor3f(0.0, 1.0, 0.0); glVertex2f(50 * cos(5 * a + c), 50 * sin(5 * a + c)); glColor3f(0.0, 0.0, 1.0); glVertex2f(50 * cos(2 * a + c), 50 * sin(2 * a + c)); glColor3f(0.0, 1.0, 1.0); glVertex2f(50 * cos(4 * a + c), 50 * sin(4 * a + c)); glColor3f(1.0, 1.0, 1.0); glVertex2f(50 * cos(a + c), 50 * sin(a + c)); glEnd(); c+=0.0314159365*change; } glColor3f(1.0, 0.0, 0.0); glBegin(GL_LINE_STRIP); glEnd(); glPopMatrix(); glutSwapBuffers();//双缓存技术的函数,作用为交换两个缓冲区的指针}void spinDisplay(void){ spin = spin + 0.04; if (spin > 360.0) { spin = spin - 360.0; } glutPostRedisplay();//glutPostRedisplay 标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板}void reshape(int w, int h){ glViewport(0, 0, (GLsizei)w, (GLsizei)h);//函数作用:用一个视景体截取图像 glMatrixMode(GL_PROJECTION);//mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,参数表示接下来要进行投影相关的操作 glLoadIdentity();//设置当前变化矩阵为单位矩阵;单位矩阵就是对角线上都是1,其余元素皆为0的矩阵。然后复位 glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW);//进行视景相关的操作 glLoadIdentity();}void mouse(int button, int state, int x, int y){ switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(spinDisplay);//glutIdleFunc函数如果启用,这个idle function会被不断调用,直到有窗口事件发生 break; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; }}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(680, 680); glutInitWindowPosition(400, 0); glutCreateWindow("big homework"); init(); glutDisplayFunc(display);//每次重绘场景时调用 glutCreateMenu(fillOption); glutAddMenuEntry("amount", 1); glutAddMenuEntry("reverse", 2); glutAddMenuEntry("narrow", 3); glutAttachMenu(GLUT_RIGHT_BUTTON); glutReshapeFunc(reshape);//每次窗口改变时调用 glutMouseFunc(mouse);//每次使用鼠标时调用 glutMainLoop(); return 0;}

 

转载于:https://www.cnblogs.com/pqhuang/p/11270197.html

你可能感兴趣的文章
How to read very large text files fast
查看>>
Java读取.properties配置文件
查看>>
java绘制带姓的圆
查看>>
android数据的4种存储方式
查看>>
css缓存问题
查看>>
3dmax_FBX转havok_model
查看>>
Linux常用命令
查看>>
实验三 二叉树
查看>>
几种交叉验证(cross validation)方式的比较
查看>>
第44章:MongoDB-集群--Sharding(分片)--分片的片键选择
查看>>
自定义ISO结构
查看>>
7.11 animals.c 程序
查看>>
java Web三大组件--过滤器
查看>>
使用NUnit为游戏项目编写高质量单元测试的思考
查看>>
Uva 1638 Pole Arrangement
查看>>
Java内存泄漏
查看>>
逻辑函数的代数化简法
查看>>
第十一周PSP&进度条
查看>>
hdu 1501 DFS+记忆化搜索
查看>>
试说移动端是如何调试的?
查看>>