如何在opengl代码中捕获键盘输入以停止动画。

如何在opengl代码中捕获键盘输入以停止动画。,opengl,Opengl,我有一些从左到右移动玩具车的代码 我想通过按下任何键来转换代码以停止其移动,例如“s”……有人能帮我这么做吗……这是到目前为止我的代码 #include <GL/glut.h> // Header File For The GLUT Library #include <GL/gl.h> // Header File For The OpenGL32 Library #include <GL/glu.h> // Header File F

我有一些从左到右移动玩具车的代码

我想通过按下任何键来转换代码以停止其移动,例如“s”……有人能帮我这么做吗……这是到目前为止我的代码

#include <GL/glut.h>    // Header File For The GLUT Library  
#include <GL/gl.h>    // Header File For The OpenGL32 Library 
#include <GL/glu.h>    // Header File For The GLu32 Library 
//#include <unistd.h>     // Header File For sleeping. 

/* ASCII code for the escape key. */ 
#define ESCAPE 27 

/* The number of our GLUT window */ 
int window;  

 /* rotation angle for the triangle. */  
float rtri = 0.0f; 

 /* rotation angle for the quadrilateral. */ 
float rquad = 0.0f; 

/* A general OpenGL initialization function.  Sets all of the initial parameters. */ 
// We call this right after our OpenGL window is created. 
void InitGL(int Width, int Height)         
{
 // This Will Clear The Background Color To Black 
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);      
 glClearDepth(1.0);                // Enables Clearing Of The Depth Buffer 
 glDepthFunc(GL_LESS);                // The Type Of Depth Test To Do 
 glEnable(GL_DEPTH_TEST);            // Enables Depth Testing 
 glShadeModel(GL_SMOOTH);            // Enables Smooth Color Shading 

 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity();                // Reset The Projection Matrix 

 gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);   


 glMatrixMode(GL_MODELVIEW); 
} 

 /* The function called when our window is resized (which shouldn't happen, because       we're fullscreen) */ 
 void ReSizeGLScene(int Width, int Height) 
 { 
  if (Height==0)                // Prevent A Divide By Zero If The Window Is Too Small 
  Height=1; 

  glViewport(0, 0, Width, Height);        // Reset The Current Viewport And Perspective    Transformation 

  glMatrixMode(GL_PROJECTION); 
  glLoadIdentity(); 

  gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); 
  glMatrixMode(GL_MODELVIEW); 
  } 

   float ballX = -0.5f; 
   float ballY = 0.0f; 
   float ballZ = 0.0f; 

    void drawBall(void) { 

    glColor3f(0.0, 1.0, 0.0); //set ball colour 
    glTranslatef(ballX,ballY,ballZ); //moving it toward the screen a bit on creation 
    //glRotatef(ballX,ballX,ballY,ballZ); 
    glutSolidSphere (0.3, 20, 20); //create ball. 
    glTranslatef(ballX+1.5,ballY,ballZ); //moving it toward the screen a bit on creation 
    glutSolidSphere (0.3, 20, 20); // 

    } 


   /* The main drawing function. */ 
      void DrawGLScene() 
       { 
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        // Clear The  Screen And The Depth Buffer 
          glLoadIdentity();                // Reset The View 

          glTranslatef(rtri,0.0f,-6.0f);        // Move Left 1.5 Units And Into The Screen 6.0 

          //glRotatef(rtri,1.0f,0.0f,0.0f);        // Rotate The Triangle On The Y axis 
          // draw a triangle (in smooth coloring mode) 
          glBegin(GL_POLYGON);                // start drawing a polygon 
          glColor3f(1.0f,0.0f,0.0f);            // Set The Color To Red 
          glVertex3f(-1.0f, 1.0f, 0.0f);        // Top left 
          glVertex3f(0.4f, 1.0f, 0.0f); 

          glVertex3f(1.0f, 0.4f, 0.0f); 

          glColor3f(0.0f,1.0f,0.0f);            // Set The Color To Green 
          glVertex3f( 1.0f,0.0f, 0.0f);        // Bottom Right 
          glColor3f(0.0f,0.0f,1.0f);            // Set The Color To Blue 
          glVertex3f(-1.0f,0.0f, 0.0f);// Bottom Left     

      //glVertex3f(); 
     glEnd();                    // we're done with the polygon (smooth color interpolation) 
   drawBall(); 

   rtri+=0.005f;                    // Increase The Rotation Variable For The Triangle 
   if(rtri>2) 
    rtri=-2.0f; 
   rquad-=15.0f;                    // Decrease The Rotation Variable For The Quad 

  // swap the buffers to display, since double buffering is used. 
   glutSwapBuffers(); 
  } 

    /* The function called whenever a key is pressed. */ 
