OpenGL Переместить камеру вокруг точки - PullRequest
0 голосов
/ 13 ноября 2018

Я инициализирую класс камеры с векторов глаз, цели и вверх с помощью функции glm::lookAt, затем получаю значения Yaw, Pitch и Roll от glm::yaw и так далее. Я сделал метод поворота, который требует xoffset и yoffset, чтобы повернуть камеру вокруг своей целевой точки.

void ThirdPersonCamera::Rotate(float _yaw, float _pitch) {
    view.yaw += _yaw;
    view.pitch += _pitch;
    float radius = glm::length(view.GetEye() - view.GetTarget());
    view.GetEye().x = glm::cos(glm::radians(view.yaw)) * glm::cos(glm::radians(view.pitch)) * radius;
    view.GetEye().y = glm::sin(glm::radians(view.pitch)) * radius;
    view.GetEye().z = glm::sin(glm::radians(view.yaw)) * glm::cos(glm::radians(view.pitch)) * radius;
    view.init();
}

где view.init() создает матрицу вида из lookAt. проблема заключается в том, что для первого поворота значения X и Z глаза меняются, поэтому камера перепрыгивает со своего места на другое, например, если камера инициализируется в (0,10,10), то после первого движения глаз становится в (10 , 10,0) тогда нормально работает.

1 Ответ

0 голосов
/ 13 ноября 2018

Очевидно, glm::yaw() и так далее не делают то, что вам нужно.Вам нужны обратные вычисления для глаза.То есть:

auto d = eye - target;
yaw = std::atan2(d.z, d.x);
pitch = std::asin(d.y / glm::length(d));

В последней строке убедитесь, что аргумент asin находится в пределах [-1, 1].Неточности с плавающей точкой могут привести к аргументу за пределами этого диапазона.

...