OpenGl 缩放 + 翻译不工作
OpenGl scale + translate not working
我在 Opengl (Glut) 中遇到以下问题。我已经使用 gluLookAt 将相机位置设置为 (posx,posy,posz),并且我需要在位置 (posx+offsetx,posy+offsety,posz+offsetz) 中显示一个缩放的立方体。我正在执行以下操作:
glPushMatrix();
glColor3f(0.6f,0.6f,0.6f);
glTranslatef( posx+offsetx, posy+offsety, posz+offsetz );
glScalef(20,20,60);
glutSolidCube(1.0);
glPopMatrix();
但是立方体没有出现在正确的位置。我也通过改变 glScalef 和 glTranslatef 的顺序来尝试这个(我在类似的问题中读到过)。但是也没用。
一些事情 - 您是否通过 glMatrixMode
在模式之间切换?
是否在切换后调用 glLoadIdentity()?
我假设您正在清除每次渲染的深度(如果启用)和颜色缓冲区?
我个人不倾向于 push/pop 矩阵,除非我正在调用第三方并且我想保持当前状态...但没有造成伤害。
gluLookAt
实际上只是一个转换本身,因此它可能不会按照您的预期进行。我假设您有一个如下所示的渲染函数:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(posx, posy, posz, // where the eye is located
0.0, 0.0, 0.0, // where the eye is looking
0.0, 1.0, 0.0); // which direction is "up"
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glPushMatrix();
glColor3f(0.6f,0.6f,0.6f);
glTranslatef( posx+offsetx, posy+offsety, posz+offsetz );
glScalef(20,20,60);
glutSolidCube(1.0);
glPopMatrix();
glutSwapBuffers();
你开始使用这样的东西:
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH );
glutInitWindowSize(600,400);
glutCreateWindow("Test");
glutDisplayFunc(displayFunctionName);
glutKeyboardFunc(keyboardFunctionName);
glutMainLoop();
这都是使用老式的 OpenGL 直接调用(有时称为固定功能管道)模式,这很好(尤其是刚开始时),但您可能想阅读有关着色器 (GLSL) 以及管道现在如何工作的内容因为这个东西在 2004 年被弃用了。
否则,一个更完整的代码示例(包括您的相机定位代码和值以及屏幕截图和预期结果)可能会有所帮助。
我在 Opengl (Glut) 中遇到以下问题。我已经使用 gluLookAt 将相机位置设置为 (posx,posy,posz),并且我需要在位置 (posx+offsetx,posy+offsety,posz+offsetz) 中显示一个缩放的立方体。我正在执行以下操作:
glPushMatrix();
glColor3f(0.6f,0.6f,0.6f);
glTranslatef( posx+offsetx, posy+offsety, posz+offsetz );
glScalef(20,20,60);
glutSolidCube(1.0);
glPopMatrix();
但是立方体没有出现在正确的位置。我也通过改变 glScalef 和 glTranslatef 的顺序来尝试这个(我在类似的问题中读到过)。但是也没用。
一些事情 - 您是否通过 glMatrixMode
在模式之间切换?
是否在切换后调用 glLoadIdentity()?
我假设您正在清除每次渲染的深度(如果启用)和颜色缓冲区?
我个人不倾向于 push/pop 矩阵,除非我正在调用第三方并且我想保持当前状态...但没有造成伤害。
gluLookAt
实际上只是一个转换本身,因此它可能不会按照您的预期进行。我假设您有一个如下所示的渲染函数:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(posx, posy, posz, // where the eye is located
0.0, 0.0, 0.0, // where the eye is looking
0.0, 1.0, 0.0); // which direction is "up"
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glPushMatrix();
glColor3f(0.6f,0.6f,0.6f);
glTranslatef( posx+offsetx, posy+offsety, posz+offsetz );
glScalef(20,20,60);
glutSolidCube(1.0);
glPopMatrix();
glutSwapBuffers();
你开始使用这样的东西:
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH );
glutInitWindowSize(600,400);
glutCreateWindow("Test");
glutDisplayFunc(displayFunctionName);
glutKeyboardFunc(keyboardFunctionName);
glutMainLoop();
这都是使用老式的 OpenGL 直接调用(有时称为固定功能管道)模式,这很好(尤其是刚开始时),但您可能想阅读有关着色器 (GLSL) 以及管道现在如何工作的内容因为这个东西在 2004 年被弃用了。
否则,一个更完整的代码示例(包括您的相机定位代码和值以及屏幕截图和预期结果)可能会有所帮助。