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一起形成轴向量,而实部是比例.
您可以在四元数之间进行插值.我曾经写过一个基于四元数的关键帧动画生成器,它可以从几个特定的点为渲染系统生成帧.我无法分享代码,因为它被分类:-(
在80年代的某个时候SIGGRAPH程序中有一篇关于这个话题的论文.四元数的主要优点是没有像欧拉角那样的奇点.
啊,这是参考:
Shoemaker,Ken"动画旋转与四元数曲线",SIGGRAPH '85,旧金山,1985年7月22日至26日,第一卷.19,No.3,1985 ACM 0-89791-166-0/85/007/0245,第245-254页.