3D球体一个(纪念第一个opengl程序~~)

本文介绍了一个简单的OpenGL程序,该程序能够实现一个可交互的旋转球体。通过鼠标按键可以调节球体的颜色,键盘按键则控制球体的旋转。文中提供了完整的源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于搞定第一个像样的简单opengl程序,不过纹理贴图部分目前还是一头雾水啊,明天一定将其搞定。

 

先上个实例图:

 

功能很简单,使用鼠标的左中右键分别设置球体颜色的  RGB参数以调整颜色。

按a或d使球体旋转

 

代码如下

[cpp]  view plain  copy
  1. // display.cpp : Defines the entry point for the console application.  
  2. //  
  3. #include "stdafx.h"  
  4. #include <windows.h>  
  5. #include <gl/GL.h>  
  6. #include <gl/glu.h>  
  7. #include <gl/glut.h>  
  8. #include <cstdlib>  
  9. const GLfloat lightPosition[] = {10.0,10.0,10.0,0.0};  
  10. const GLfloat whiteLight[] = {0.8,0.8,0.8,1.0};  
  11. GLfloat matSpecular [] = {0.3,0.3,0.3,1.0};  
  12. GLfloat matShininess [] = {20.0};  
  13. GLfloat matEmission [] = {0.3,0.3,0.3,1.0};  
  14. GLfloat spin = 0;  
  15. void init()  
  16. {  
  17.     glClearColor(0.3,0.3,0.3,1.0);  
  18.     glClearDepth(1.0);  
  19.     glShadeModel(GL_SMOOTH);  
  20.     glEnable(GL_LIGHTING);  
  21.     glEnable(GL_LIGHT0);  
  22.     glEnable(GL_DEPTH_TEST);  
  23.     glMatrixMode(GL_MODELVIEW);  
  24.     glLoadIdentity();  
  25.     glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);  
  26.     glLightfv(GL_LIGHT0,GL_DIFFUSE,whiteLight);  
  27.     glLightfv(GL_LIGHT0,GL_SPECULAR,whiteLight);  
  28. }  
  29. void display()  
  30. {     
  31.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  
  32.     glMatrixMode(GL_PROJECTION);  
  33.     glLoadIdentity();;  
  34.     glOrtho(-10.0,10.0,-10.0,10.0,-10.0,10.0);  
  35.       
  36.     glMatrixMode(GL_MODELVIEW);  
  37.     glPushMatrix();  
  38.     glRotatef(spin,0.0,1.0,0.0);  
  39.     glMaterialfv(GL_FRONT,GL_SPECULAR,matSpecular);  
  40.     glMaterialfv(GL_FRONT,GL_SHININESS,matShininess);  
  41.     glMaterialfv(GL_FRONT,GL_EMISSION,matEmission);  
  42.     glutSolidSphere(3.0,16,16);  
  43.     glPopMatrix();  
  44.     glFlush();  
  45. }  
  46. void reshape(int w,int h)  
  47. {  
  48.     glViewport(0.0,0.0,(GLsizei) w,(GLsizei) h);  
  49. }  
  50. void keyboardFunc(unsigned char key,int x,int y)  
  51. {  
  52.     switch(key)  
  53.     {  
  54.     case 'a':  
  55.         spin +=30;  
  56.         break;  
  57.     case 'd':  
  58.         spin -=30;  
  59.         break;  
  60.     }  
  61.     if(spin<360)  
  62.         spin +=360;  
  63.     else if(spin>=360)  
  64.         spin -=360;  
  65.     glutPostRedisplay();  
  66. }  
  67. void mouseFunc(int button,int state,int x,int y)  
  68. {  
  69.     if(state==GLUT_DOWN){  
  70.     switch (button)  
  71.     {  
  72.     case GLUT_LEFT_BUTTON:  
  73.         matEmission[0]+=1.0;  
  74.         if(matEmission[0]>1.0)  
  75.             matEmission[0]-=1.1;  
  76.         break;  
  77.     case GLUT_MIDDLE_BUTTON:  
  78.         matEmission[1]+=1.0;  
  79.         if(matEmission[1]>1.0)  
  80.             matEmission[1]-=1.1;  
  81.         break;  
  82.     case GLUT_RIGHT_BUTTON:  
  83.         matEmission[2]+=1.0;  
  84.         if(matEmission[2]>1.0)  
  85.             matEmission[2]-=1.1;  
  86.         break;  
  87.     }  
  88.     glutPostRedisplay();      
  89.     }  
  90. }  
  91. int main(int argc,char *argv[])  
  92. {     
  93.     glutInit(&argc,argv);  
  94.     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);  
  95.     glutInitWindowSize(450,450);  
  96.     glutInitWindowPosition(150,150);  
  97.     glutCreateWindow("rotate sphere");  
  98.     glutDisplayFunc(display);  
  99.     glutReshapeFunc(reshape);  
  100.     glutKeyboardFunc(keyboardFunc);  
  101.     glutMouseFunc(mouseFunc);  
  102.     init();  
  103.     glutMainLoop();  
  104.     return EXIT_SUCCESS;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值