我需要一种方法来获取来自本地的全局参照系中旋转的欧拉角。我正在使用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);
答案 0 :(得分:3)
这实际上是正确的方法。如果你乘以globalQuaternion * newQuaternion你得到全局旋转和newQuaternion * globalQuaternion然后你得到局部旋转。我只是在生成四元数时犯了一个错误。
答案 1 :(得分:2)