我使用glm::lookAt
函数从眼睛,目标和上矢量初始化相机类,然后从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)正常工作。
答案 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]
之内。浮点数错误可能会导致超出此范围的论点。