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

时间:2010-02-17 15:22:49

标签: c# math 3d quaternions euler-angles

我需要一种方法来获取来自本地的全局参照系中旋转的欧拉角。我正在使用c#,wpf 3d和陀螺仪。我在屏幕上有一个地球仪应该以与陀螺仪相同的方式移动。由于陀螺仪相对于自身发送运动,我需要使用四元数来保持对象的状态并更新它但我被卡住了。如果我执行以下操作:

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

IT在一个轴上正确旋转。当我在一个方向上旋转A然后在另一个方向上旋转B时,物体和陀螺仪的旋转不再在同一方向上,因为上述情况适用于绝对旋转(相对于世界)。

例如:

                    var qu=eulerToQ(KeyboardValue1,KeyboardValue2,KeyboardValue3);
                    GlobalQu = qu;

这是有效的,因为我总是在全局轴上通过键盘增加滚动,俯仰,偏航即键盘值。陀螺仪在LOCAL轴上发送旋转。

切换四元数旋转的顺序无济于事

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

2 个答案:

答案 0 :(得分:3)

这实际上是正确的方法。如果你乘以globalQuaternion * newQuaternion你得到全局旋转和newQuaternion * globalQuaternion然后你得到局部旋转。我只是在生成四元数时犯了一个错误。

答案 1 :(得分:2)

你说你有陀螺仪吗?它是一个物理陀螺仪吗?陀螺仪本身只能产生角速率信息。是否有附加电子设备产生角度,而不是角速率?有十二种可能的欧拉角旋转序列;每个都有一个不同的数学转换四元数。您只有十二分之一的机会来自您的陀螺仪的角度顺序与您的eulertoQ功能的顺序相同。这是我几年前写的四元数白皮书的Link {。}}。