【问题标题】:OpenGL moving a scene around the cameraOpenGL 在相机周围移动场景
【发布时间】: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() 并没有改变任何事情,因为我还没有在任何地方切换到投影,我确实对其进行了测试,但结果是一样的。

标签: c++ opengl camera


【解决方案1】:

我找到了解决方案,在尝试了一些随机的事情后,我发现我只需要交换旋转和平移,x 和 y 旋转必须在平移之前发生。

这解决了我的问题中描述的每个问题,相机保持在 y = 8 并且旋转不再围绕起点发生,而是围绕相机所在的点发生,移动也是固定的,当向前按下相机沿原来的 Z 轴移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多