Unity+Oculus Rift開発メモ

2013年09月24日

Oculus Riftと、Unityで対応ソフトウェアを制作するためのTipsについてまとめてみました。
(2014年6月23日更新)

Oculus Riftについて

Oculus Riftって何?

Oculus Rift(オキュラス・リフト)は、Oculus VR社が開発中のバーチャルリアリティ用ヘッドマウントディスプレイです。比較的広視野な立体視と、非常に高速なヘッドトラッキングで、CGの世界に本当に入り込んだような体験ができるのが特徴です。とても面白いデバイスです。

2014年3月までに初代の開発キット(DK1)が販売された後、現在、二世代目のキット(DK2)の予約が開始されています。一般向けの製品は、対応ソフトが揃い、十分なクオリティのものをリリースする準備ができてからと考えているようです。

Unityを使うとOculus Rift対応アプリケーションが簡単に開発できます。UnityのProライセンスが必要です。

Oculusはラテン語由来で目の意味です。公式のロゴがまんま目ですね。

問題点はないの?

DK1には、解像度がかなり低い(片目640x800)、応答の遅い液晶ディスプレイのため頭を回すとブラーがかかる、位置トラッキングがなく頭の平行移動についてこない、そしてこれらの理由で非常に酔いやすいという難点があります(VR酔いと呼ばれています。乗り物酔いと似たようなものです)。DK2では片目960x1080の有機ELディスプレイになり位置トラッキングがついたため、だいぶ改善しているようですが、アプリケーションの作り方が重要になりそうです。

他には、左右両画面を高フレームレートで描画するために高性能なGPUが必要なことや、装着しているときは(必然的に)手元のコントローラなどが見えないこと、セットアップが若干手間なことなどが挙げられると思います。

視力が低くても大丈夫?

A、B、Cの三種のレンズが付属していて、視力にあわせて交換できます。ただし、近視用のCレンズを使用すると視野がやや狭くなります。メガネをかけたまま装着することも不可能ではないようですが、こちらも視野が狭くなりますし、レンズが接触するなどおすすめできないと思います。おそらくコンタクトレンズがベストなのではないでしょうか(つけたことないですが)。とりあえず、かなり目の悪い自分がCレンズで楽しめています。

どうすれば買えるの?

2014年3月にDK2の予約注文が開始されました。350ドル+送料(75ドル)です。

なお、残念なことに特定の輸入代行業者を通しての購入でトラブルが発生していますので注意してください。公式サイトから直接購入するのが一番です。

ちなみに、DK1にはUnityのProライセンスの試用版がついてきましたが、DK2には今のところその予定はないようです。

どうすればUnityで使えるの?

公式サイトからUnity 4 Pro Integrationをダウンロードして、OculusUnityIntegrationパッケージをプロジェクトにインポートし、カメラをOVRCameraControllerに置き換えてビルドすれば対応ソフト完成です。実際簡単です。

UnityのPro版が必須なの?

プラグインを使うため必要です。ただ、抜け道として、Noraさんが開発されているOVRAgentを使えばフリー版でも行けるようです。フリー版で普通に開発できるようにUnityに圧力をかけるといいと思います。

ちなみに他のゲームエンジンでは、Unreal Engine 4がデフォルトでOculus Riftに対応していて、初期費用も少ないです(Oculus Rift with Unreal Engine 4 @ 第2回裏ocufes)。ただし、エンジン自体が重量級なので、かなり要GPUパワーです。

参考になる記事などはある?/新情報は?

はてなブックマークでOculus Riftタグでちょくちょくブクマしていますので参照してください。

活用例は?

有名ですが、@GOROmanさんがNovint Falconと組み合わせて制作されたMiku Miku Akusyuはまさにキラーコンテンツだと思います。すさまじい実体感があります。

それと、VR Jam 2013の入賞作品に面白いものがいろいろあります。個人的にはDumpyが白眉だと思います。ヘッドトラッキングがそのまま操作に繋がっていて楽しいです。

あと手前味噌ですが、3D駐車シミュレーターというものを試作していますので、よろしければご覧ください。

製品版に向けて数多くの対応ゲームやVR作品が作られているようで、どんなものが出てくるか非常に楽しみです。


開発Tips

以下、開発Tipsです。DK1と、SDKのバージョン0.3.1(一部0.2.5c)に基づいています。

ディスプレイのセッティングはどうすればいいの?

PCのディスプレイとOculus Rift(DVIまたはHDMI端子接続)とにミラー表示して開発するのが基本になります。

なお、UnityからWindowsのスタンドアローンでビルドしたアプリケーションは、-adapter 1オプションをつけるとサブディスプレイで実行できます。Macにはこのオプションはありません。

Windowsのスタンドアローンでビルドしたプログラムの動作がおかしい(Oculus Rift対応ソフトの動作がおかしい)

