OpenGL масштабирование камеры не работает должным образом - PullRequest
0 голосов
/ 21 октября 2019

Я реализовал маленькую 2d камеру для моей сцены. Проблема в том, что если я попытаюсь немного увеличить масштаб камеры, как она движется влево и вниз вместо увеличения (каждый объект движется вверх и вправо). Я не уверен, что сделал неправильно.

Camera.cpp:

void Camera2D::zoom(float zoomFactor)
{
    scale = glm::scale(scale, glm::vec3(zoomFactor, zoomFactor, 0));
    updateMatrix();
}

void Camera2D::updateMatrix()
{
    translate = glm::translate(glm::mat4(1.f) , glm::vec3(-400, -300, 0));//zoom from center of 
screen
    view = translate * scale;
    translate = glm::translate(glm::mat4(1.f), glm::vec3(0, 0, 0));
    view = translate * scale;
}

Я отправляю матрицу mvp в шейдер следующим образом: проекция * вид * модель. Коэффициент масштабирования всего 1.001.

1 Ответ

0 голосов
/ 21 октября 2019

Я предполагаю, что вы используете ортографическую проекцию, где нижний левый угол (0, 0), а верхний правый - (800, 300).
Таким образом, центр вида (400, 300).

Если вы хотите увеличить изображение вокруг центра орфографической проекции, то вам необходимо:

  • перевести центр в начало координат. Это означает перевод с помощью (-400, -300).
  • zoom (scale)
  • translate origin обратно в центр. Это перевод (400, 300).
void Camera2D::updateMatrix()
{
    glm::vec3 center(400.0f, 300.0f, 0.0f);
    glm::mat4 view = glm::translate(glm::mat4(1.0f), center) * 
                     scale *
                     glm::translate(glm::mat4(1.0f), -center);
}
...