2017-07-15 11 views
1

私は、ThalmicのMyoアームバンドの生のジャイロスコープデータを使用してUnity3Dの2D空間(カーソルの動きに似ています)のオブジェクトの動きをほぼコントロールできます。Unity 3Dでのジャイロスコープの参照フレーム変換のためのクォータニオン回転

私はジャイロスコープのデータを一連の回転と変換によって、独自の軸/基準フレームから世界基準フレームに変換しようとしていました。

このエラーを無視すると、ジャイロの回転に合わせてオブジェクトが移動しますが、最後のx/y座標は間違った方向に歪んでしまいます。

私が間違っているなら、私を修正し、私general approachすることになります。

  1. ベクトル
  2. は にそれを整列させる(加速度計からの)姿勢クォータニオンでそれを回転させ、ジャイロスコープを取得ワールド空間
  3. 右のベクトルを回転させる正規化されたクォータニオンを取得する
  4. このクォータニオンによって(2)から整列したベクトルを回転する以下からのベクトルの補償ベクトル(-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は '現在のコンテキストに存在しません'というエラーメッセージを表示しますが、if-elseペアの代わりにforwardSource定義が1つ存在する場合はうまく動作しますオブジェクトは実際には奇妙な動きをしています。私のジャイロスコープの左右の動きがユニティで上下運動をしているようです。

ローテーションで問題が発生する可能性はありますが、どこには表示されません。

答えて

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変数を使用することができますまたはオブジェクト/カメラを移動すること。

関連する問題