我正在尝试使用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);
答案 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的相机非常小,在解决此问题时,可能会尝试将其关闭一些。
祝你好运!