Как мне повернуть камеру вокруг моего объекта?

Я хочу вращать свою камеру вокруг сцены и объекта, который находится в центре. Я пытался сделать это так:

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

1 ответ

Решение

Цель просмотра (2-й параметр glm::lookAt) должен быть центром объекта. Положение объекта (и центра объекта) изменяется моделью матрицы (modelMatrixв вершине сахер.

Вы должны добавить мировую позицию объекта в 1-й и 2-й параметр 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));
Другие вопросы по тегам