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. }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章