void keyPressed(unsigned char key, int x, int y)  
{ 
/* sleep to avoid thrashing this procedure */ 
// usleep(100); 

/* If escape is pressed, kill everything. */ 
if (key == ESCAPE)  
{  
/* shut down our window */ 
glutDestroyWindow(window); 

/* exit the program...normal termination. */ 
exit(0);                   
} 
}


int main(int argc, char **argv)  
{   
 glutInit(&argc, argv);   

 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);   

  /* get a 640 x 480 window */ 
  glutInitWindowSize(640, 480);   

  /* the window starts at the upper left corner of the screen */ 
  glutInitWindowPosition(0, 0);   

  /* Open a window */   
  window = glutCreateWindow("Moving Car");   

  /* Register the function to do all our OpenGL drawing. */ 
  glutDisplayFunc(&DrawGLScene);   

  /* Go fullscreen.  This is as soon as possible. */ 
  //glutFullScreen(); 

  /* Even if there are no events, redraw our gl scene. */ 
  glutIdleFunc(&DrawGLScene); 

  /* Register the function called when our window is resized. */ 
  glutReshapeFunc(&ReSizeGLScene); 

  /* Register the function called when the keyboard is pressed. */ 
  glutKeyboardFunc(&keyPressed); 

  /* Initialize our window. */ 
  InitGL(640, 480); 

  /* Start Event Processing Engine */   
  glutMainLoop();   

   return 1; 
  }
