在OpenGL中移动相机

时间:2011-12-29 18:36:51

标签: c++ opengl

我正在使用OpenGL渲染地形。 我的代码如下:

void Render_Terrain(int k)
{
    GLfloat angle = (GLfloat) (k/40 % 360);

    //PROJECTION
    glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

    //VIEW
    glm::mat4 View = glm::mat4(1.);

    //ROTATION
    //View = glm::rotate(View, angle * -0.1f, glm::vec3(1.f, 0.f, 0.f));
    //View = glm::rotate(View, angle * 0.2f, glm::vec3(0.f, 1.f, 0.f));
    //View = glm::rotate(View, angle * 0.9f, glm::vec3(0.f, 0.f, 1.f));

    View = glm::translate(View, glm::vec3(0.f,0.f, -4.0f)); // x, y, z position ? 

    //MODEL
    glm::mat4 Model = glm::mat4(1.0);

    glm::mat4 MVP = Projection * View * Model;
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "MVP_matrix"), 1, GL_FALSE, glm::value_ptr(MVP));

    //Transfer additional information to the vertex shader 
    glm::mat4 MV = Model * View;
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "MV_matrix"), 1, GL_FALSE, glm::value_ptr(MV));

    glClearColor(0.0, 0.0, 0.0, 1.0);

    glDrawArrays(GL_LINE_STRIP, terrain_start, terrain_end );

}

我可以围绕X,Y,Z轴旋转,缩放我的地形,但我找不到移动相机的方法。我正在使用OpenGL 3+,我对图形有点新鲜。

3 个答案:

答案 0 :(得分:4)

移动相机的最佳方法是使用gluLookAt(),它模拟相机移动,因为相机无法移动。该功能需要9个参数。前3个是眼睛的XYZ坐标,它是摄像机准确定位的位置。第二个3个参数是中心的XYZ坐标,它是相机从眼睛看的点。它总是会成为屏幕的中心。第三个参数是UP矢量的XYZ坐标,它从眼睛垂直向上指向。通过操纵这3个XYZ坐标,您可以模拟您想要的任何相机移动。

查看此link

进一步详情:

- 如果您想要围绕一个物体旋转,可以围绕向上矢量旋转眼睛。 - 如果你想向前或向后移动,你可以增加或减少眼睛以及中心点。 - 如果你想向左或向右倾斜相机,你可以围绕你的外观向量旋转你的向上矢量,你的外观矢量是中心 - 。

gluLookAt对已弃用的固定函数管道进行操作,因此您应该使用glm :: lookAt。

答案 1 :(得分:2)

您目前正在使用常量向量进行翻译。在注释掉的代码中(我假设您用来测试旋转),使用angle来调整旋转。你应该有一个类似的翻译变量。然后,您可以将glm::translate调用更改为:

View = glm::translate(View, glm::vec3(x_transform, y_transform, z_transform)); // x, y, z position ?  

并获得翻译。

您应该将多个参数传递到Render_Terrain,因为平移和旋转至少需要六个参数。

答案 2 :(得分:1)

在OpenGL中,相机始终处于(0,0,0)。您需要将矩阵模式设置为GL_MODELVIEW,然后使用glTranslate,glRotate,glLoadMatrix等内容修改或设置模型/视图矩阵,以使其看起来相机已移动。如果您正在使用GLU,则可以使用gluLookAt将相机指向特定方向。