質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

3048閲覧

unityでInputTracking.disablePositionalTrackingを使った、起動時に傾いてしまうカメラの固定方法

tottyan

総合スコア14

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2017/09/01 02:38

編集2017/09/01 02:44

###前提・実現したいこと
unityのcardboard GoogleVRで
InputTracking.disablePositionalTrackingを使ってカメラを起動時に固定したいです。できるのであるのなら他の方法でもかまいません。
回答よろしくお願いします。

図1 スマホの画面の図
イメージ説明

###発生している問題・エラーメッセージ

マニュアルを読んで自分なりにやったのですがスマホからみて画面が傾いたままになっている。

###該当のソースコード

C#

1//MainCameraの親オブジェクトのスクリプト 2using UnityEngine; 3using UnityEngine.VR; 4using System; 5 6public class CameraControl : MonoBehaviour { 7 public Vector3 difference; 8 float differenceZ; 9 10 GameObject kamera; 11 12 // Use this for initialization 13 void Start() { 14 InputTracking.disablePositionalTracking = true; 15 difference = transform.position; 16 differenceZ = difference.z; 17 //デバッグ時に使う 18 GameObject ga = GameObject.FindWithTag("Hello"); 19 TextMesh hum = (TextMesh)(ga.GetComponent<TextMesh>()); 20 hum.text = "x="+ kamera.transform.rotation.x+" y="+kamera.transform.rotation.y+" z="+kamera.transform.rotation.z; 21 22 } 23 24 // Update is called once per frame 25 void Update() 26 { 27 //プレイヤー機にカメラが追従するようになっている 28 if (GameObject.FindWithTag("player") == true) 29 { 30 Vector3 vecP = GameObject.FindWithTag("player").transform.position; 31 Vector3 vec3 = transform.position; 32 vec3.z = vecP.z+differenceZ; 33 transform.position = vec3; 34 } 35 } 36} 37

###試したこと
・InputTracking.disablePositionalTrackingの値をtrueにしたりfalseにしたりした。
・起動時のスマホの方向を反転させた物をVRカメラの親オブジェクトに入れてカメラの傾きを打ち消そうとしたが見当違いな方へいってしまう。VRカメラオブジェクトの向きで同様のことをしてもだめでした。
以下VRカメラの親のオブジェクトのスクリプト

C#

1//3Dシューティングゲームのカメラの親ゲームオブジェクトのソースコードです 2 3//カメラの位置を引く 4using System.Collections; 5using System.Collections.Generic; 6using UnityEngine; 7using UnityEngine.VR; 8using System; 9 10public class CameraControl : MonoBehaviour { 11 public Vector3 difference; 12 float differenceZ; 13 14 GameObject kamera; 15 16 // Use this for initialization 17 void Start() { 18 difference = transform.position; 19 differenceZ = difference.z; 20 //カメラが今向いてる向きを取得 21 kamera = GameObject.FindWithTag("MainCamera"); 22 //反転させる 23 Quaternion hanten=Quaternion.Euler(-kamera.transform.rotation.x,-kamera.transform.rotation.y,kamera.transform.rotation.z); 24 transform.rotation = hanten; 25 } 26 27 // Update is called once per frame 28 int count; 29 void Update() 30 { 31 //プレイヤー機にカメラが追従するようになっている 32 if (GameObject.FindWithTag("player") == true) 33 { 34 Vector3 vecP = GameObject.FindWithTag("player").transform.position; 35 Vector3 vec3 = transform.position; 36 vec3.z = vecP.z+differenceZ; 37 transform.position = vec3; 38 } 39 } 40} 41 42//スマホの方向から 43using UnityEngine; 44using UnityEngine.VR; 45using System; 46 47public class CameraControl : MonoBehaviour { 48 public Vector3 difference; 49 float differenceZ; 50 51 GameObject kamera; 52 53 // Use this for initialization 54 void Start() { 55 difference = transform.position; 56 differenceZ = difference.z; 57 //カメラが今向いてる向きを取得 58 Vector3 trackingPos = 59 InputTracking.GetLocalPosition(VRNode.CenterEye); 60 61 62 //反転させる 63 Quaternion hanten =Quaternion.Euler(-trackingPos[0]*180,-trackingPos[1]*180,-trackingPos[2]*180); 64 transform.rotation = hanten; 65 //デバッグ時に使う 66 GameObject ga = GameObject.FindWithTag("Hello"); 67 TextMesh hum = (TextMesh)(ga.GetComponent<TextMesh>()); 68 hum.text = "x="+ kamera.transform.rotation.x+" y="+kamera.transform.rotation.y+" z="+kamera.transform.rotation.z; 69 70 } 71 72 // Update is called once per frame 73 void Update() 74 { 75 //プレイヤー機にカメラが追従するようになっている 76 if (GameObject.FindWithTag("player") == true) 77 { 78 Vector3 vecP = GameObject.FindWithTag("player").transform.position; 79 Vector3 vec3 = transform.position; 80 vec3.z = vecP.z+differenceZ; 81 transform.position = vec3; 82 } 83 } 84}

