OpenGL学习(二)——键盘输入处理与三维对象运动

一 目标

    用线框绘制两个球体,命名为地球和月球。实现月球的自装和公转,并通过键盘输入控制旋转的方向

二 参考资料

1、glPushMatrix()和glPopMatrix():https://blog.csdn.net/tyxkzzf/article/details/40907273

2、键盘控制:https://blog.csdn.net/xie_zi/article/details/1911891

三 源代码

  1. #include<GL\glut.h>  
  2. #include<math.h>  
  3.   
  4. #define pi 3.1415926  
  5.   
  6. //----------------//  
  7. // 观察坐标系参数 //  
  8. //----------------//  
  9.   
  10. //观察坐标系原点  
  11. GLdouble x = 0.0;  
  12. GLdouble y = 2.0;  
  13. GLdouble z = 20.0;  
  14. //视点  
  15. GLdouble X = 0.0;  
  16. GLdouble Y = 0.0;  
  17. GLdouble Z = 0.0;  
  18. //向上向量  
  19. GLdouble vx = 0.0;  
  20. GLdouble vy = 1.0;  
  21. GLdouble vz = 0.0;  
  22.   
  23. //---------------------------//  
  24. //    定义星球旋转相关参数    //  
  25. //---------------------------//  
  26.   
  27. GLint distance = 25; //星球间距离  
  28. GLdouble moonAngle = 0; //月球自转角度  
  29. GLdouble revoAngle = 0; //公转角度  
  30.   
  31. //地球坐标  
  32. GLdouble earthX = 0;  
  33. GLdouble earthY = 0;  
  34. GLdouble earthZ = 0;  
  35.   
  36. //月球坐标  
  37. GLdouble moonX = distance;  
  38. GLdouble moonY = 0;  
  39. GLdouble moonZ = 0;  
  40.   
  41. //星球大小  
  42. GLint earthSize = 8;  
  43. GLint moonSize = 5;  
  44.   
  45. //月球自转、公转方向  
  46. bool direction1 = false;//控制自转  
  47. bool direction2 = false;//控制公转  
  48.   
  49. void init_observe()  
  50. {  
  51.     glClearColor(0.0, 0.0, 0.0, 0.0);  
  52.     glMatrixMode(GL_MODELVIEW);  
  53.     gluLookAt(x, y, z, X, Y, Z, vx, vy, vz);  
  54.     glMatrixMode(GL_PROJECTION);  
  55.     glFrustum(-3.0, 3.0, -3.0, 3.0, 1.0, 30.0);  
  56. }  
  57.   
  58. void drawPlanet(GLfloat x, GLfloat y, GLfloat z, GLfloat angle, GLint size)  
  59. {  
  60.     glMatrixMode(GL_MODELVIEW);  
  61.     glPushMatrix();  
  62.   
  63.     glTranslatef(x, y, z); //平移坐标系  
  64.     glRotatef(angle, 0.0, 0.0, 1.0); //旋转坐标系  
  65.     glutWireSphere(size, 10, 10); //绘制线框球体,包括10条经线和10条纬线  
  66.   
  67.     glPopMatrix();  
  68. }  
  69.   
  70. void revolution()  
  71. {  
  72.     if (direction1)  
  73.     {  
  74.         moonAngle += 0.1;  
  75.         if (moonAngle >= 360)  
  76.             moonAngle -= 360;  
  77.     }  
  78.     else  
  79.     {  
  80.         moonAngle -= 0.1;  
  81.         if (moonAngle <= 0)  
  82.             moonAngle += 360;  
  83.     }  
  84.     if (direction2)  
  85.     {  
  86.         revoAngle += 0.01;  
  87.         if (revoAngle >= 360)  
  88.             revoAngle -= 360;  
  89.     }  
  90.     else  
  91.     {  
  92.         revoAngle -= 0.01;  
  93.         if (revoAngle <= 0)  
  94.             revoAngle += 360;  
  95.     }  
  96.   
  97.     moonX = (GLdouble)distance*cos(revoAngle*pi/180);  
  98.     moonY = (GLdouble)distance*sin(revoAngle*pi/180); //计算月球坐标  
  99. }  
  100.   
  101. void keyboard(unsigned char k, int x, int y)  
  102. {  
  103.     if (k == 27)  
  104.         exit(0);  
  105.   
  106.     int mod;  
  107.     if (k == 'd'||k == 'D')  
  108.     {  
  109.         mod = glutGetModifiers();  
  110.         if (mod == GLUT_ACTIVE_SHIFT) // shift 被按下  
  111.             direction1 = false;  
  112.         else  
  113.             direction1 = true;  
  114.     }  
  115.     else if (k == 'y'||k == 'Y')  
  116.     {  
  117.         mod = glutGetModifiers();  
  118.         if (mod == GLUT_ACTIVE_SHIFT)  
  119.             direction2 = false;  
  120.         else  
  121.             direction2 = true;  
  122.     }  
  123. }  
  124.   
  125. void display()  
  126. {  
  127.     glClear(GL_COLOR_BUFFER_BIT);  
  128.   
  129.     //draw earth  
  130.     glColor3f(0.0, 0.0, 1.0);  
  131.     drawPlanet(earthX, earthY, earthZ, 0, earthSize);  
  132.     //draw moon  
  133.     glColor3f(0.0, 1.0, 1.0);  
  134.     drawPlanet(moonX, moonY, moonZ, moonAngle, moonSize);  
  135.   
  136.     glFlush();  
  137.     revolution();  
  138.     glutPostRedisplay();  
  139. }  
  140.   
  141. void main(int argc, char**argv)  
  142. {  
  143.     glutInit(&argc, argv);  
  144.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
  145.     glutInitWindowPosition(10, 10);  
  146.     glutInitWindowSize(700, 700);  
  147.     glutCreateWindow("Planet");  
  148.     init_observe();  
  149.   
  150.     glutDisplayFunc(display);  
  151.     glutKeyboardFunc(keyboard);  
  152.     glutMainLoop();  
  153. }  

猜你喜欢

转载自blog.csdn.net/N_Young/article/details/80385319