OpenGL在点附近移动相机

时间:2018-11-13 12:52:13

标签: c++ opengl rotation glm-math euler-angles

我使用glm::lookAt函数从眼睛,目标和上矢量初始化相机类,然后从glm::yaw等获得Yaw,Pitch和Roll值。 我制作了一个旋转方法,需要使用xoffsetyoffset来使相机绕其目标点旋转。

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 :(得分:1)

很显然,glm::yaw()等无法满足您的需求。您需要对计算进行逆运算。那就是:

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

对于最后一行,请确保asin的参数位于[-1, 1]之内。浮点数错误可能会导致超出此范围的论点。