在X轴上移动相机glm :: lookat()

时间:2018-07-09 22:29:44

标签: c++ opengl glm-math

我正在尝试使用glm :: lookat()函数在OpenGl上制作2D相机。问题在于,渲染完所有内容后,我将无法移动相机。我只是想水平移动它。

glm::mat4 projection = glm::ortho(0.0f, static_cast<GLfloat>(this->Width), static_cast<GLfloat>(this->Height), 0.0f, 0.1f, 500.0f);
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);

1 个答案:

答案 0 :(得分:1)

glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);

所以,像这样:

void Update()
{
  static glm::vec3 cameraPos(0,0,-1);

  cameraPos.x += 0.1f;

  ... etc
}

(不过,我建议您创建Camera类,或者至少将vec3存储在此方法之外,以进行实验以外的任何操作。)其他所有操作都应正常工作。

通常,您还需要考虑帧之间的时间差。有很多方法可以测量这一点-您正在使用的gl框架可能为其提供了功能-但您可能以60Hz运行,因此假设帧之间的时间为16.6ms。在这种情况下,您可以

float velocity = 10; // units per second
glm::vec3 cameraPos(0,0,-3);
float deltaT = 16.6e-3f; // 16 milliseconds

void Update()
{
  cameraPos.x += velocity * deltaT;
  glm::lookAt(cameraPos, .....);
}

您可能会遇到一种情况,即所有内容都呈现第一帧,然后消失。在这种情况下,将速度降低到零以确保一切都像以前一样工作,然后尝试一些很小的速度值(例如0.001)。这取决于您的几何尺寸,与相机的距离以及其他一些东西。 Z值为-3的相机非常小,在解决此问题时,可能会尝试将其关闭一些。

祝你好运!