OpenGL 围绕点移动相机
OpenGL Move camera around point
我使用 glm::lookAt
函数从眼睛、目标和向上矢量初始化相机 class,然后我从 glm::yaw
获得 Yaw、Pitch 和 Roll 值,依此类推。
我做了一个旋转方法,需要 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) 然后它工作正常。
显然,glm::yaw()
等并不能满足您的需求。你需要你的眼睛计算的倒数。即:
auto d = eye - target;
yaw = std::atan2(d.z, d.x);
pitch = std::asin(d.y / glm::length(d));
对于最后一行,确保 asin
的参数保持在 [-1, 1]
内。浮点数不准确可能会产生超出此范围的参数。
我使用 glm::lookAt
函数从眼睛、目标和向上矢量初始化相机 class,然后我从 glm::yaw
获得 Yaw、Pitch 和 Roll 值,依此类推。
我做了一个旋转方法,需要 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) 然后它工作正常。
显然,glm::yaw()
等并不能满足您的需求。你需要你的眼睛计算的倒数。即:
auto d = eye - target;
yaw = std::atan2(d.z, d.x);
pitch = std::asin(d.y / glm::length(d));
对于最后一行,确保 asin
的参数保持在 [-1, 1]
内。浮点数不准确可能会产生超出此范围的参数。