2010-02-17 92 views
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); 

回答

3

其实,这是正确的方式。如果你乘以globalQuaternion * newQuaternion你得到全局旋转和newQuaternion * globalQuaternion然后你得到本地轮换。我只是在产生我的四元数时出错。

2

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