【发布时间】:2019-04-16 07:28:51
【问题描述】:
我使用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) 那么它工作正常。
【问题讨论】:
-
是的,我知道,那么计算出了什么问题?初始化后,我尝试从视图矩阵的逆矩阵中获取 Yaw 和 Pitch,但 Y 为负数。
标签: c++ opengl rotation glm-math euler-angles