2

作为我的太阳能系统程序的一部分,一切都很好地实现了,我试图扩展我的程序以包括用户可以在 orrey 周围飞行,或者换句话说,从使用箭头键飞过太空的宇宙飞船上查看。这就是我基本上所做的:

   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是与当前眼点 ( eyex, eyey, eyez) 一起使用的全局角度,以及 RUN_SPEED在 XZ 平面中的步距。我不知道为什么这部分不起作用,即使我在这部分中没有任何错误,所有编译文件但箭头键不起作用。有什么帮助吗?

4

1 回答 1

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

请记住,这个特殊的处理程序不会取代您一直在使用的键盘处理程序,它只是对其进行补充。

于 2012-04-19T20:49:56.060 回答