如何使用四元数来描述大于360度的旋转角度?

时间:2018-12-19 12:44:10

标签: c++ math graphics

我正在尝试使用四元数进行旋转动画。 我的算法会创建四元数,并且每帧都紧缩。 这是我的代码,用于通过轴和旋转角度构造四元数。

template <typename U>
Quaternion(Vector3<U> vec, const float& angle)
{
    vec.normalize();
    float cosa = cos(angle/2);
    float sina = sin(angle/2);
    w = cosa;
    x = sina * vec.x;
    y = sina * vec.y;
    z = sina * vec.z;
}

然后我发现,当我尝试旋转4π弧度时,动画不起作用,因为我创建的四元数等于0度。 我想知道四元数是否可以表示360度以上的旋转?还是我的动画算法需要改进?

3 个答案:

答案 0 :(得分:5)

  

我想知道四元数是否可以表示360度以上的旋转?

不,不能。

在[360; 720]范围内的四元数将被视为在另一个方向[-360; 0]上的旋转。

四元数在[720 * k; 720 *(k + 1)]将被视为旋转[0; 720]。

如果将slerp用于此类动画,则四元数对它们不利。

四元数只能在小于360度的角度之间弯曲。

如果仍然要执行此操作,请使用其他表示形式,例如axis-angle。

答案 1 :(得分:1)

旋转360度 与旋转0度相同。要旋转大于360度的角度alpha,只需旋转alpha-360或更普遍的角度alpha % 360

(360用作2pi的同义词,您当然需要注意度数与弧度。并且不确定那是否是错字,但是360度是2pi而不是{ {1}})

PS:实际上,我认为您的代码没有任何问题,也许您不必进行任何更改。只是您的期望是错误的:4pi旋转和0pi旋转应该得到相同的结果。

答案 2 :(得分:1)

将四元数视为即时旋转-立即旋转4π弧度等同于什么都不做。

在20秒内为4π弧度旋转设置动画时,这不是您想要的。您可以通过创建Euler向量(3D向量,其方向表示旋转轴,与四元数相同,而其长度表示旋转的速度/角度)来解决该问题,请参见https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation。然后,将其乘以经过的时间,然后根据您的图形需要将其转换为四元数或3D矩阵。