Oculus Riftが認識されない、表示が壊れる、クラッシュする、といった問題が起きる場合、

がインストールされていることを確認してください。それぞれ、Build SettingsのArchitectureのx86またはx86_64で必要です。

使用中に横方向のトラッキングがずれていく

ヨー・ドリフト(yaw drift)という問題です。Riftはこれを磁気センサーで補正できるようになっていますが、そのためにはキャリブレーションが必要です。

キャリブレーションをするには、Unity 4 Pro Integrationのアーカイブに付属しているOculusConfigUtilを実行します。メニューバーのToolsからMagnetic Calibration…を選択して、Oculus Riftを頭(のある場所)に近づけてStartボタンを押し、バーが一杯になるまでRiftをいろんな方向に向けます。Saveボタンで結果が保存され、アプリケーションで補正が行われるようになります。

ちなみにSDK 0.2.5cからキャリブレーションがかなり通りにくくなっています。回し方のコツを説明する動画が作成されています(45秒から)。公式フォーラムのこのスレッドで話題になっています。

自動車や飛行機など、移動するオブジェクトにカメラを載せるには?

OVRCameraControllerをそのオブジェクトの子にして、コンポーネントのFollow Orientationに親オブジェクトをセットします。

ゲームおよびシーン開始時のOculus Riftの向きについて

DK1では絶対的な方向は取れず、デバイスが初期化されたときの向きが前方になるため、この点について考慮が必要です。公式フォーラムのスレッドで話し合われていた内容です。

シーン間でOculus Riftの向きを維持するには?

デフォルトでは、Application.LoadLevelでシーンを移動するとRiftの向きがリセットされます。向きをキープしたい場合には、OVRCameraControllerのOVRDeviceコンポーネントのReset Tracker On Loadをオフにします。

Oculus Riftの向きを任意にリセットするには?

OVRDevice.ResetOrientation();

で、今Riftが向いている方向が前方になります(SDK 0.3.1からデバイス番号の指定がなくなっています)。

メッセージなどを常に同じ位置に表示するには?

3D Textかテクスチャを貼ったポリゴンを、OVRCameraControllerの子のCameraRightに接続します。CameraLeftの子にすると描画順序の関係からブレが発生します。

テクスチャポリゴンは3D空間内で他のオブジェクトと干渉しないよう、以下のような変更を加えたシェーダーを使います。

Tags { "Queue" = "Overlay" } // 最後に描画する
ZTest Always // Zテストをせず描画する

NGUIを使う場合にはこちらの記事が参考になると思います。同様の手法です。

スカイボックスの表示がおかしい

SDK 0.3.1からUnity標準のSkyboxでも大丈夫になったようです。

SDK 0.2.5以前ではUnity標準のSkyboxを使用できません。3Dモデルとして設置する必要があります。Noraさんが公開されているSkyboxMesh.csを使うのが簡単です。こちらで詳しい使い方が紹介されています。

Oculus Riftの接続チェックをするには?

以下で調べられます。

if (OVRDevice.IsSensorPresent()) { /* 接続! */ }

OVRDevice.csはOVRCameraControllerにアタッチされていて、Awake関数で初期化されるので、APIはそれ以降にコールする必要があります(例えばStart関数など)。

また、Oculus Riftの電源が入っていなくても、USBケーブルさえ繋がっていれば接続状態になっていることに注意です。

Web Playerとプロジェクトを共通化したい

プラットフォーム依存コンパイルを使って、スタンドアローンではOVRCameraControllerを、Web Playerでは通常のカメラを使うようにすればいいと思います。なお、Web PlayerでOVRCameraControllerをシーンに配置・実行するとクラッシュします(無効化状態なら大丈夫?)。

参考コードです。

public class VRCamera : MonoBehaviour
{
    public GameObject riftCameraPrefab;

    void Awake()
    {
#if UNITY_STANDALONE
        // スタンドアローンならRift用カメラをインスタンス化
        GameObject riftCamera = Instantiate(riftCameraPrefab, transform.position, transform.rotation) as GameObject;
        riftCamera.transform.parent = gameObject.transform;

        if (!OVRDevice.IsSensorPresent()) {
            // Riftが接続されていなければすぐに削除
            DestroyImmediate(riftCamera);
        } else {
            // Riftを使用するので通常カメラを無効化
            transform.Find("Camera").gameObject.SetActive(false);
        }
#endif
    }	
}

Sceneビューのカメラアイコンが大きくて目の位置がよく分からない

SceneビューのバーにあるGizmosをクリックして、3D Gizmosのスライダーを左に動かしてみてください。

酔いを低減するには?

