2017-07-15 206 views
1

我幾乎能夠控制的物體的2D空間中Unity3D運動(類似於光標的移動),使用從Thalmic的繆袖標原始陀螺儀數據。四元數旋轉,用於幀的參考陀螺儀的轉換在Unity 3D

我試圖通過一系列旋轉和變換的從參考的參考世界座標系其自身的軸線/幀變換陀螺儀數據。

一切編譯除了單一錯誤,以及何時被忽略該錯誤,對象移動時作爲陀螺旋轉,但最終的x/y座標是在錯誤方向歪斜。

請糾正我,如果我錯了,但我的general approach將是:

  1. 獲取陀螺儀矢量
  2. 通過定向四元旋轉它(從加速度計)看齊, 到世界空間
  3. 獲得旋轉右向量的歸一化四元數
  4. 通過此四元數旋轉從(2)對齊的向量獲得來自Vector的補償矢量(-z)組分(2)和(y)從補償矢量的 組分(4)將得到期望的DX 和dy值

這裏是我的方法: 調用轉換功能,輸入陀螺數據,當前方向和X方向(是否帶朝向手腕或反轉):

Vector2 dxdy = gyroConversion (thalmicMyo.gyroscope, myo.transform.rotation, thalmicMyo.xDirection); 

transform.Translate (dxdy [0], dxdy [1], 0, Space.World); 

的gyroConversion功能:

Vector2 gyroConversion (Vector3 gyroData, Quaternion orientation, object xdir) { 

    // Convert gyro data from the gyroscope's frame of reference to the world frame of reference. 

    // Rotate gyroData by orientation quaternion. 
    Vector3 gyroWorldData = orientation * gyroData; 

    // Check which direction the armband is facing. 
    if (xdir.Equals(Thalmic.Myo.XDirection.TowardWrist)) { 
     Vector3 forwardSource = new Vector3 (1, 0, 0); 
    } 

    else { 
     Vector3 forwardSource = new Vector3 (-1, 0, 0); 
    } 

    Vector3 right = Vector3.Cross(forward, new Vector3 (0, 0, -1)); 
    Vector3 up = new Vector3 (0, 1, 0); 

    Quaternion yQuat = Quaternion.FromToRotation(right, up); 

    float m = Mathf.Sqrt(yQuat.w * yQuat.w + 
     yQuat.x * yQuat.x + 
     yQuat.y * yQuat.y + 
     yQuat.z * yQuat.z); 

    yCompNorm = new Quaternion (yQuat.w/m, yQuat.x/m, yQuat.y/m, yQuat.z/m); 

    Vector3 gyroCompensated = yCompNorm * gyroWorldData; 

    Vector2 coordinates = new Vector2 (-gyroWorldData.z, gyroCompensated.y); 

    return coordinates; } 

注:forwardSource導致的錯誤告訴我,它不會在目前的情況下存在',但是當一個forwardSource定義存在代替的if-else對,它工作得很好,這就是我怎麼知道所需對象實際上在移動,只是非常奇怪。似乎我在陀螺儀上的左右運動正在Unity中產生上下運動。

很可能與轉出了問題,但我看不出哪裏。

回答

0

好像我對陀螺左右運動產生在Unity上下運動。

不能完全確定這是否是問題,但陀螺儀傳感器Input.gyro.attitude值在右手座標返回而統一使用左手座標系統。在嘗試使用它來移動對象之前,您需要將陀螺儀(右手座標)轉換爲左手座標。現在

private static Quaternion GyroToUnity(Quaternion q) 
{ 
    return new Quaternion(q.x, q.y, -q.z, -q.w); 
} 

...

Quaternion convertedValue = GyroToUnity(Input.gyro.attitude); 

,您可以使用convertedValue變量您的其他計算或移動對象/相機。