在太阳能系统openGL程序中实现箭头键

时间:2012-04-19 20:31:28

标签: c opengl glut

作为我的太阳系计划的一部分,一切都得到了很好的实施和说法,我试图扩展我的程序,包括用户可以绕着奥里飞行或换句话说,从太空飞船中观看飞行通过使用方向键。这就是我基本上做的:

   void keyboard(unsigned char key, int x, int y)
    {
      switch (key)
      {
        case 27:  /* Escape key */
                 exit(0);
                 break;
        case (GLUT_KEY_LEFT): lon += TURN_ANGLE;
                              if(lon == 360)
                                lon = 0;
                  break;
        case (GLUT_KEY_RIGHT):
                              lon -= TURN_ANGLE;
                  if(lon == -360)
                               lon = 0;
                  break;
        case (GLUT_KEY_PAGE_UP): 
                              if(lat  + TURN_ANGLE <= 90)
                               lat += TURN_ANGLE;
                              break;
        case (GLUT_KEY_UP):   eyex += sin(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              eyez += cos(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              break;
        case (GLUT_KEY_DOWN): eyex -= sin(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              eyez -= cos(DEG_TO_RAD * (lon)) * RUN_SPEED;
                              break;
        default: break;


      }
    } 

其中latlon是与当前视点(eyexeyeyeyez)一起使用的全局角度,以及 距离XZ平面中的步距RUN_SPEED。我不知道为什么这部分不工作,即使我没有在这部分得到任何错误所有编译文件但箭头键不起作用。有帮助吗?

1 个答案:

答案 0 :(得分:2)

使用glutKeyboardFunc(),您只能捕获简单的ASCII字母,以便响应设置单独事件处理程序所需的其余键:glutSpecialFunc()

请注意,特殊处理程序的签名稍有改变:

void special(int key, int x, int y)
{
  switch (key)
  {
    case GLUT_KEY_LEFT: lon += TURN_ANGLE;
                          if(lon == 360)
                            lon = 0;
              break;
    /* ... */
    default: break;
  }
}

请记住,这个特殊的处理程序替换您一直在使用的键盘处理程序,它只是补充它。