乗り物酔いと同じように、自分が予測・体感している動きと視覚情報との間にずれがあると酔いが発生します。ですので、とにかくまず描画負荷を低減したり、高性能なビデオカードを使うなどして、高フレームレートを確保するのが重要です。ほぼ60fps必須です。30fpsや、それより低いとあっという間に酔います。それと、現状ゲーム等ではプレイ時間をできるだけ短くして、数分から10分程度に収めるのがいいのではないでしょうか。

また、公式からOculus VR Best Practices Guideというガイドラインが公開されています。非公式の日本語訳(本編付録)もあります。縮尺や移動速度を正確にする、頭の動きとは無関係なカメラ移動をしない、ユーザーが常に(ポーズ中やカットシーンでも)周囲を見回せるようにする、水平線や大きな表示要素を動かさない、加減速は短くあるいは即座に、残弾数は浮いているHUDではなく武器それ自体に表示する、等々、非常に多数の注意事項がありますので、じっくり読んでおいたほうがいいと思います。ここで挙げたものはほんの一部です。

解像度が低い

アンチエイリアスをかけるとかなり効果的です。UnityのEdit > Project Settinds > Qualityで、BeautifulやFantasticを選ぶとアンチエイリアスが有効になるようにしておくといいと思います。ポストエフェクトのアンチエイリアスを使ってもいいかもしれません。

Oculus Rift向きのビデオカードが欲しい

左右両画面をレンダリングしなければならないこと、上述のように最低60fpsでアンチエイリアスをかけるのが望ましいことから、高性能なGPUが必要です。もちろん描画内容次第ですが、普通にゲームを遊ぶときと比べて数倍のGPU性能が必要だと考えてください。

ちなみに、解像度、フレームレートともにまだまだ不足と考えられているため、要求水準は上がっていくものと思われます。Oculus VRからは、「完璧なVRには8Kでも足りない」「120Hzは何としても越えないといけない壁」といった発言が出てきています。最初の製品版では90Hz(90fps)を目指しているそうですので、そうなると当然60fpsに比べて1.5倍の性能が必要になります。

Oculus Rift向きのノートPCが欲しい

現状、CPU内蔵のGPUでは苦しいです。できれば、ゲーミングノートというカテゴリのものが望ましいです。

自分向け検討メモです。描画内容や品質にもよりますが、使った上での所感としては、Surface Pro 2では不足で(ただし60fpsで動く軽量なデモもそこそこあります)、MacBook Pro Retinaで一応合格ライン、ただし今後を考えると不安、という感触です。

次の「Macでも大丈夫なの?」もあわせてご覧ください。

GPU PassMark G3D 参考機種
GeForce GTX 880M 4591  
GeForce GTX 780M 4116  
GeForce GTX 750 Ti 3627  
GeForce GTX 870M 3586  
GeForce GTX 860M 3415 NEXTGEAR-NOTE i420
GeForce GTX 770M 2611  
Radeon HD 7770 2157  
GeForce GTX 765M 1904 NEXTGEAR-NOTE i410
GeForce GT 750M 1667 15インチMacBook Pro Retina (Late 2013)
GeForce GT 650M 1290 15インチMacBook Pro Retina (Early 2013)
Intel Iris Pro 5200 853  
Intel HD Graphics 5000 562 MacBook Air (2014)
Intel HD Graphics 4400 504 Surface Pro 2
Intel HD Graphics 4000 466  
Intel HD Graphics 3000 307  

DisplayPortまたはThunderbolt出力しかない場合にはHDMI変換器が必要です。

Macでも大丈夫なの?

Unity+Oculus Riftで開発するだけなら基本的には問題ありません。ただ、フルスクリーンで実行すると右画面が白く飛ぶ不具合が起きています。アンチエイリアスやポストエフェクトを切ったり、ウィンドウモードで画面いっぱいに広げて実行すると大丈夫のようです。

もしOculus Rift対応ソフトをいろいろ遊びたければ、Macで動かないものが多いので、Boot CampでWindowsをインストールしたほうがいいかもしれません(自分はWindows 7を再生用にインストールしています)。また、Oculus Rift以外のハードウェアと組み合わせて使うときにそちらがMacに対応していなくて困る場合があります。

ちなみに、MacBook Pro RetinaでHDMI端子とThunderbolt+HDMI変換器を使って3画面ミラー表示ができました。Oculus Riftでプレイしながら、その様子をプロジェクターに出力できます。

OculusのSDKを配布物に含めてもいいの?

例えばUnity Asset Storeでアセットに含めて配布する場合などが考えられると思います。商業・クローズドソースのものに含めても問題なしとのことです。

参考になる本はある?

Oculus Riftよりも前の情報になりますが、VR全般を包括的に扱っている「バーチャルリアリティ学」という本があります。

また、Oculus Riftそれ自体を扱う本も現在執筆されているようです。

comments powered by Disqus