#包含//GLUT库的头文件
#包含//OpenGL32库的头文件
#包含//GLu32库的头文件
//#包括//用于睡眠的头文件。
/*转义键的ASCII码。*/
#定义逃逸27
/*我们的过剩窗口的数量*/
int窗口;
/*三角形的旋转角度。*/
浮动rtri=0.0f;
/*四边形的旋转角度。*/
浮动rquad=0.0f;
/*一个通用的OpenGL初始化函数。设置所有初始参数。*/
//我们在OpenGL窗口创建后立即调用它。
void InitGL(整数宽度、整数高度)
{
//这将清除背景色为黑色
glClearColor(0.0f、0.0f、0.0f、0.0f);
glClearDepth(1.0);//启用深度缓冲区的清除
glDepthFunc(GL_LESS);//要执行的深度测试类型
glEnable(GL_DEPTH_TEST);//启用深度测试
glShadeModel(GL_SMOOTH);//启用平滑颜色着色
glMatrixMode(GL_投影);
glLoadIdentity();//重置投影矩阵
透视图(45.0f,(GLfloat)宽度/(GLfloat)高度,0.1f,100.0f);
glMatrixMode(GLU模型视图);
} 
/*调整窗口大小时调用的函数(这不应该发生,因为我们是全屏的)*/
void ReSizeGLScene(整数宽度、整数高度)
{ 
if(Height==0)//如果窗口太小,防止被零除
高度=1;
glViewport(0,0,宽度,高度);//重置当前视口和透视变换
glMatrixMode(GL_投影);
glLoadIdentity();
透视图(45.0f,(GLfloat)宽度/(GLfloat)高度,0.1f,100.0f);
glMatrixMode(GLU模型视图);
} 
浮球x=-0.5f;
浮球Y=0.0f;
浮球Z=0.0f;
无效牵引杆(无效){
glColor3f(0.0,1.0,0.0);//设置球的颜色
glTranslatef(ballX,ballY,ballZ);//在创建时将其移到屏幕上一点
//glRotatef(ballX,ballX,ballY,ballZ);
glutSolidSphere(0.3,20,20);//创建球。
glTranslatef(ballX+1.5,ballY,ballZ);//在创建时将其向屏幕移动一点
实心球体(0.3,20,20);//
} 
/*主要绘图功能。*/
void DrawGLScene()
{ 
glClear(GL_颜色_缓冲区| GL_深度_缓冲区|位);//清除屏幕和深度缓冲区
glLoadIdentity();//重置视图
glTranslatef(rtri,0.0f,-6.0f);//向左移动1.5个单位,进入屏幕6.0
//glRotatef(rtri,1.0f,0.0f,0.0f);//在Y轴上旋转三角形
//绘制三角形(在平滑着色模式下)
glBegin(GL_POLYGON);//开始绘制多边形
glColor3f(1.0f,0.0f,0.0f);//将颜色设置为红色
glVertex3f(-1.0f,1.0f,0.0f);//左上角
glVertex3f(0.4f、1.0f、0.0f);
glVertex3f(1.0f,0.4f,0.0f);
glColor3f(0.0f,1.0f,0.0f);//将颜色设置为绿色
glVertex3f(1.0f,0.0f,0.0f);//右下角
glColor3f(0.0f,0.0f,1.0f);//将颜色设置为蓝色
glVertex3f(-1.0f,0.0f,0.0f);//左下角
//glVertex3f();
glEnd();//多边形已经完成(平滑颜色插值)
牵引杆();
rtri+=0.005f;//增加三角形的旋转变量
如果(rtri>2)
rtri=-2.0f;
rquad-=15.0f;//减小Quad的旋转变量
//交换缓冲区以显示,因为使用了双缓冲。
glutSwapBuffers();
} 
/*每当按键时调用的函数。*/
按下void键(无符号字符键,整数x,整数y)
{ 
/*睡眠以避免重击此过程*/
//usleep(100);
/*如果按下escape,则杀死一切。*/
如果(键==转义)
{  
/*关上我们的窗户*/
窗口(窗口);
/*退出程序…正常终止。*/
出口(0);
} 
}
int main(int argc,字符**argv)
{   
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_深度);
/*获得一个640 x 480的窗口*/
GLUTINITWindowsSize(640480);
/*窗口从屏幕左上角开始*/
glutInitWindowPosition(0,0);
/*打开一个窗口*/
车窗=车窗(“移动车辆”);
/*注册函数以完成所有OpenGL绘图。*/
glutDisplayFunc(&DrawGLScene);
/*全屏显示。这是最快的。*/
//全屏显示();
/*即使没有事件,也要重新绘制gl场景。*/
glutIdleFunc(&DrawGLScene);
/*注册调整窗口大小时调用的函数。*/
GLUTEFUNC(&ReSizeGLScene);
/*注册按下键盘时调用的函数。*/
glutKeyboardFunc(按下键(&C));
/*初始化我们的窗口。*/
InitGL(640480);
/*启动事件处理引擎*/
glutMainLoop();
返回1;
}

有条件地禁用以下代码位:

rtri+=0.005f;                    // Increase The Rotation Variable For The Triangle 
if(rtri>2) 
 rtri=-2.0f; 
rquad-=15.0f;                    // Decrease The Rotation Variable For The Quad 
这可以通过将以下内容添加到
按键
功能中来实现

if (key == S)  
{  
updateGeom = false;//stop updating
} 
if (key == D)  
{  
updateGeom = true;//start updating
} 
并将上述代码更改为

if(updageGeom){
    rtri+=0.005f;                    // Increase The Rotation Variable For The Triangle 
    if(rtri>2) 
     rtri=-2.0f; 
    rquad-=15.0f;                    // Decrease The Rotation Variable For The Quad 
}
您还需要添加一个全局布尔值
updateGeom