我可以从由偏航/俯仰/滚动创建的两个四元数中插入旋转吗?

cod*_*nix 8 opengl math directx 3d quaternions

四元数适用于它们之间的插值旋转.到现在为止还挺好.

如果我有一个网络游戏,将旋转转移为vector3f还是应该使用四元数?为了使游戏更流畅,我可能需要在最后发送的旋转和当前旋转之间进行插值.

但是我可以在从Yaw/Pitch/Roll创建的两个四元数之间插入旋转吗?

Quaternion a = Quaternion.FromYawPitchRoll(x1,y1,z1);

Quaternion b = Quaternion.FromYawPitchRoll(x2,y2,z2);

a.Interpolate(b, value); // will this work correctly?
Run Code Online (Sandbox Code Playgroud)

小智 8

是的你可以.欧拉角的问题是万向节锁定,一些方向以一个较小的自由度结束.当您从欧拉角转换为四元数时,该问题就解决了.您几乎可以将任何3D轴表示转换为四元数形式并返回,而不会丢失任何信息.矩阵必须是各向同性的(无比例或剪切),矢量必须是单位长度.

四元数之间的线性插值称为slerp.四元数之间的二次插值称为小队.由于四元数只是具有三个虚部的复数,因此对实数和矢量起作用的相同方程适用于四元数.只需记住在进行乘法,加法,对数和取幂时使用正确的规则.可以想象假想的部分i,j和k一起形成轴向量,而实部是比例.

  • @codymanix:插入欧拉角和插入四元数在直觉上是非常不同的操作。插值四元数是你所期望的:在两个方向 a 和 b 之间有一个最小的旋转 q,这样 a*q = b,我们在插值时将 q 的角度从零增加到它的原始值,所以我们取a到b的最短路径。当您插入欧拉角时,您正在做的事情要奇怪得多。您可以任意将 q 分成三个轴对齐的旋转(无论 a 和 b 的方向如何),然后对这些分量旋转进行插值。 (2认同)

Ber*_*rry 5

您可以在四元数之间进行插值.我曾经写过一个基于四元数的关键帧动画生成器,它可以从几个特定的​​点为渲染系统生成帧.我无法分享代码,因为它被分类:-(

在80年代的某个时候SIGGRAPH程序中有一篇关于这个话题的论文.四元数的主要优点是没有像欧拉角那样的奇点.

啊,这是参考:

Shoemaker,Ken"动画旋转与四元数曲线",SIGGRAPH '85,旧金山,1985年7月22日至26日,第一卷.19,No.3,1985 ACM 0-89791-166-0/85/007/0245,第245-254页.

  • 当用作关键帧时,这不是很暧昧.(1,0,0,0) - >(0,0,0,0) - >(1,0,0,0)表示另一个运动然后(1,0,0,0) - >(0,0 ,0,0) - >( - 1,0,0,0)虽然开始和结束位置甚至中间位置都是相同的. (2认同)