【发布时间】:2014-07-31 11:35:24
【问题描述】:
我正在制作一个小型 3D 世界,现在我正在修理相机。
相机保持在世界中的固定位置,而世界可以用鼠标和键盘围绕它移动(模拟相机在世界中移动)。
这是我的绘图函数中的代码:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// store current matrix
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glPushMatrix( );
GLfloat light_pos [] = {3, -1, 0, 1};
GLfloat light_dir [] = {0, 0, -1};
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_dir);
glTranslated(-cam->getXPos(), -8, -cam->getZPos());
glRotated(cam->getYRot(), 1, 0, 0);
glRotated(cam->getXRot(), 0, 1, 0);
GLfloat diff [] = { .5, .5, .5, 1.0 };
glMaterialfv ( GL_FRONT, GL_DIFFUSE, diff );
glPushMatrix();
glTranslated(0, 0, -20);
glCallList(displayLists[LISTWALL]);
glPopMatrix();
// restore current matrix
glMatrixMode( GL_MODELVIEW );
glPopMatrix( );
只要我站着不动,只是环顾四周,一切都很好。 另一方面,当我移动时,奇怪的事情开始发生。
首先,相机的 Y 坐标发生变化,而它应该固定在 y = 8(这就是我将场景转换为 -8 的原因)
其次,当我尝试在世界中移动时,向前按应该只沿着 z 轴移动,但你会转到相机指向的位置(可能与第一个问题有关)
最后,当我在场景中四处走动时,四处张望的行为开始变得奇怪,看起来相机不仅围绕自身旋转,而且还围绕起点旋转。 (这在全 3D 世界中很明显,而不是我在这里展示的带有 1 个多边形的简单示例)
【问题讨论】:
-
立即想到两件事:1. 您很早就在调用
glLoadIdentity (...),从您显示的代码中,当前矩阵模式是未知的(您可以正在破坏你的投影矩阵)。 2. 在这种情况下弹出矩阵时,您不需要将矩阵模式设置回模型视图...因为它从一开始就没有改变。 -
@AndonM.Coleman 在更改为 MODEL_VIEW 后放置 loadIdentity() 并没有改变任何事情,因为我还没有在任何地方切换到投影,我确实对其进行了测试,但结果是一样的。