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

Java 如何同时将3个旋转四元数相乘,java,math,quaternions,Java,Math,Quaternions,最近,当使用欧拉角旋转对象时,我遇到了万向节锁问题。为了解决这个问题,我切换到四元数,但我仍然有万向节锁的问题。这是因为为了得到最终的旋转四元数,我必须将3个单独的旋转四元数(XYZ)相乘,但唯一的方法是将其中的2个相乘,然后将其乘积乘以创建层次的第3个四元数 这是四元数乘法方法的代码- public Quaternion multiply(Quaternion a, Quaternion b) { return new Quaternion(a.w * b.x + a.x * b.w + a

最近,当使用欧拉角旋转对象时,我遇到了万向节锁问题。为了解决这个问题,我切换到四元数,但我仍然有万向节锁的问题。这是因为为了得到最终的旋转四元数,我必须将3个单独的旋转四元数(XYZ)相乘,但唯一的方法是将其中的2个相乘,然后将其乘积乘以创建层次的第3个四元数

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

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);

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

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

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

要解决万向节锁定问题,实际上需要做的是避免通过Euler角表示和操纵旋转,而只需使用四元数或3x3矩阵。当你想应用一个(三角形)旋转,你现在会增加/减少一个特定的欧拉角,你只需在你的四元数/矩阵中添加一个三角形旋转


另请参见:

这是一个xy问题。你不会问解决万向节锁的实际问题,而是问如何解决你提出的“同时乘以三个四元数”的解决方案,这是胡说八道。问题应该是“如何避免四元数万向节锁”。