首页 > 解决方案 > 如何同时将 3 个旋转四元数相乘

问题描述

最近我在使用欧拉角旋转物体时遇到了万向节锁定问题。为了解决这个问题,我切换到四元数,但是我仍然遇到万向节锁定问题。这样做的原因是因为为了获得最终的旋转四元数,我必须将 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, 0), rotation.getX());
quaternionY = new Quaternion(new Vector3f(0, 1, 0), rotation.getY());
quaternionZ = new Quaternion(new Vector3f(0, 0, 1), rotation.getZ());

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

有谁知道我如何同时将所有 3 个相乘?

标签: javamathquaternions

解决方案


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

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

要解决 Gimbal Lock 问题,您实际上需要做的是避免通过欧拉角表示和操纵您的旋转,而只需使用四元数或 3x3 矩阵。当您想要应用(增量)旋转时,您当前会增加/减少特定的欧拉角,您只需将增量旋转添加到您的四元数/矩阵。

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


推荐阅读