我正在使用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+,我对图形有点新鲜。
答案 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将相机指向特定方向。