如何在opengl代码中捕获键盘输入以停止动画。
我有一些从左到右移动玩具车的代码 我想通过按下任何键来转换代码以停止其移动,例如“s”……有人能帮我这么做吗……这是到目前为止我的代码如何在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
#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