1

我需要一种方法来从本地获取在全局参考系中旋转的欧拉角。我正在使用 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);
4

2 回答 2

3

这实际上是正确的方法。如果将 globalQuaternion * newQuaternion 相乘,则得到全局旋转,而 newQuaternion * globalQuaternion 则得到局部旋转。我只是在生成四元数时犯了一个错误。

于 2010-02-20T11:18:39.897 回答
2

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

于 2010-03-06T00:57:14.270 回答