VR酔いを防ぐための実装ノウハウ
6日目の記事です! qiita.com
概要
VRコンテンツを開発しているとユーザー体験の設定上避けて通れないのが、「VR酔い」対策ですね。 Unityで、Rigidbodyくっつけただけだと、Terrain上を動くとふらふらして、筆者もVR酔いになりやすいです。 勉強会メンバーさんから聞いたVR酔いに強い開発対策ノウハウをまとめました。今回も、メンバーのトドネロさん( トドネロ (@x282665) | Twitter )ありがとうございます。
VR酔いの原因と実装可能な対策
VR酔いがどうしてなるのか、については医学的には全然しりませんが、「体は動いてないのに、視覚では動いているので脳の認識が混乱するから」という仮説をトドネロさんに教えていただきました。このVR酔いを柔らげる方法としては、
- 周りを黒くする&視界を狭くする
- テレポートするような画面遷移の実装をしてガタツキなどを減らす
が代表的なもののようです。
テレポートするような画面遷移は以下が一例です。
対策アセット
自分で実装しなくても対策アセットもあります。すごいですね・・・ assetstore.unity.com
OculusGo HMDの方向に前進するコード解説メモ
概要
Oculus GoのHMDの向いている方向に沿って前進するコードを実装したときのメモです。 参考コード記事とともにご覧くださいませ。
デモ
コード
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; //RigidBodyコンポーネント自動付加されます [RequireComponent(typeof(Rigidbody))] public class Walk : MonoBehaviour { Rigidbody m_Rigidbody; [SerializeField] float ForceGravity = 100f; [SerializeField] private Transform _centerEyeAnchor = null; [SerializeField] private float _moveSpeed = 2; // Use this for initialization void Start() { //Playerに付加されているRigidBodyコンポーネントの取得 rb = GetComponent<Rigidbody>(); } void FixedUpdate() { float x = 0.05f; float z = 0.05f; Vector2 touchPad = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad); if (touchPad.x > 0.5 && -0.5 < touchPad.y && touchPad.y < 0.5) //キー右部押す { transform.Rotate(new Vector3(0.0f, 0.5f, 0.0f)); // 右回転 } if (touchPad.x < -0.5 && -0.5 < touchPad.y && touchPad.y < 0.5) //キー左部押す { transform.Rotate(new Vector3(0.0f, -0.5f, 0.0f)); //左回転 } if (touchPad.y > 0.5 && -0.5 < touchPad.x && touchPad.x < 0.5) //キー上部押す { //CenterEyeAnchorの前に向いている方向へRigidBodyポジションを移動 rb.position += _centerEyeAnchor.transform.forward * z; } if (touchPad.y < -0.5 && -0.5 < touchPad.x && touchPad.x < 0.5) //キー下部押す { z -= 0.1f; // 単なるバック rb.position += this.transform.forward * z; } //プレイヤー落下速度調整 rb.AddForce(Vector3.down * ForceGravity, ForceMode.Acceleration); } }
CenterEyeAnchorとPlayerオブジェクトのヒエラルキーの指定メモ画像です
参考・一部引用記事
OculusGo centerEyeAnchor.rotationの値の取得実証実験をしてみた
チュートリアル概要
OculusGoのヘッドセットの角度をセンシングしているセンサーのひとつcenterEyeAnchorの値を読み取ってみた。どこか特定の向きに向いているときのコード実装に有益かなと思います^^
結論
結構ざっくりですが、以下のようになっています。
上を見る
定位置
下を見る
定位置
右を見る
定位置
左を見る
定位置
右に傾く
定位置
左に傾く
定位置
検証方法
UI経由でテキストに表示させました。
UIのTextコンポーネントに追加したY座標の取得コード(x座標取得コードはほぼ一緒なので割愛)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class Showx : MonoBehaviour { private Text targetText; [SerializeField] private Transform _centerEyeAnchor = null; //OVRCameraRig/CenterEyeAnchorをD&D配置 // Use this for initialization void Start () { this.targetText = this.GetComponent<Text>(); } // Update is called once per frame void Update () { this.targetText.text = String.Format("r : {0}", _centerEyeAnchor.rotation); } }
CenterEyeAnchorの配置のUnityEditorの指定メモです
検証結果
そのほか参考になる資料
詳しいです。重宝します
kan-kikuchi.hatenablog.com
Quartanion
spi8823.hatenablog.com
Text表示用の資料です。一応のっけときます
qiita.com
OculusGo コントローラーのタッチパッドの座標情報の取得実証実験をしてみた
チュートリアル概要
OculusGoのコントローラーについているタッチパッドを使った操作を実装しているときに、座標情報がどうなっているか気になったので調べてみた。
結論
以下のようになっています。-1<x<1, -1<y<1の範囲で触れている部分の座標を取得しています。OVRInput.Axis2D.PrimaryTouchpad
で取得します。
検証方法
UI経由でテキストに表示させました。
UIのTextコンポーネントに追加したY座標の取得コード(x座標取得コードはほぼ一緒なので割愛)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class Showy : MonoBehaviour { private Text targetText; // Use this for initialization void Start () { #if UNITY_EDITOR Debug.Log("Unity Editor"); #endif this.targetText = this.GetComponent<Text>(); } // Update is called once per frame void Update () { Vector2 touchPad = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad); //これは特にusingディレクティブとか書かなくてもこの1行で座標情報取得できる this.targetText.text = String.Format("Y is{0}", touchPad.y); #if UNITY_EDITOR this.targetText.text = String.Format("Y is {0}", this.transform.position.y); #endif } }
検証結果
タッチパネル上部分で前進、下部分で後退、タッチパネル左右で回転のコード実行中のタッチパネルに触れている座標情報です。
そのほか参考になる資料
詳しいので重宝します kan-kikuchi.hatenablog.com
簡潔にまとめてあります qiita.com
Text表示用の資料です。一応のっけときます qiita.com
実例として次のステップ用の資料です。実装してみて確認できます
チュートリアル紹介:UnityでARKit2アプリを作る( トドネロさんご提供記事まとめ )
チュートリアル記事まとめ概要紹介
Appleが発表した2018年9月にリリースされたばかりのARKit2.0を使ったデモアプリを作りながら学べる記事をトドネロさん( トドネロ(@x282665)さん | Twitter )からご提供いただきました!
最先端のARの技術を習得するための大きな助けとなる記事群です。お試しください^^/
できるもの
- ARKitを利用したアプリ
- 床や壁面を検知して、タップすると立方体が出現するアプリ
- 床や壁面を検知して、タップすると任意のモデルが出現するアプリ
- 2点をタップして、その2点間の距離測定ができるアプリ
と、基礎から応用まで楽しみな内容です!
必要なもの
チュートリアル記事まとめ
トドネロさん( トドネロ(@x282665)さん | Twitter )の記事になります
第1回UnityでARkit2アプリを作る! lovewcycle.com
第2回UnityでARkit2アプリを作る! ARKitRemoteを使ってラクをしよう lovewcycle.com
第3回UnityでARkit2アプリを作る!距離測定アプリを作る lovewcycle.com