四元数有利于它们之间的内插旋转。到目前为止,一切都很好。
如果我有一个网络游戏,将旋转量转换为vector3f就足够了还是应该使用四元数?
为了使游戏更流畅,我可能必须在上次发送的旋转和当前旋转之间进行插值。
但是我可以在偏航/俯仰/滚动创建的两个四元数之间插入旋转吗?
Quaternion a = Quaternion.FromYawPitchRoll(x1,y1,z1);
Quaternion b = Quaternion.FromYawPitchRoll(x2,y2,z2);
a.Interpolate(b, value); // will this work correctly?
最佳答案
是的你可以。欧拉角的问题是万向节锁定,某些定向最终以较少的自由度结束。当您从欧拉角转换为四元数时,该问题就解决了。您几乎可以将任何3D轴表示形式转换为四元数形式,然后再转换成四元数形式,而不会丢失任何信息。矩阵必须是各向同性的(无标度或剪切),向量必须具有单位长度。
四元数之间的线性插值称为slerp。四元数之间的二次插值称为小数。由于四元数只是具有三个虚部的复数,因此适用于实数和向量的相同方程式也适用于四元数。只要记住在进行乘法,加法,对数和幂运算时要使用正确的规则即可。可以想象,虚部i,j和k一起形成轴矢量,而实部是比例尺。
关于math - 我可以从偏航/俯仰/侧倾创建的两个四元数中插值旋转吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1684594/