2017-10-25 19 views
1

ジャイロ制御カメラのonButtonClickイベントを有効にしたいが、カメラの現在の位置から開始したい。現在のところ、ジャイロが有効になると、カメラを新しい位置(恐らく現在のジャイロの回転)に移動し、その位置からジャイロすることなくカメラを移動します。現在のデバイス方向でジャイロスコープカメラを有効にする方法

私は理にかなっていますが、基本的には、ゲームで見ているもの(つまり、ジャイロで制御されているカメラではなく、そのユーザーがその変更に気づくことはありません)ここで私が使用しているコードです:

void Update() 
{ 
    Quaternion attitudeFix = new Quaternion (-gyro.attitude.x, -gyro.attitude.z, -gyro.attitude.y, gyro.attitude.w); 
    Quaternion offsetRotation = initialGyroRotation * attitudeFix; 
    rotation = initialRotation * offsetRotation; 
    transform.rotation = rotation; 
} 

public void EnableGyro() 
{ 
    initialGyroRotation = Input.gyro.attitude; 
    initialRotation = transform.rotation; 

    Debug.Log("initialRotation: " + initialRotation.ToString()); 
    Debug.Log("transform.rotation: " + transform.rotation.ToString()); 
    Debug.Log("initialGyroRotation: " + initialGyroRotation.ToString()); 
} 

**

EDIT:は、ここで私は、ユーザーが自分の顔の前で自分のデバイスを保持しているとビューは(見てみたい正確にどのようにの画面です肖像画)と北に向かう。アプリの起動時にデバイスの向きに関係なく、これは縦向きの携帯電話で北向きに表示されます(ユーザーが携帯電話を見ているとき)。

enter image description here

EDIT 2:私は戻って正確にあなたのソリューションを提案するどのようにコードを置くよう テストが混乱になりました。それでもやや問題はありますが、このスクリプトは非常に近いと思われます。主な問題は、私が各テストを実行したときに画面が上の写真のように見えないことです。デバイスを異常な角度で起動します。アプリの起動時にデバイスがどの角度になっているかは重要ではありません。北と肖像を指しているときは上記の画面のように見える必要があります。

私は、より多くのテストを行う必要があり、新しい/クリーンなプロジェクトでそれを行います。

答えて

1

AwakeまたはStart機能のオフセットカメラの位置を取得する必要があります。 Update関数では、そのオフセット値をジャイロセンサーの値に適用します。

オフセットは使用するべきであるが、正しい方法で行っていないようです。混乱する部分は、現在のカメラの回転をジャイロセンサーの値から減算する必要があるオフセットを取得しています。 QuaternionInverseだけでなくQuaternion乗算減算する

Quaternionを追加するには

Quaternion = Quaternion *Quaternion.Inverse

Quaternionを掛け:

Quaternion = Quaternion * Quaternion. 

これはあなたのコードがどうあるべきかであります次のようになります。

Quaternion offset; 

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

void Start() 
{ 
    //Subtract Quaternion 
    offset = transform.rotation * Quaternion.Inverse(GyroToUnity(Input.gyro.attitude)); 
} 

void Update() 
{ 
    GyroModifyCamera(); 
} 

void GyroModifyCamera() 
{ 
    //Apply offset 
    transform.rotation = offset * GyroToUnity(Input.gyro.attitude); 
} 

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

ご協力いただきありがとうございます。あなたのコードは、まさにそれが想定していたものでした。これで作業ができました。もちろん、カメラ上にジャイロを実装し、別のゲームオブジェクトにコンパスをつけているときに他の問題が発生しました。 2軸(X/Z)でジャイロし、残りの1軸(Y)を行う別のゲームオブジェクトにコンパスを設置するカメラを設定することができると思ったら、あなたの考えを知りたいと思います。私は別の質問を開始する必要がありますか? – Valerie

+0

これはまったく別の問題と質問です。これについて新しい質問を作成することができます。何を求めているのかを明確にし、試したことを提供してください。 – Programmer

+0

ありがとうプログラマー、ここに私の新しい質問があります:https://stackoverflow.com/questions/46943868/gyroscope-with-compass-help-needed – Valerie

関連する問題