【发布时间】:2020-02-24 08:36:43
【问题描述】:
我想根据相机在实例化时获得的位置和目标点来计算相机俯仰和偏航值。如果我将pitch初始化为0,yaw初始化为-90(如LearnOpenGL Camera Tutorial),当第一次旋转发生时,相机突然跳跃;之后旋转正常工作。因此,首先,从该教程中给出的方程式开始,我尝试从前向向量中获取俯仰和偏航值:
float pitch = glm::degrees(glm::asin(forward.y));
float yaw = glm::degreees(glm::acos((float)x/glm::cos(glm::asin(y))));
还有
float yaw = glm::degreees(glm::asin((float)z/glm::cos(glm::asin(y))));
而 cos(sin(y)) 不应为 0,因此 y 不应为 0 或 -1。 我试图实现这些,但偏航的 2 个值不一样,偏航的第一个值似乎是我正在寻找的,但俯仰不是。 之后,我尝试了一种简单的方法,知道俯仰是前向矢量和 y 轴之间的角度,而偏航是前向矢量和 x 轴之间的角度,我尝试(在纸上)计算以下内容:
const glm::vec3 yUnit(0, 1, 0);
const glm::vec3 xUnit(1, 0, 0);
float pitch = glm::degrees(glm::acos(glm::dot(forward, yUnit)));
float yaw = glm::degrees(glm::acos(glm::dot(forward, xUnit)));
有以下2个输入:position = (0, 0, 0), target = (0, 1, 2,5), forward = target - position = (0, 1, 2.5), normalized forward ~ (0 , 0.37, 0.926),结果是俯仰 ~ 68 度和偏航 = 90 度。 此外,我在应用程序中打印了俯仰和偏航值,预期值应该是俯仰 = -20 和偏航 = -90。
如果我错了,你能解释一下,为什么以及在哪里犯错?
【问题讨论】:
标签: opengl camera glm-math euler-angles