OpengGL
来源:互联网 发布:hecras软件 编辑:程序博客网 时间:2024/06/09 18:46
程序运行效果:
代码如下:
#include<gl/glut.h>#include<math.h>#include<windows.h>#include<algorithm>using namespace std;const GLubyte index[] = { 0, 3, 2, 1, 2, 3, 7, 6, 0, 4, 7, 3, 0, 1, 5, 4, 1, 2, 6, 5, 4, 5, 6, 7 };const float vertex[] = { -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0,-1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0 };const float color[] = { 0, 0, 0, 1.0, 0, 0, 1.0, 1.0, 0, 0, 1.0, 0,0, 0, 1.0, 1.0, 0, 1.0, 1.0, 1.0, 1.0, 0, 1.0, 1.0 };float speed = 0.1;int der = 3; //0x轴,1y轴,2z轴float angle[] = { 0, 0, 0, 0 };int pr_x, pr_y; //上次鼠标位置void myDisplay(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存 glLoadIdentity(); glTranslated(0, 0, -6); glRotatef(angle[0], 1, 0, 0); glRotatef(angle[1], 0, 1, 0); glRotatef(angle[2], 0, 0, 1); glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, index); //绘制正方体 glutSwapBuffers();}void idle(){ if (der == 3) return; angle[der] += speed; if (angle[der] > 360) angle[der] -= 360; if (angle[der] < 0) angle[der] += 360; glutPostRedisplay();}void keyboard(unsigned char key, int x, int y){ if (key == 27) //按ESC退出程序 exit(0); else if (key == '+') speed = min(1.0, speed + 0.02); else if (key == '-') speed = max(0.01, speed - 0.02); else if (key == 'x') der = 0; else if (key == 'y') der = 1; else if (key == 'z') der = 2; else if (key == 'p') der = 3;}void motion(int x,int y){ if (der != 3) return; if (x > pr_x) angle[1] += 1.5; if (x < pr_x) angle[1] -= 1.5; if (y > pr_y) angle[0] += 1.5; if (y < pr_y) angle[0] -= 1.5; pr_x = x; pr_y = y; glutPostRedisplay();}void Reshape(int w, int h) //两个参数:窗口被移动后大小{ glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)w / (GLfloat)h, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}void initWindow(int &argc, char *argv[], int width, int height, char *title) //初始化并显示到屏幕中央{ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); //使用双缓存模式和深度缓存 glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - width) >> 1, (GetSystemMetrics(SM_CYSCREEN) - height) >> 1); //指定窗口位置 glutInitWindowSize(width, height); //指定窗口大小 glutCreateWindow(title); glClearColor(1, 1, 1, 0); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST);//激活深度测试 glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertex); glColorPointer(3, GL_FLOAT, 0, color); pr_x = width / 2.0; pr_y = height / 2.0;}int main(int argc, char *argv[]){ initWindow(argc, argv, 600, 600, "彩色立方体"); puts("\n键盘操作: \n\t+加速,-减速,p暂停旋转\n\tx围x轴旋转,y围y轴旋转,z围z轴旋转"); puts("\n鼠标操作: 左键拖动实现旋转"); glutDisplayFunc(myDisplay); glutReshapeFunc(Reshape); glutIdleFunc(idle); glutMotionFunc(motion); glutKeyboardFunc(keyboard); glutMainLoop(); return 0;}
阅读全文
1 0
- OpengGL
- openggl 的神奇
- VS2010 配置 OpengGL
- OpengGL 矩阵变换
- OpengGL 函数命名
- OpengGL GLSL Computational Invariance
- OpengGL显示列表
- opengGL MFC混合编程
- OpengGL 4.3 Qt5 数据基础
- 简单的OpengGL ES 的使用
- vs2013中配置OpengGL的编程环境
- opengGL深度测试介绍及代码测试
- OpengGL绘制立方体的三种方法
- OpengGL第八版的第一个例子
- OpengGL ES 背面剪裁和卷绕
- 第一个OpengGL程序——三角形的显示
- OpengGL ES的内存贴图(从界面取贴图)
- 发个我用OpengGL写的Matlab程序
- 洛谷P1084:疫情控制 (二分答案+倍增+贪心)
- 指针
- 使用字节流复制文件过程中容易导致复制的文件无法使用(如MP3文件比原来大了一千多倍且音乐无法播放)很严重的一个bug
- IFE-TASK11(任务十一:移动Web页面布局实践)
- 菜鸟先飞之JAVA_反射
- OpengGL
- java多线程中死锁实例
- Partition Equal Subset Sum问题及解法
- Matlab GUI图形化界面,坐标
- JavaScript中判断对象类型的几种方法总结
- 观光旅游
- AMD与CMD标准的区别
- 快速排序 快速搞定
- jdk环境配置