GLM:四元数SLERP插值

我希望插入两个四元数 。 由于我仍然不能得到工作结果,我可以请你核实我的函数调用吗? 下面的代码支持GLM (OpenGL Mathemathics)库,所以这个问题可能适用于那些知道它的人。

首先 ,我从欧拉角进行四元数初始化

glm::quat myAxisQuat(pvAnimation->at(nFrameNo).vecRotation); glm::quat myAxisNextQuat(pvAnimation->at(nFrameNo + 1).vecRotation); 

其次 ,我插入两个input四元数之间。 variablesfInterpolation值在0.0f – 1.0f范围内。

 myInterpolatedRotQuat = glm::mix(myAxisQuat, myAxisNextQuat, fInterpolationTime); 

第三 ,我把我的插值四元数转换回欧拉角

 vecInterpolatedRot = glm::gtx::quaternion::eularAngles( myInterpolatedRotQuat) ; 

最后, vecInterpolatedRot的值不代表插值的EulerAngles。 从Eular角度转换后很难理解四元数值,所以我想请你帮忙。

什么可能是错的,请?

我加倍和三重检查inputvariables,我尝试了各种方法,唯一的问题,在这一刻可能与glm :: mix()中的第三个Aplha参数


更新:

为了提供更多信息, vecInterpolatedRot中的返回值非常低。 在插值结束时,我会期待有效的角度。

这是内插值的随机序列,因为对象根据预定义的animationpath移动。

 rotX:-1.7451 rotY:1.7993 rotZ-0.854642 rotX:-1.06451 rotY:1.18485 rotZ-0.694015 rotX:-0.254822 rotY:0.437004 rotZ-0.942035 rotX:0.578816 rotY:-0.335103 rotZ-0.716057 rotX:1.53934 rotY:-1.07602 rotZ-1.0182 rotX:2.5582 rotY:-1.87737 rotZ-0.759468 rotX:-2.58259 rotY:-2.47432 rotZ-1.06071 rotX:-1.35049 rotY:3.11548 rotZ-0.81839 rotX:0.0106472 rotY:2.78129 rotZ-1.04353 rotX:1.46636 rotY:2.33968 rotZ-0.879188 rotX:0.0289322 rotY:2.31166 rotZ-0.91746 rotX:-1.47901 rotY:2.37235 rotZ-0.938591 rotX:-2.59482 rotY:2.89469 rotZ-1.15554 rotX:2.47283 rotY:-2.76131 rotZ-0.992493 rotX:1.73065 rotY:-1.53285 rotZ-1.27898 rotX:0.85806 rotY:-0.176976 rotZ-1.03487 rotX:0.452009 rotY:-1.14604 rotZ-0.927788 rotX:0.0604701 rotY:-2.12479 rotZ-1.05684 rotX:0.107648 rotY:-2.07785 rotZ-1.05071 rotX:0.154894 rotY:-2.03083 rotZ-1.04569 rotX:0.809623 rotY:2.14456 rotZ-1.31262 rotX:1.15268 rotY:0.332553 rotZ-0.983604 rotX:2.16299 rotY:-0.545458 rotZ-1.11758 rotX:2.95376 rotY:-1.2008 rotZ-0.846527 rotX:-2.94892 rotY:-0.892473 rotZ-1.17334 rotX:-1.89716 rotY:-1.30162 rotZ-1.53247 rotX:0.804938 rotY:1.93659 rotZ-1.37281 rotX:0.653453 rotY:1.73722 rotZ-1.14364 rotX:2.24713 rotY:0.658935 rotZ-1.03684 rotX:2.97528 rotY:0.508203 rotZ-0.559124 rotX:-2.49988 rotY:0.640482 rotZ0.0117903 rotX:-1.57379 rotY:1.16303 rotZ0.288639 rotX:-1.4928 rotY:1.17794 rotZ0.902059 rotX:-0.667796 rotY:1.94995 rotZ1.49074 rotX:2.12971 rotY:-1.85782 rotZ0.904871 rotX:2.36951 rotY:-2.03682 rotZ0.189242 rotX:1.5574 rotY:-2.92156 rotZ-0.450418 rotX:1.6256 rotY:2.29519 rotZ-1.46659 rotX:2.85414 rotY:2.11303 rotZ-0.42888 rotX:-2.48503 rotY:2.96942 rotZ0.189887 rotX:-1.55656 rotY:3.00852 rotZ0.675669 

发布的值似乎是弧度,但GLM使用度。

编辑 :也请确保您使用相同的旋转顺序。 如果你不明白为什么这个问题在Wolfram Alpha看到不同命令的不同结果。 玩“欧拉旋转序列”框,看看不同的输出。

这里和这里是一些解释旋转订单问题的链接

我从来没有使用GLM直到现在(这似乎很有趣),但你确定你的“glm :: mix”调用?

在文档中我可以find两个混合函数:

  • GLM ::核心::function::常见::搭配

     genTypeT glm::core::function::common::mix ( genTypeT const & x, genTypeT const & y, genTypeU const & a ) 

    如果genTypeU是浮点标量或向量:返回x *(1.0 – a)+ y * a,即使用浮点值a的x和y的线性混合。 a的值不限于[0,1]的范围。

  • GLM :: GTC ::四元数::混合

     detail::tquat<T> glm::gtc::quaternion::mix ( detail::tquat< T > const & x, detail::tquat< T > const & y, typename detail::tquat< T >::value_type const & a ) 

    根据a返回x和y的SLERP插值四元数。

我认为glm :: mix是第一个的别名(我仍然在search信息来确认它,因为我无法在文档中find它),如果您需要第二个,可以尝试调用它直。