VRのSDKを使わずにUnityでVRの作り方

カードボードなどのVRのSDKを入れなくてもUnityでVRを実装する方法を教えてもらったらめちゃくちゃ簡単でした。

2眼カメラを作る

まずは2眼のカメラの作り方から。仕組みは簡単で要は右目と左目のカメラを用意して表示範囲を左右半分づつにするだけです。

ヒエラルキーに両目のカメラを入れる空のGameObjectを0,0,0に置く。とりあえずVRHeadと名前をつけて、その中にカメラを2つ配置してEyeLeftとEyeRightと名前をつけます。これがそれぞれ右目と左目用のカメラになるわけですね。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-32-08

このままだとまだ画面は1つなので、

画面を2つに分割する

画面を2つに分割します。表示領域を左右に分割して表示すればよくて、まず左目用のEyeLeftを選択してインスペクターの中のCameraを開く。ここのViewport Rectの設定を変更すると表示領域が変わります。画面をRectとして、X,Yで表示開始座標、W,Hで幅と高さを設定してあげます。

左目はこんな感じ

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-35-24

右目はこんな感じ

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-37-32

これで画面が半分に分割されます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-38-07

 

デバイスの回転を実装

カメラはできたので、今度はデバイスの回転を拾って画面に回転を反映させる方法。やることは3つです。

1.デバイスのジャイロを使えるようにする

2.ジャイロの回転を拾う

3.VRHeadに回転を反映させる

これだけです。では先ほどのVRHeadに新しくスクリプトRvVRCameraを作ります。

`using UnityEngine; using System.Collections;

public class RvVRRotation : MonoBehaviour {

public GameObject Head;

// Use this for initialization
void Start () {
	Input.gyro.enabled = true;
}

// Update is called once per frame
void Update () {
	
	if (Input.gyro.enabled)
	{
        Quaternion direction = Input.gyro.attitude;
        Head.transform.localRotation = Quaternion.Euler(90, 0, 0) * (new Quaternion(-direction.x,-direction.y, direction.z, direction.w));
	}
}

} `

まず、

void Start () { Input.gyro.enabled = true; }

ここでデバイスのジャイロを有効に

Quaternion direction = Input.gyro.attitude;

ここでジャイロの回転を取ってきます

Head.transform.localRotation = Quaternion.Euler(90, 0, 0) * (new Quaternion(-direction.x,-direction.y, direction.z, direction.w));

VRHeadにジャイロの回転を渡して画面に反映させる

あとはインスペクタのRvVRRotationのHeadにVRHeadを入れてあげればOK

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-22-21-55-50

これだけでスマホでVRができてしまいます!素晴らしく簡単な方法を教えてもらいました。

ただ他のVR用のSDKを入れると解決するのかはわからないのですが、Galaxy S6のジャイロがどうもノイズが多くて酔います。。iPhoneやNexus5ではそうでもないので、端末の問題だと思うんですけど、ローパスフィルタは必須ですね。