C++ 设置四元数Slerp动画时遇到问题
我正在尝试为我的FPS相机制作从q1到q2的slerp动画。我的世界中有一个目标,我希望相机从当前轴平移到我的目标。据我所知,这样做的方法是计算一个四元数,表示我当前的C++ 设置四元数Slerp动画时遇到问题,c++,quaternions,C++,Quaternions,我正在尝试为我的FPS相机制作从q1到q2的slerp动画。我的世界中有一个目标,我希望相机从当前轴平移到我的目标。据我所知,这样做的方法是计算一个四元数,表示我当前的(轴,旋转),一秒钟表示我的最终(轴,旋转),然后每一帧增加我在这两者之间的插值量,从0到1。这是正确的想法吗 我不明白的是如何计算这些四元数的开始和结束 我的相机非常标准,具有常见的成员变量: glm::vec3 position,forward, up, yAxis, target; glm::quat orientation
(轴,旋转)
,一秒钟表示我的最终(轴,旋转)
,然后每一帧增加我在这两者之间的插值量,从0到1。这是正确的想法吗
我不明白的是如何计算这些四元数的开始和结束
我的相机非常标准,具有常见的成员变量:
glm::vec3 position,forward, up, yAxis, target;
glm::quat orientation;
注:这篇文章中的
=
代表的是数学方程式,而不是作业。(遗憾的是,我们在stackoverflow上没有mathmode)
如果您的相机已经有一个成员四元数,它描述了相机的旋转,我想您已经有了这个四元数。如果没有,您也可以使用相同的技术来查找它: 如果你知道你的旋转轴和角度,那么你的四元数就是向量q=(cos(a/2),sin(a/2)*r)(和它的任意倍数)。然后,旋转的向量是
vec3v'=qv inv(q)
我假设您希望摄影机仍然指向上方,然后可以将旋转拆分为两个旋转,一个绕全局向上轴(可能是y轴),另一个绕摄影机的局部水平轴(可能是x轴)。
所以你的轮换是:
vec3 v' = g l v inv(l) inv(g)
g = (cos(a/2), sin(a/2)*(0,1,0))
l = (cos(b/2), sin(b/2)*(1,0,0))
加上
vec3 normal(viewDirection) = g l (0,0,1) inv(l) inv(g)
(因为以后您想让相机的z轴指向您的视图方向)您应该能够解方程