OpenGl scale + translate无效

时间:2017-08-25 18:55:17

标签: opengl glut

我在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的顺序尝试了这个(我在类似的问题中读到了这个)。但它也没有用。

1 个答案:

答案 0 :(得分:2)

一些事项 - 您是通过glMatrixMode来切换模式吗?

切换后你是在调用glLoadIdentity()吗?

我假设您正在清除每个渲染的深度(如果启用)和颜色缓冲区?

我个人倾向于推/弹矩阵,除非我打电话给第三方并且我想保持现状...但没有伤害。

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年被弃用了。

否则,更完整的代码示例(包括相机定位代码和值以及屏幕截图和预期结果)可能会有所帮助。