C# 将局部四元数旋转转换为全局(陀螺)

C# 将局部四元数旋转转换为全局(陀螺),c#,math,3d,quaternions,euler-angles,C#,Math,3d,Quaternions,Euler Angles,我需要一种方法,从局部坐标系得到全局坐标系中旋转的欧拉角。我使用的是c#,wpf 3d和陀螺仪。我在屏幕上有一个地球仪,它的运动方式应该和陀螺仪一样。由于陀螺仪发送相对于自身的运动,我需要使用四元数来保持对象的状态并更新它,但我被卡住了。如果我这样做: var qu=eulerToQ(Gyro.X,Gyro.Y,Gyro.Z); GlobalQu = Quaternion.Multiply(qu, GlobalQu); 它在一个轴

我需要一种方法,从局部坐标系得到全局坐标系中旋转的欧拉角。我使用的是c#,wpf 3d和陀螺仪。我在屏幕上有一个地球仪,它的运动方式应该和陀螺仪一样。由于陀螺仪发送相对于自身的运动,我需要使用四元数来保持对象的状态并更新它,但我被卡住了。如果我这样做:

                var qu=eulerToQ(Gyro.X,Gyro.Y,Gyro.Z);
                GlobalQu = Quaternion.Multiply(qu, GlobalQu);
它在一个轴上正确旋转。当我在一个方向上旋转A,然后在另一个方向上旋转B时,物体和陀螺仪的旋转不再在同一个方向上,因为上面提到的是绝对旋转(相对于世界)

例如:

                    var qu=eulerToQ(KeyboardValue1,KeyboardValue2,KeyboardValue3);
                    GlobalQu = qu;
这是因为我总是在全局轴上通过键盘增加滚动、俯仰和偏航ie键盘值。陀螺仪在局部轴上发送旋转

切换四元数旋转的顺序没有帮助

                    var qu=eulerToQ(Giro.X,Giro.Y,Giro.Z);
                    GlobalQu = Quaternion.Multiply(GlobalQu,qu);

这实际上是正确的方法。如果将全局四元数*新四元数相乘,则得到全局旋转和新四元数*全局四元数,然后得到局部旋转。我只是在生成四元数时出错了。

这实际上是正确的方法。如果将全局四元数*新四元数相乘,则得到全局旋转和新四元数*全局四元数,然后得到局部旋转。我只是在生成四元数时出错了。

你说你有陀螺仪。它是物理陀螺仪吗?陀螺仪本身只能产生角速率信息。有没有电子设备可以产生角度,而不是角速率?有十二种可能的欧拉角旋转序列;每个都有不同的四元数数学转换。你只有十二分之一的机会,从你的陀螺仪角度的顺序是相同的顺序,你的eulertoQ功能。这是我几年前写的一篇关于euler到四元数的白皮书。

你说你有一个陀螺仪。它是物理陀螺仪吗?陀螺仪本身只能产生角速率信息。有没有电子设备可以产生角度,而不是角速率?有十二种可能的欧拉角旋转序列;每个都有不同的四元数数学转换。你只有十二分之一的机会,从你的陀螺仪角度的顺序是相同的顺序,你的eulertoQ功能。这是我几年前写的一篇关于euler到四元数的白皮书