Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 设置四元数Slerp动画时遇到问题_C++_Quaternions - Fatal编程技术网

C++ 设置四元数Slerp动画时遇到问题

C++ 设置四元数Slerp动画时遇到问题,c++,quaternions,C++,Quaternions,我正在尝试为我的FPS相机制作从q1到q2的slerp动画。我的世界中有一个目标,我希望相机从当前轴平移到我的目标。据我所知,这样做的方法是计算一个四元数,表示我当前的(轴,旋转),一秒钟表示我的最终(轴,旋转),然后每一帧增加我在这两者之间的插值量,从0到1。这是正确的想法吗 我不明白的是如何计算这些四元数的开始和结束 我的相机非常标准,具有常见的成员变量: glm::vec3 position,forward, up, yAxis, target; glm::quat orientation

我正在尝试为我的FPS相机制作从q1到q2的slerp动画。我的世界中有一个目标,我希望相机从当前轴平移到我的目标。据我所知,这样做的方法是计算一个四元数,表示我当前的
(轴,旋转)
,一秒钟表示我的最终
(轴,旋转)
,然后每一帧增加我在这两者之间的插值量,从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轴指向您的视图方向)您应该能够解方程