动态更改 gluPerspective() 的参数?
Change parameters of gluPerspective() dynamically?
为了理解gluPerspective()
是如何工作的,我想用键盘的箭头动态地改变它的参数(第一个是角度)。
如何让它工作,在回调函数中设置矩阵模式时是否有问题?
这是我目前的代码,但按下左箭头或右箭头时没有任何反应:
double angle = 45;
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 1, 1, 1);
glBegin(GL_TRIANGLES);
glVertex3f(-2, -2, -5.0);
glVertex3f(2, 0.0, -5.0);
glVertex3f(0.0, 2, -5.0);
glEnd();
glutSwapBuffers();
}
void keyboard(int c, int x, int y) {
switch (c) {
case GLUT_KEY_LEFT:
angle -= 15;
break;
case GLUT_KEY_RIGHT:
angle += 15;
break;
}
}
void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if (h == 0)
h = 1;
float ratio = 1.0* w / h;
// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);
// Reset Matrix
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(angle, ratio, 1, 1000);
// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(200, 300);//optional
glutInitWindowSize(800, 600); //optional
glutCreateWindow("OpenGL First Window");
glutDisplayFunc(renderScene);
glutSpecialFunc(keyboard);
glutReshapeFunc(changeSize);
glutMainLoop();
return 0;
}
传递给 glutReshapeFunc
的函数仅在 window 调整大小时调用。因此 gluPerspective
的新参数仅在此之后使用。例如,您可以在调整角度后手动调用该函数:
void keyboard(int c, int x, int y) {
switch (c) {
case GLUT_KEY_LEFT:
angle -= 15;
break;
case GLUT_KEY_RIGHT:
angle += 15;
break;
}
changeSize(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
}
您还没有通知显示回调函数更新您的新角度。
在键盘函数的最后调用函数 glutPostRedisplay()
以查看更新后的角度。
为了理解gluPerspective()
是如何工作的,我想用键盘的箭头动态地改变它的参数(第一个是角度)。
如何让它工作,在回调函数中设置矩阵模式时是否有问题?
这是我目前的代码,但按下左箭头或右箭头时没有任何反应:
double angle = 45;
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 1, 1, 1);
glBegin(GL_TRIANGLES);
glVertex3f(-2, -2, -5.0);
glVertex3f(2, 0.0, -5.0);
glVertex3f(0.0, 2, -5.0);
glEnd();
glutSwapBuffers();
}
void keyboard(int c, int x, int y) {
switch (c) {
case GLUT_KEY_LEFT:
angle -= 15;
break;
case GLUT_KEY_RIGHT:
angle += 15;
break;
}
}
void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if (h == 0)
h = 1;
float ratio = 1.0* w / h;
// Use the Projection Matrix
glMatrixMode(GL_PROJECTION);
// Reset Matrix
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(angle, ratio, 1, 1000);
// Get Back to the Modelview
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(200, 300);//optional
glutInitWindowSize(800, 600); //optional
glutCreateWindow("OpenGL First Window");
glutDisplayFunc(renderScene);
glutSpecialFunc(keyboard);
glutReshapeFunc(changeSize);
glutMainLoop();
return 0;
}
传递给 glutReshapeFunc
的函数仅在 window 调整大小时调用。因此 gluPerspective
的新参数仅在此之后使用。例如,您可以在调整角度后手动调用该函数:
void keyboard(int c, int x, int y) {
switch (c) {
case GLUT_KEY_LEFT:
angle -= 15;
break;
case GLUT_KEY_RIGHT:
angle += 15;
break;
}
changeSize(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
}
您还没有通知显示回调函数更新您的新角度。
在键盘函数的最后调用函数 glutPostRedisplay()
以查看更新后的角度。