• トップ
  • ブログ一覧
  • 【Unity】Google SDK規格のVRのジャイロ取得と描画速度を高速化する!
  • 【Unity】Google SDK規格のVRのジャイロ取得と描画速度を高速化する!

    広告メディア事業部広告メディア事業部
    2020.05.12

    IT技術

    Unity + Google Cardboard(グーグルカードボード)で手軽に VR 開発!

    3D ゲームが従来に比べ、手軽に開発できる「Unity(ユニティ)」。

    「スマートフォンアプリ」はもちろん、「Oculus(オキュラス)」などの VR ゲームの開発も行うことが出来ます。

    その VR の中でも、「Google Cardboard(グーグルカードボード)」は、スマートフォンをセットするだけで楽しめるので、気軽に遊ぶことができます。

    Google Cardboard で立ちはだかる「遅延問題」

    「Google Cardboard」での開発は非常に簡単で、専用のソフトウェア開発キットをダウンロードして、Android アプリとしてビルドするだけです。

    しかし、スマートフォンのジャイロセンサの角度の同期や、映像の調整に遅延が発生することがあります。

    そして、発生後の映像の描画でも、「遅延が発生するというデメリット」があります。

    そこで今回は、その遅延をなくし、快適な VR 環境を作る方法を紹介したいと思います!

    今回の Google Cardboard での開発における注意点

    1. Unity のバージョンは2018 3.14f1です。2019など、他の年のバージョンではエラーが出ることがあります
    2. その他、アセットなどの情報は2020年3月7日現在のものです。
    3. 最終的に Google SDK は一切、使わないので、Google SDK をインストールする必要はありません

    【Google Cardboard 遅延の原因 その1】カメラの処理が重い

    前述の通り、Google Cardboard 規格では Google SDK という専用の開発キットが用意されています。

    ですが、今回は、この Google SDK は使用せずに開発を行います

    遅延の原因

    Cardborad 規格の VR では、Unity 内のカメラが捉えている映像を、左右の凸レンズ用に調整しています。

    この調整処理に時間がかかってしまうのが、遅延の原因の1つです。

    対処法 ~ カメラを手動で調整!

    そこで、Unity 内に2つのカメラを設置して、直接ディスプレイに結果を表示することで、調整処理にかかる時間を回避します。

    まずは以下の画像のように、ひとつの空のオブジェクト「Eyecenter」に、二つのカメラ「Main CameraL」、「Main CameraR」を子オブジェクトとしてアタッチしてください。

    アタッチした二つのカメラに、パラメータを設定していきます。

    カメラ「Main CameraL」の設定

    「Main CameraL」は、以下のように設定してください。

    ここでの、「Main CameraL」の座標は、親オブジェクトの「Eyecenter」からの相対座標です。

    「Eyecenter」の Transform を、Position「0, 0, 0(原点)」、Rotation「0, 0, 0」とした相対座標になります。

    また、「ViewportRect」は、2つのカメラの画像を直接重ねる、重要な部分なので、間違えないように設定してください!

    カメラ「 Main CameraR 」の設定

    次に、「Main CameraR」の設定をしていきます。

    以下のように設定してください。

    「Main CameraL」と微妙に異なる部分が多いので、気をつけてください!

    Tagの部分には、「MainCamera」以外を設定してください。

    ここでは「Untagged」に変更していますが、「MainCamera」以外であれば問題ありません。

    Transform の Position の X、Rotation の Y には、「Main CameraL」の値の、符号を反転させた値を設定しています。

    「Main CameraL」と同様に、「ViewPortRect」は大事な部分なので、間違えないように気を付けてください!

    遅延対策だけでなく、拡張性もアップ!

    ここまでの遅延対策では、Google SDK を使わずにカメラの調整を行っています。

    Google SDK を使用していないため、様々なパラメータを自分で調整することができます。

    目と目の距離に違和感がある場合は

    「Main CameraL」と「Main CameraR」の、Transform と Position の X 座標を調整してみてください。

    それぞれ符号は逆で、絶対値は同じ値に設定してください。

    上下の動きに違和感を感じる場合は

    使用者の首の長さの違いなどで、上下の角度変更の速さに違いが生じ、違和感を感じることがあります。

    その場合は、Transform 内の Position Y の値を、「Main CameraR」と「Main CameraL」の値が同じになるようにして、調整してみてください。

    【Google Cardboard 遅延の原因 その2】ジャイロの値とカメラの角度の同期に時間がかかる

    これは、スマートフォンのスペックが低い場合に、特に気になります。

    この時間差が大きいと、VR 酔いの原因になります。

    対処法 ~ カメラ角度を手動で調整!

    この問題も、Google SDK を使用せずに、簡単なソースコードで調整することができます。

    1using System.Collections;
    2using System.Collections.Generic;
    3using UnityEngine;
    4
    5public class gyro : MonoBehaviour
    6{
    7    // Start is called before the first frame update
    8    void Start()
    9    {
    10        Input.gyro.enabled = true;
    11    }
    12
    13    // Update is called once per frame
    14    void Update()
    15    {
    16        transform.rotation = Quaternion.AngleAxis(90.0f, Vector3.right) * Input.gyro.attitude * Quaternion.AngleAxis(180.0f, Vector3.forward);
    17    }
    18}

    Update 関数で、ジャイロセンサから取得した値を、直接カメラの角度に適用しています。

    Update 関数の呼び出しで遅くなる場合

    ここで、Update 関数の呼び出しが多すぎて、逆に遅くなる場合があります。

    そのような場合は、コルーチンなどを用いて、一定時間ごとに同期するようにして、処理頻度を調整してみてください。

    1Enumerator gyroctrl() {
    2        yield return new WaitForSeconds(0.1f);
    3        transform.rotation = Quaternion.AngleAxis(90.0f, Vector3.right) * Input.gyro.attitude * Quaternion.AngleAxis(180.0f, Vector3.forward);
    4
    5        StartCoroutine("gyroctrl");
    6
    7    }

    こちらの問題でも、Google SDK を使わない方法で対処しているので、様々なパラメータを自分で調整することができます。

    例えば、回転の角度を360度の全天球から、180度に制限するといったことが可能です。

    また、コルーチンを用いた方法であれば、角度の同期時間を調整して、ゲームの場面の必要性に応じて、画面をロックすることも可能です。

    さいごに

    今回は、Google Cardboard 規格の VR 開発を行う上での、主な2つの遅延の原因とその対処方法について解説してみました。

    Google SDK を使わないことで、とても軽い動作が実現したのではないでしょうか!

    また、今回紹介した対処法では、Google SDK を使用していないため、目と目の間の距離や処理速度など、パラメータを調整することで、独自にカスタムすることも可能です。

    ぜひ、自分の環境に合わせて、いろいろ調整してみてください!

    こちらの記事もオススメ!

    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事