2017-01-29 17 views
1

私は、ジャイロスコープを使用するゲームを作るためにUnityを使用しています。私は画面を通過する軸周りのデバイスの回転を検出しようとしている、私はそれがUnity SpaceのZ軸だと仮定している。私はInput.gyro.attitude.eulerAngles.zを使用しようとしましたが、他の軸を中心にデバイスを傾けると一定ではありません。たとえば、Z軸だけが車のステアリングホイールの回転を決定するように一定にしておきます。これをどのように実装できますか?Unity - ジャイロスコープ - 1軸回りの回転

編集: 私は何か他のことを試みました。デバイスの向きを最初に知られることはありませんので

Vector3 gInput = Input.gyro.rotationRateUnbiased; 
    gyroEuler += gInput * Time.deltaTime * Mathf.Rad2Deg; 

    float rollAngle = gyroEuler.z; 

    while (rollAngle < 0) 
    { 
     rollAngle += 360; 
    } 
    while (rollAngle > 360) 
    { 
     rollAngle -= 360; 
    } 

しかしgyroEulerは、ゲーム開始時に関わらず、デバイスの向きの(0, 0, 0)に設定されます:私が代わりにここで

Input.gyro.attitude.eulerAnglesInput.gyro.rotationRateUnbiasedを使用したコードですまたInput.gyro.rotationRateUnbiasedは非常に不正確です。私はTemple Run 2のように多くのゲームを画面上で回転させたいと思っていますが、私はそれを360度回転させてその回転角を得たいと思っています。

+0

可能な重複http://stackoverflow.com/questions/41818719/how([モバイルジャイロスコープの入力を使用して、カメラを回転させながら、私のカメラのZの回転をロックする方法]私が撮ったカメラの中で私が撮ったものをカメラで回転させながら撮ったもの) – Kardux

+0

いいえ、それは私をあまり助けてくれませんでした。 –

+0

たとえば、「オイラー角」を推定する必要はありませんが、変換された軸(現在の回転による)と地面などの角度を単純に推定できます。 https://upload.wikimedia.org/wikipedia/en/thumb/3/30/Plane_with_ENU_embedded_axes.svg/220px-Plane_with_ENU_embedded_axes.svg.png – minorlogic

答えて

2

まあ、私はちょうどそれを試してみました、それがうまく機能:

private void Start() 
{ 
    Input.gyro.enabled = true; 
} 

private void Update() 
{ 
    Vector3 previousEulerAngles = transform.eulerAngles; 
    Vector3 gyroInput = -Input.gyro.rotationRateUnbiased; 

    Vector3 targetEulerAngles = previousEulerAngles + gyroInput * Time.deltaTime * Mathf.Rad2Deg; 
    targetEulerAngles.x = 0.0f; // Only this line has been added 
    targetEulerAngles.z = 0.0f; 

    transform.eulerAngles = targetEulerAngles; 

    //You should also be able do it in one line if you want: 
    //transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y - Input.gyro.rotationRateUnbiased.y * Time.deltaTime * Mathf.Rad2Deg, 0.0f); 
} 

あなたがする必要がある何がそれの子として中央を変換(またはあなたのプレーヤーを使用)を作成し、親のあなたカメラをです。 カメラ距離、高さ、および角度を設定して、ビューを調整します。最後に上記のスクリプトをに変換:回転すると、カメラが円弧の周りを移動します。

EDIT:あなたの代わりにInput.gyro.attitudeを使用したい場合

private Vector3 startEulerAngles; 
private Vector3 startGyroAttitudeToEuler; 

private void Start() 
{ 
    Input.gyro.enabled = true; 
    startEulerAngles = transform.eulerAngles; 
    startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles; 
} 

private void Update() 
{ 
    Vector3 deltaEulerAngles = Input.gyro.attitude.eulerAngles - startGyroAttitudeToEuler; 
    deltaEulerAngles.x = 0.0f; 
    deltaEulerAngles.z = 0.0f; 

    transform.eulerAngles = startEulerAngles - deltaEulerAngles; 
} 

public void ResetGyro() 
{ 
    startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles; 
} 

EDIT 2従うとして、あなたはそれを行うことができます:私はあなたが探しているものを推測

thisのようなものになります。下/上および左/右軸についてupVec.yおよびupVec.xをチェックすることができます。

最初に空のゲームオブジェクトを作成し、これをジャイロスコープの回転を含むダミーとして使用し、スクリプトのphoneDummyフィールドに設定します。

public Transform phoneDummy; 

private void Start() 
{ 
    Input.gyro.enabled = true; 
} 

private void Update() 
{ 
    Vector3 gyroEuler = Input.gyro.attitude.eulerAngles; 
    phoneDummy.transform.eulerAngles = new Vector3(-1.0f * gyroEuler.x, -1.0f * gyroEuler.y, gyroEuler.z); 

    Vector3 upVec = phoneDummy.transform.InverseTransformDirection(-1f * Vector3.forward); 
} 

upVec.yあなたピッチupVec.xがあなたのロール軸になるだろう。 (軸の参考のためhereを確認してください)

しかしInput.gyroから心の値に保つためには、はるかに完璧からです:あなたがより持続値(しかし、もちろんあまり正確なもの)を探しているなら、あなたはInput.compass.magneticHeadingを使用することをお勧めします。このことができます

希望、

+0

これはうまく動作しますが、角度を正確に計算することはできません。私はInput.gyro.attitudeを使用することを考えていたので、画面の回転角度を測定したいのですが、どのように使用するのか分かりません。どのように動作するのかよくわかりません。 –

+0

@MoazAshraf 'Input.gyro.attitude'の使い方で自分の投稿を編集しましたが、それを使うことによる副作用があります(デバイスを垂直に前後に傾けると方向が180°変わる)。 – Kardux

+1

これはまさに私が回転を一定にしたいと言ったときの意味です。どうすれば副作用を取り除くことができますか? –

関連する問題