【Unity】Google SDK規格のVRのジャイロ取得と描画速度を高速化する!
IT技術
Unity + Google Cardboard(グーグルカードボード)で手軽に VR 開発!
3D ゲームが従来に比べ、手軽に開発できる「Unity(ユニティ)」。
「スマートフォンアプリ」はもちろん、「Oculus(オキュラス)」などの VR ゲームの開発も行うことが出来ます。
その VR の中でも、「Google Cardboard(グーグルカードボード)」は、スマートフォンをセットするだけで楽しめるので、気軽に遊ぶことができます。
Google Cardboard で立ちはだかる「遅延問題」
「Google Cardboard」での開発は非常に簡単で、専用のソフトウェア開発キットをダウンロードして、Android アプリとしてビルドするだけです。
しかし、スマートフォンのジャイロセンサの角度の同期や、映像の調整に遅延が発生することがあります。
そして、発生後の映像の描画でも、「遅延が発生するというデメリット」があります。
そこで今回は、その遅延をなくし、快適な VR 環境を作る方法を紹介したいと思います!
今回の Google Cardboard での開発における注意点
- Unity のバージョンは2018 3.14f1です。2019など、他の年のバージョンではエラーが出ることがあります。
- その他、アセットなどの情報は2020年3月7日現在のものです。
- 最終的に 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 を使用していないため、目と目の間の距離や処理速度など、パラメータを調整することで、独自にカスタムすることも可能です。
ぜひ、自分の環境に合わせて、いろいろ調整してみてください!
こちらの記事もオススメ!
2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit