【问题标题】:How do I rotate my camera around my object?如何围绕对象旋转相机?
【发布时间】:2019-01-26 01:11:28
【问题描述】:

我想围绕场景和中心的一个对象旋转我的相机。我试过这样做:

glm::mat4 view;
float radius = 10.0f;
float camX   = sin(SDL_GetTicks()/1000.0f) * radius;
float camZ   = cos(SDL_GetTicks()/1000.0f) * radius;
view = glm::lookAt(glm::vec3(camX, 0.0f, camZ), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(glGetUniformLocation(shader, "viewingMatrix"), 1, false, &view[0][0]);

但我的对象在屏幕上加载得更远,并且对象围绕场景旋转,而不是相机。

这是我的顶点着色器:

void main()
{
    FragPos = vec3(modelMatrix * vec4(aPos, 1.0));
    Normal = mat3(transpose(inverse(modelMatrix))) * aPos;
    TexCoord = aTexture;

    vec4 transformedPosition = projectionMatrix * viewingMatrix * vec4(FragPos, 1.0f);
    gl_Position = transformedPosition;
}

如何使相机在场景中旋转而对象不旋转?

我正在学习本教程,并试图弄清楚第一个动画中发生了什么。

https://learnopengl.com/Getting-started/Camera

modelMatrix

glm::mat4 modelMat(1.0f);
modelMat = glm::translate(modelMat, parentEntity.position);
modelMat = glm::rotate(modelMat, parentEntity.rotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
modelMat = glm::rotate(modelMat, parentEntity.rotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
modelMat = glm::rotate(modelMat, parentEntity.rotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
modelMat = glm::scale(modelMat, parentEntity.scale);
int modelMatrixLoc = glGetUniformLocation(shader, "modelMatrix");
glUniformMatrix4fv(modelMatrixLoc, 1, false, &modelMat[0][0]);

【问题讨论】:

  • 对不起,您可以忽略第一个代码块。我实际上正在使用第二个。我会马上编辑它。 modelMatrix 是世界上的对象。
  • 视图的目标(glm::lookAt 的第二个参数)应该是对象的中心。对象的位置(和对象的中心)由模型矩阵(modelMatrix)改变。您必须将对象的世界位置添加到glm::lookAt 的第一个和第二个参数。
  • 好的。关于modelMatrix,我究竟必须改变什么?
  • 已将其添加到我的问题中。
  • 是的,radius 太大了,所以我把它减到了2.0f。您可以在下面发布您的答案,我会接受。感谢您的帮助。

标签: c++ opengl opengl-3 glm-math coordinate-transformation


【解决方案1】:

视图的目标(glm::lookAt 的第二个参数)应该是对象的中心。对象的位置(和对象的中心)由顶点sahder中的模型矩阵(modelMatrix)改变。

您必须将对象的世界位置添加到glm::lookAt 的第一个和第二个参数。物体的位置是模型矩阵的平移。

物体离相机更远,因为radius太大了。

要解决您的问题,代码必须看起来像这样:

glm::mat4 view;
float radius = 2.0f;
float camX   = sin(SDL_GetTicks()/1000.0f) * radius;
float camZ   = cos(SDL_GetTicks()/1000.0f) * radius;

view = glm::lookAt(
    glm::vec3(camX, 0.0f, camZ) + parentEntity.position,
    parentEntity.position,
    glm::vec3(0.0f, 1.0f, 0.0f));

glUniformMatrix4fv(
    glGetUniformLocation(shader, "viewingMatrix"), 1, false, glm::value_ptr(view));

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 2018-01-23
    • 2013-08-30
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多