2010-02-17 134 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