C++ OpenGL键盘照相机控件

C++ OpenGL键盘照相机控件,c++,opengl,input,keyboard,glut,C++,Opengl,Input,Keyboard,Glut,我一直在关注本系列教程:: 我已达到使用键盘实现摄像头控制的阶段: http://www.lighthouse3d.com/opengl/glut/index.php?8 在执行高级教程时,它将停止工作。我几乎只是复制并粘贴了它。当我运行它的代码版本时,它可以工作。我的好像不行。它应该在左右移动时旋转相机视图,在使用上下键时向前和向后移动 我的代码如下: 这部分代码使用init()渲染场景中的组件,init()初始化值等: void display(void) { if (deltaMove

我一直在关注本系列教程::

我已达到使用键盘实现摄像头控制的阶段:

http://www.lighthouse3d.com/opengl/glut/index.php?8
在执行高级教程时,它将停止工作。我几乎只是复制并粘贴了它。当我运行它的代码版本时,它可以工作。我的好像不行。它应该在左右移动时旋转相机视图,在使用上下键时向前和向后移动

我的代码如下:

这部分代码使用init()渲染场景中的组件,init()初始化值等:

void display(void)
{
 if (deltaMove)
  moveMeFlat(deltaMove);
 if (deltaAngle) {
  angle += deltaAngle;
  orientMe(angle);
 }

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glBindTexture(GL_TEXTURE_2D, texture[0]);
 RenderSkyDome();
 glBindTexture(GL_TEXTURE_2D, NULL);

 glutSwapBuffers();

}

void init(void)
{
 glClearColor(0.0, 0.0, 0.0, 0.0);
 glClearDepth(1.0f);
 glColor3f(0.0, 0.0, 1.0);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glEnable(GL_TEXTURE_2D);
 glEnable(GL_DEPTH_TEST);
 glDepthFunc(GL_LEQUAL);
 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

 LoadTextures("clouds2.bmp", 0);
 GenerateDome(600.0f, 5.0f, 5.0f, 1.0f, 1.0f);

 snowman_display_list = createDL();
}
这是我的主要循环函数:

int main ()
{
 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
 glutInitWindowSize(800, 600);
 glutInitWindowPosition(0, 0);
 glutCreateWindow("Captain Ed's Adventures: Great Wall of China");
 init();

 //Glut Input Commands
 glutIgnoreKeyRepeat(1);
 glutSpecialFunc(pressKey);
 glutSpecialUpFunc(releaseKey);
 glutKeyboardFunc(processNormalKeys);

 glutDisplayFunc(display);
 glutIdleFunc(display);
 glutReshapeFunc(reshape);  // This redraws everything on screen when window size is changed.               
 glutMainLoop();
 return 0;
}
以下是我的输入函数,它们被称为:

void pressKey(int key, int x, int y) {

 switch (key) {
  case GLUT_KEY_LEFT : deltaAngle = -0.10f;break;
  case GLUT_KEY_RIGHT : deltaAngle = 0.10f;break;
  case GLUT_KEY_UP : deltaMove = 50;break;
  case GLUT_KEY_DOWN : deltaMove = -50;break;
 }
}

void releaseKey(int key, int x, int y) {

 switch (key) {
  case GLUT_KEY_LEFT : if (deltaAngle < 0.0f) 
         deltaAngle = 0.0f;
        break;
  case GLUT_KEY_RIGHT : if (deltaAngle > 0.0f) 
         deltaAngle = 0.0f;
        break;
  case GLUT_KEY_UP :  if (deltaMove > 0) 
         deltaMove = 0;
        break;
  case GLUT_KEY_DOWN : if (deltaMove < 0) 
         deltaMove = 0;
        break;
 }
}

void processNormalKeys(unsigned char key, int x, int y) {

 if (key == 27) 
  exit(0);
}
我相信这就是我正在处理的几乎所有事情,所以基本上应该发生的是,当我按下向上键deltaMove应该=50,当这种情况发生时,void display(void)中的if语句应该执行moveMeFlat(deltaMove);我不知道我是做错了还是有更好的结果

我可以在相关的开关盒内移动“moveMeFlat(deltaMove)”,但这不允许我进行我想要的移动。它似乎可以使用上面教程中的源代码并具有正确的功能,但在我的情况下不行,所以我的假设是它与display中的if语句有关


最终的结果,我期待的是能够有向前和向后的工作与左右旋转相机。我希望能够按下“前进”和“向左”键,并像在赛车游戏中一样看到相机向左…

当按下键时,过量是否处于空闲状态?我认为它不是闲置的。您的display()函数仅在创建窗口和GLUT空闲时调用,这不允许更改您的位置

我建议加上:

glutTimerFunc(40, display, 1);
到显示功能的末尾。这将导致每隔40毫秒调用一次display

另外,不要将display注册为idle函数,否则会让idle函数启动一系列定时器函数


另外,我会称之为glFlush();在交换display函数中的缓冲区之前。

尝试在所有全局变量声明之前去掉static

最后一次使用static是作为代码文件中的全局变量。在这种情况下,使用static表示作为项目一部分的其他文件中的源代码无法访问该变量。只有单个文件中的代码才能看到变量。(它的作用域或可见性仅限于文件。)此技术可用于模拟面向对象代码,因为它限制了变量的可见性,从而有助于避免命名冲突。这种对static的使用是C语言的保留

-

此外,与此相反:

if (deltaMove)
  moveMeFlat(deltaMove);
 if (deltaAngle) {
  angle += deltaAngle;
  orientMe(angle);
 }
试试这个:

if (deltaMove != 0)
  moveMeFlat(deltaMove);
 if (deltaAngle != 0.0) {
  angle += deltaAngle;
  orientMe(angle);
 }

这个问题已经讨论了很多问题,但仍然没有解决方案,请告诉我您是否可以帮忙,谢谢。解决方案可以在这里找到感谢glFlush提示解决方案可以在这个论坛帖子上找到
if (deltaMove)
  moveMeFlat(deltaMove);
 if (deltaAngle) {
  angle += deltaAngle;
  orientMe(angle);
 }
if (deltaMove != 0)
  moveMeFlat(deltaMove);
 if (deltaAngle != 0.0) {
  angle += deltaAngle;
  orientMe(angle);
 }