c - 在openGL程序中实现太阳能系统中的方向键

标签 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 步距。我不知道为什么这部分不起作用,即使我在这部分所有编译文件中没有收到任何错误,但箭头键不起作用。有什么帮助吗?

最佳答案

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

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

关于c - 在openGL程序中实现太阳能系统中的方向键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10236262/

相关文章:

c++ - OpenGL 法线贴图问题 - 法线可能朝向错误的方向?

c - 启动和停止 GLUT 动画

c++ - OpenGL 中的内存分配

c - 作为文本文件的版本控制?

c++ - 如何配置 autoreconf 使用不同于 GCC 的编译器

c++ - glDrawElements 崩溃(OpenGL 3.2/Windows 7)

java - GL 错误值 1285 : Out of memory

c++ - 宏可以在 #if 中与非数值进行比较吗

c - 在 LCD 显示屏上打印前三个重复元素

c++ - 如何将 "camera"放入 OpenGL 的立方体中