C++ 如何围绕对象旋转相机?

C++ 如何围绕对象旋转相机?,c++,opengl,opengl-3,glm-math,coordinate-transformation,C++,Opengl,Opengl 3,Glm Math,Coordinate Transformation,我想围绕场景和位于中心的对象旋转相机。我试过这样做: 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), gl

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

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;
}
如何使摄影机在场景中旋转,而对象不旋转

我将遵循本教程,并尝试了解第一个动画中发生的情况

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

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

此外,由于
半径过大,因此对象距离摄影机较远

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

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));

很抱歉,您可以忽略第一个代码块。实际上我用的是第二个。我马上编辑它
modelMatrix
用于世界上的对象。视图的目标(glm::lookAt的第二个参数)应该是对象的中心。对象的位置(以及对象的中心)由模型矩阵(
modelMatrix
)更改。必须将对象的世界位置添加到
glm::lookAt
的第一个和第二个参数中。确定。关于
modelMatrix
,我到底需要更改什么?将其添加到我的问题中。是的,
radius
太大,所以我将其减小到
2.0f
。你可以把你的答案贴在下面,我会接受的。谢谢你的帮助。
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));