【问题标题】:Moving Camera in OpenGL在 OpenGL 中移动相机
【发布时间】:2011-12-29 18:36:51
【问题描述】:

我正在使用 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+,我对图形有点陌生。

【问题讨论】:

标签: c++ opengl


【解决方案1】:

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

看看这个link

更多细节:

-例如,如果您想围绕一个对象旋转,您可以围绕向上矢量旋转眼睛。 - 如果您想向前或向后移动,您可以添加或减少眼睛以及中心点。 - 如果您想向左或向右倾斜相机,请围绕您的外观矢量旋转您的向上矢量,其中您的外观矢量为中心 - 眼睛。

gluLookAt 在已弃用的固定函数管道上运行,因此您应该改用 glm::lookAt。

【讨论】:

  • “字面意思是不移动世界来模拟相机运动”这正在移动世界来模拟相机运动。这两个概念是一回事。
  • @NicolBolas 哈哈,确实如此。相机无法移动。他们都是一样的。
  • gluLookAt 在已弃用的固定函数管道上运行,因此您应该推荐glm::lookAt
  • 正确,感谢@R.MartinhoFernandes 指出这一点。
  • @TestTest 如果您有任何进一步的疑问,请告诉我。我已经完成了很多相机转换,所以如果你有一些想法,我可以帮助你,告诉你如何做它们以及所涉及的数学等等。
【解决方案2】:

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

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

并获得翻译。

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

【讨论】:

  • 你的意思是我应该改变 x y 和 z,通过将它们乘以 sin 或 cos 函数,然后调用上面的?
  • @TestTest,没有。让我们备份一下。您传递给Render_Terraink 是什么?
【解决方案3】:

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

【讨论】:

  • 好吧,他似乎在使用 GL3 核心,没有任何不推荐使用的矩阵内容(或者至少没有内置矩阵)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多