我在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的顺序尝试了这个(我在类似的问题中读到了这个)。但它也没有用。
答案 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年被弃用了。
否则,更完整的代码示例(包括相机定位代码和值以及屏幕截图和预期结果)可能会有所帮助。