9

四元数适用于在它们之间插入旋转。到目前为止,一切都很好。

如果我有一个网络游戏,将旋转传输为 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?
4

3 回答 3

9

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

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

于 2009-11-06T00:46:22.370 回答
5

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

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

啊,这是参考:

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

于 2009-11-06T00:45:32.387 回答
4

是和不是。这是一个很好的讨论: http: //number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It/

请注意,您如何获得四元数并不重要,同样的规则适用。

编辑:我已经在许多项目中使用了论文中提供的源代码,并且可以保证它。

于 2009-11-06T01:00:11.283 回答