###補足情報(言語/FW/ツール等のバージョンなど)
cardboard GoogleVR
android lollipop
GoogleVRForUnity_1.70.0
Unity 2017.1.0f3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

InputTracking.disablePositionalTrackingは私の勘違いでした。
InputTracking.disablePositionalTrackingで無効にできるのは位置のみで、回転についてはtrueにしても有効のままだそうです。
大変失礼いたしました。

本題ですが、「起動時に固定させ、その後の首振りは固定させたのを基準にして回転させる」といった場合であれば、以下のようになります。
Quaternion.Inverse()で逆回転を求めています。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CameraControl : MonoBehaviour 6{ 7 public Vector3 difference; 8 float differenceZ; 9 10 GameObject kamera; 11 12 // Use this for initialization 13 void Start() 14 { 15 difference = transform.position; 16 differenceZ = difference.z; 17 //カメラ自身を取得(カメラの向きではない) 18 kamera = GameObject.FindWithTag("MainCamera"); 19 //反転させる 20 Quaternion hanten = Quaternion.Inverse(kamera.transform.rotation); 21 transform.rotation = hanten; 22 } 23 24 // Update is called once per frame 25 int count; 26 void Update() 27 { 28 //プレイヤー機にカメラが追従するようになっている 29 if (GameObject.FindWithTag("player") == true) 30 { 31 Vector3 vecP = GameObject.FindWithTag("player").transform.position; 32 Vector3 vec3 = transform.position; 33 vec3.z = vecP.z + differenceZ; 34 transform.position = vec3; 35 } 36 } 37}

余談ですが、transform.rotationで取得できる値は、オイラー角(「x軸を中心に○度」といったもの)ではなく、Quaternionというもので、これはx,y,z,wの4つの値で構成されます。
そのため、

C#

1 Quaternion hanten=Quaternion.Euler(-kamera.transform.rotation.x,-kamera.transform.rotation.y,kamera.transform.rotation.z);

とするのは間違いです。
オイラー角を取得するためには、代わりにtransform.eulerAnglestransform.rotation.eulerAnglesを使う必要があります。


追記:
もし、「起動後もずっと固定させる」場合は、以下のソースをカメラ本体にアタッチしてください。
この場合、CameraControl.csでの回転処理は不要です。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class DisableTrackingCamera : MonoBehaviour 6{ 7 Quaternion defaultRotation; 8 9 void Awake() 10 { 11 // 「固定する向き=エディター上での向き」とする 12 defaultRotation = transform.rotation; 13 } 14 15 void OnPreCull() 16 { 17 transform.rotation = defaultRotation; 18 } 19}

投稿2017/09/01 06:08

編集2017/09/01 07:02
fiveHundred

総合スコア9774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tottyan

2017/09/02 07:03

たびたびの回答ありがとうございます。 細部にわたって詳しい説明でわかりやすかったです。 今後も何かありましたら、よろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問