我想使用键盘键在路径上移动对象,但是在使用键盘功能后对象没有移动。请帮助我。在应用键盘功能后对象没有从其位置移动。
我想为wave / path添加3种不同的功能,因此键盘交互对我来说是必要的,这样我就可以针对不同的场景使用不同的键。
void object()
{
glPushMatrix();
glTranslatef(x, y, 0);
glBegin(GL_LINES);
glColor3f(0, 0, 0);
glVertex2f(-0.3, 0.1);
glVertex2f(0.3, 0.1);
glEnd();
glPopMatrix();
glFlush();
}
void drawsine()
{ glBegin(GL_LINE_STRIP);//Primitive
glColor3f(255, 0, 0);//Set drawing color
int i = 0;
float x = 0, y = 0;
for (x = -5; x < 6; x = x + 0.1)
{ y = (sin(3.142*x)) / 3.142*x;
glVertex2f(x, y);
sinex[i] = x;
siney[i] = y;
i++;}
glEnd();
glFlush();
}
void doFrame(int v) {
//x = sinex[i];
//y = siney[i];
if (x < 5.9)
{
x += 0.1;
y = (sin(3.142*x)) / 3.142*x;
}
glutPostRedisplay();
//glutTimerFunc(x,doFrame,0);
}
void scene1()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
drawsine();
glPopMatrix();
//glScaled(0.3, 0.3, 1);
object();
//glutTimerFunc(30,doFrame,0);
glutSwapBuffers();
}
void exit(void)
{
exit(-1);
}
void myKeyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'h':
{
scene1(); }
break;
case 'e':
{
exit(); }
break;
}
}
void display() {
//glClear(GL_COLOR_BUFFER_BIT);
}
void init() {
glClearColor(1, 1, 1, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-5, 7, -5, 5, -1, 1);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(700, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Roller Coaster Simulation");
init();
glutDisplayFunc(display);
glutTimerFunc(200, doFrame, 0);
glutKeyboardFunc(myKeyboard);
glutMainLoop();
return 0;
}
答案 0 :(得分:1)
您必须在显示回调glutDisplayFunc
中绘制场景。
添加场景状态(current_scene
)并在按下键时切换状态:
例如
int current_scene = 1;
void myKeyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'h': current_scene = 1; break;
case 'i': current_scene = 2; break;
// [...]
}
}
根据显示回调中的状态绘制场景:
void display() {
glClear(GL_COLOR_BUFFER_BIT);
switch(current_scene) {
case 1: scene1(); break;
case 2: scene2(); break;
// [...]
}
glutSwapBuffers();
glutPostRedisplay();
}
我建议仅在disaply
中进行缓冲区交换(glutSwapBuffers
)。从其他功能中删除它。
使用glutPostRedisplay
将当前窗口标记为需要连续重新显示。