如何同时将三个旋转四元数相乘

问题描述

最近,在使用欧拉角旋转物体时,我一直遇到万向节锁定问题。为了解决这个问题,我切换到四元数,但是仍然存在万向节锁定问题。这样做的原因是,为了获得最终的旋转四元数,我必须将3个单独的旋转四元数(XYZ)相乘,但是我唯一的方法是将它们中的2个相乘,然后将乘积乘以第三个创建层次结构。

这是四元数乘法方法代码-

public Quaternion multiply(Quaternion a,Quaternion b) { 
return new Quaternion(a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z);
}

这是我将全部3相乘的代码-

quaternionX = new Quaternion(new Vector3f(1,0),rotation.getX());
quaternionY = new Quaternion(new Vector3f(0,1,rotation.getY());
quaternionZ = new Quaternion(new Vector3f(0,1),rotation.getZ());

Quaternion matrix = new Quaternion(0,0);
matrix = matrix.multiply(quaternionX,quaternionY);
matrix = matrix.multiply(matrix,quaternionZ);

有人知道我怎么能同时将三个数相乘?

解决方法

问题不是您不能“同时”将三个四元数相乘,而是使用欧拉角作为旋转的初始表示,并且(可能)通过操纵这些欧拉角来操纵旋转。 / p>

这是问题的根源,四元数或矩阵无法解决问题。因为,您现在要做的只是将欧拉角转换为四元数。问题就出在这里。

实际上,为解决云台锁定问题,您要做的是避免通过欧拉角来表示和操纵旋转,而只需使用四元数或3x3矩阵即可。而且,当您要应用(增量)旋转(当前要增加/减少特定的欧拉角)时,只需在四元数/矩阵中添加增量旋转。

另请参阅:https://gamedev.stackexchange.com/questions/51410/how-to-avoid-gimbal-lock#answer-51418