如何将四元数转换为极坐标/方位角旋转

3

我有一个弧形球相机,其旋转由两个角度(phi/theta,polar/azimuthal)定义,并通过鼠标移动进行控制。

我将这两个角度(作为欧拉角)转换为四元数,方法如下:

glm::quat rotation = glm::quat(glm::vec3(phi, theta, 0));

在某些时候,我需要将四元数转换回两个角度,但我认为有无限多个解决方案。有没有一种方法可以在没有任何滚动的情况下获取这两个角度?

或者,有没有更好的解决方案可以制作一个弧形球/轨道相机,而不使用欧拉角,并仅保留相机的四元数旋转?

1个回答

4
我找到了一个解决方案:
  • 从指向Z轴的单位向量开始(取决于您的引擎的左右手性和上向量)glm::vec3 v = glm::vec3(0, 0, 1);
  • 使用您要转换的四元数旋转向量 v = q*v; glm会自动完成此操作,否则可以像这样旋转向量:
quat v_quat = quat(v.x, v.y, v.z, 0); // pure quaternion
v_quat = (q*v_quat)*q.conjugate();
v = vec3(v_quat.x, v_quat.y, v_quat.z);
  • 旋转后的向量是一个单位向量,在以原点为中心的单位球体上某处指向,将向量的位置从直角坐标系转换为球面坐标系
float phi = atan2(v.x, v.z);
float theta = acos(v.y/length(v)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接