OpenGL moving a scene around the camera
我在一个小的3D世界里工作,现在我正在修理相机。
相机在世界上保持固定的位置,而世界可以通过鼠标和键盘(模拟相机在世界上移动)围绕它移动。
以下是我的draw函数中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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个多边形的简单示例)
我找到了解决方案,在尝试了一些随机的事情之后,我发现我只需要交换旋转和平移,x和y旋转必须在平移之前发生。
这解决了我问题中描述的所有问题,相机保持Y=8,旋转不再发生在起点周围,而是发生在相机所在的点周围,移动也固定,当向前按相机沿原始Z轴移动时。