OpenGL中gluLookAt相机定向异常问题求助
gluLookAt后无法正确调整相机朝向,模型显示异常 我现在遇到一个问题:无法按照预期调整相机朝向,已知需要用gluLookAt来设置相机——前三个参数是相机位置,中间三个是目标点,最后三个是相机的up向量。
我实现了一个由6个三角形组成的盒子,通过取所有三角形顶点的x、y、z平均值得到它的中心,然后让相机看向这个中心。以下是我的display函数代码:
Vect v=getBoxCenter(); gluLookAt(camera.pos.x, camera.pos.y, camera.pos.z, v.x,v.y,v.z, camera.upVector.x, camera.upVector.y, camera.upVector.z); glColor3f(1, 0, 0); glBegin(GL_TRIANGLES); glVertex3f(0, 0, 0); glVertex3f(100, 0, 0); glVertex3f(0, 100, 0); glEnd(); glutSwapBuffers();
未使用gluLookAt时,三角形能正常显示在屏幕中心,请问我哪里出错了?
我来帮你梳理几个最可能导致问题的原因,以及对应的解决方法:
缺少正确的投影矩阵配置
gluLookAt是用来设置视图矩阵的,但如果没有提前配置合适的投影矩阵,默认的投影范围可能极小,导致模型被完全裁剪。你需要在初始化阶段(比如init()函数)添加投影矩阵的设置:glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 配置透视投影:视场角45°、窗口宽高比、近裁剪面0.1、远裁剪面1000 gluPerspective(45.0, (double)glutGet(GLUT_WINDOW_WIDTH)/glutGet(GLUT_WINDOW_HEIGHT), 0.1, 1000.0); glMatrixMode(GL_MODELVIEW); // 切回模型视图矩阵,gluLookAt作用于此相机位置与目标点距离过近或重合
如果camera.pos和盒子中心v的坐标几乎重合,gluLookAt会因为视线方向向量长度为0而出现异常。你可以打印这两个点的坐标,确保相机处于盒子外部(比如设camera.pos为(0, 0, 500),盒子中心在原点附近),两者之间有足够的距离。Up向量设置错误
Up向量必须和视线方向(目标点 - 相机位置)不平行,否则相机的朝向会出现不确定的旋转。比如如果你的视线方向是沿着Y轴,而up向量也是(0,1,0),就会出问题。可以先尝试用默认的(0,1,0)作为up向量测试,确认相机是否能正常工作。调用
gluLookAt前未重置模型视图矩阵
如果之前的渲染循环修改过模型视图矩阵,没有调用glLoadIdentity()重置的话,gluLookAt会在已有矩阵的基础上叠加变换,导致最终视图混乱。所以在调用gluLookAt前,一定要先执行:glLoadIdentity();
另外,你测试用的三角形中心和盒子中心v是否一致?如果盒子中心不在这个三角形附近,相机看向盒子中心时,这个测试三角形可能不在相机视野范围内,也会导致看不到。可以先让相机看向这个三角形的中心,验证gluLookAt是否正常生效。
内容的提问来源于stack exchange,提问作者hebele

