xR Deveropers Japan Blog

xRTechが好き・興味がある方のコミュニティです。勉強会やスラックなどでの情報共有を行っています。興味のある方、お気軽にご参加ください^^プログラミングなど未経験の入門希望者も歓迎しています。

VR酔いを防ぐための実装ノウハウ

Untitled

6日目の記事です! qiita.com

概要

VRコンテンツを開発しているとユーザー体験の設定上避けて通れないのが、「VR酔い」対策ですね。 Unityで、Rigidbodyくっつけただけだと、Terrain上を動くとふらふらして、筆者もVR酔いになりやすいです。 勉強会メンバーさんから聞いたVR酔いに強い開発対策ノウハウをまとめました。今回も、メンバーのトドネロさん( トドネロ (@x282665) | Twitter )ありがとうございます。

VR酔いの原因と実装可能な対策

VR酔いがどうしてなるのか、については医学的には全然しりませんが、「体は動いてないのに、視覚では動いているので脳の認識が混乱するから」という仮説をトドネロさんに教えていただきました。このVR酔いを柔らげる方法としては、

  • 周りを黒くする&視界を狭くする
  • テレポートするような画面遷移の実装をしてガタツキなどを減らす

が代表的なもののようです。

テレポートするような画面遷移は以下が一例です。

対策アセット

自分で実装しなくても対策アセットもあります。すごいですね・・・ assetstore.unity.com

OculusGo HMDの方向に前進するコード解説メモ

f:id:k_mawa:20181207214536p:plain

概要

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オブジェクトのヒエラルキーの指定メモ画像です f:id:k_mawa:20181207214536p:plain

参考・一部引用記事

参考引用しました。チュートリアルとしても素晴らしいです。 qiita.com

OculusGo centerEyeAnchor.rotationの値の取得実証実験をしてみた

f:id:k_mawa:20181207202654p:plain

チュートリアル概要

OculusGoのヘッドセットの角度をセンシングしているセンサーのひとつcenterEyeAnchorの値を読み取ってみた。どこか特定の向きに向いているときのコード実装に有益かなと思います^^

結論

結構ざっくりですが、以下のようになっています。

上を見る

定位置 f:id:k_mawa:20181207202654p:plain f:id:k_mawa:20181207202609p:plain

下を見る

定位置 f:id:k_mawa:20181207202654p:plain f:id:k_mawa:20181207202624p:plain

右を見る

定位置 f:id:k_mawa:20181207202654p:plain f:id:k_mawa:20181207202742p:plain

左を見る

定位置 f:id:k_mawa:20181207202654p:plain f:id:k_mawa:20181207202755p:plain

右に傾く

定位置 f:id:k_mawa:20181207202654p:plain f:id:k_mawa:20181207202814p:plain

左に傾く

定位置 f:id:k_mawa:20181207202654p:plain f:id:k_mawa:20181207202828p:plain

検証方法

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の指定メモです f:id:k_mawa:20181206213016p:plain

検証結果

そのほか参考になる資料

詳しいです。重宝します
kan-kikuchi.hatenablog.com

Quartanion
spi8823.hatenablog.com

Text表示用の資料です。一応のっけときます
qiita.com

OculusGo コントローラーのタッチパッドの座標情報の取得実証実験をしてみた

f:id:k_mawa:20181206162707p:plain

チュートリアル概要

OculusGoのコントローラーについているタッチパッドを使った操作を実装しているときに、座標情報がどうなっているか気になったので調べてみた。

結論

以下のようになっています。-1<x<1, -1<y<1の範囲で触れている部分の座標を取得しています。OVRInput.Axis2D.PrimaryTouchpadで取得します。

f:id:k_mawa:20181206163325p:plain

検証方法

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

実例として次のステップ用の資料です。実装してみて確認できます

qiita.com

チュートリアル:OculusGo+Unity+VR実装入門(2018年11月動作確認)

f:id:k_mawa:20181206125918p:plain

チュートリアル概要

OculusGoでVRアプリを作るということを、デモアプリを作って動かす一連の流れを通じて理解し、実装力をつけるための入門チュートリアルです。

できるもの

OculusGoでキューブを間近で眺められるというだけのアプリ

必要なもの

  • PC
  • OculusGo

チュートリアル本編

xrdevjaのメンバーmawaの記事になります。

k-mawa.hateblo.jp

チュートリアル紹介:UnityでARKit2アプリを作る( トドネロさんご提供記事まとめ )

f:id:xrdevja:20181205220036p:plain

チュートリアル記事まとめ概要紹介

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

チュートリアル:モバイル+AR実装入門(ARCore編)(2018年10月動作確認)

f:id:xrdevja:20181205213711j:plain

チュートリアル概要

Google発のARの開発モジュール、ARCoreを活用した簡単なデモアプリをビルドしてみるチュートリアルです。ARCoreの基礎と基礎的な実装方法を理解し、コーディングが始められるようになります。

できるもの

床や壁面を検知して、クリックすると、ドロイド(Androidのマスコットキャラクター(?))が配置されるというデモアプリです。

必要なもの

チュートリアル本編

xrdevjaのメンバーmawaの記事になります。

k-mawa.hateblo.jp