OpenGL 围绕点移动相机

OpenGL Move camera around point

我使用 glm::lookAt 函数从眼睛、目标和向上矢量初始化相机 class,然后我从 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) 然后它工作正常。

显然,glm::yaw() 等并不能满足您的需求。你需要你的眼睛计算的倒数。即:

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

对于最后一行,确保 asin 的参数保持在 [-1, 1] 内。浮点数不准确可能会产生超出此范围的参数。