关于c ++:OpenGL在相机周围移动场景

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轴移动时。