OpenGL Переместить камеру вокруг точки

Я инициализирую класс камеры с векторов глаз, цели и вверх 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) тогда все работает нормально.

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector