gluLookAt持续旋转相机

时间:2019-07-26 10:48:31

标签: c++ opengl freeglut opengl-compat

我正在研究一个简单的2D自上而下的OpenGL游戏,其中摄影机跟随玩家。我使用gluLookAt将相机定位在播放器上方,并朝其方向看。但是,在运行游戏时,即使没有输入任何输入,相机也会保持绕轴旋转。

旋转速度取决于播放器和原点之间的距离,但是打印我传递给gluLookAt的值可以确认在相机旋转时它们没有被更改。那么,当没有新值传递给相机参数时,相机参数如何改变?

更新眼睛坐标将2D游戏平面绕其轴旋转,更新外观坐标将使相机绕其自身轴旋转,并更新向上方向(使用鼠标坐标)使游戏在平面内旋转。

我有一个glutMainLoop,它具有对render函数的回调,如displayFunc和idleFunc。渲染功能(是游戏刻度的两倍)如下:

void render()
{
    gameTick();

    // Move camera
    printf("pos: %.2f, %.2f, %.2f\tlookat: %.2f, %.2f, %.2f\n", player.pos.x, player.pos.y, 0.0f, 0.0, 0.0, -5.0);
    gluLookAt(
        //player.pos.x, player.pos.y, 0.0f,
        0.0,0.0,0.0,
        //player.pos.x, player.pos.y, -5.0f,
        0.0, 0.0, -5.0,
        0.0, 1.0, 0.0
    );

    // Clearing buffer
    glClearColor(g_backgroundColor.getR(), g_backgroundColor.getG(), g_backgroundColor.getB(), 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Drawing enemies
    for (size_t i = 0; i < agents.size(); i++)
        drawSquare(agents[i].pos, agents[i].ori, g_enemyColor);

    // Drawing player
    drawSquare(player.pos, player.ori, g_playerColor);

    glutSwapBuffers();
}

相机位于z = 0,游戏机位于z = -5。

在更新相机或其他东西后,我是否错过了基本的OpenGL通话?

1 个答案:

答案 0 :(得分:3)

gluLookAt不仅定义了视图矩阵。
它定义一个矩阵,然后将当前矩阵乘以新矩阵。

在通过Identity matrix呼叫gluLookAt之前设置glLoadIdentity,以解决此问题:

glMatrixMode(GL_MODEL_VIEW);
glLoadIdentity();
gluLookAt(
    //player.pos.x, player.pos.y, 0.0f,
    0.0,0.0,0.0,
    //player.pos.x, player.pos.y, -5.0f,
    0.0, 0.0, -5.0,
    0.0, 1.0, 0.0
);