Unity+Oculus Rift開発メモ

2015年05月18日

このエントリーをはてなブックマークに追加

Oculus Riftと、PCやビデオカードの選定、Unityで対応ソフトウェアを制作するためのTipsなどについてまとめています。

更新履歴

(2015年5月18日)SDK 0.6.0に仮対応。変更が多いためまだ追いついていないです。
(2015年5月16日)Oculus Rift製品版の情報と推奨PCスペックなどを追記
(2015年5月14日)Unity 5.1の記述を増加、「レンダリング解像度を変更するには?」に変更
(2015年5月11日)Unity 5.1の位置トラッキングリセット方法を追記
(2015年5月7日)「製品版はどうなるの?」を追加

Oculus Riftについて

Oculus Riftって何?

Oculus Rift(オキュラス・リフト)は、Oculus VR社が開発中のバーチャルリアリティ用ヘッドマウントディスプレイです。比較的広視野な立体視が可能で、かつ、頭を動かして周囲を見回すことができるため、CGの世界に本当に入り込んだような体験ができるのが特徴です。適切に調整すれば、空間内の物体が現実と同じサイズ・同じ場所に見えて、手を伸ばせば触れそうに感じられます。とても面白いデバイスです。

2015年5月現在、開発者向けの二世代目のキット(DK2)が販売されています。製品版は2016年の第1四半期にリリース予定とのことです。

Unityを使うとOculus Rift対応アプリケーションが簡単に開発できます。

Oculusはラテン語由来で目の意味です。公式のロゴがまんま目ですね。Riftは裂け目で、現実とバーチャル空間の裂け目というようなニュアンスがあるようです。

問題点はないの?

ヘッドマウントディスプレイを用いたバーチャルリアリティでは、VR酔いが発生します(乗り物酔いと似たようなものです)。酔いを引き起こす最大の原因は、頭や身体の動きと目で見ている光景のずれです。Oculus Riftでは、応答の速い有機ELディスプレイや、表示遅延を低減するさまざまな工夫を用いることでVR酔いをかなり低減できていますが、PCのセットアップや、アプリケーションの作り方が重要になります。

特にフレームレートの確保が最も重要で、左右両画面を常時最大フレームレート(DK2では75fps)で描画するために高性能なGPUが必要です。2015年現在では、だいたいGeForceやRadeonのミドルレンジ以上が必要になります。PC環境については下でもう少し詳しく触れていますので参照してください。

あと、視野はかなり広いのですが(映像鑑賞のための普通のヘッドマウントディスプレイが45度程度なのに対して、Oculus Riftは約90~100度あります)、十分に広いとは言えないかもしれません。現実世界でゴーグルを装着しているような感じです。解像度も現在の片目あたり960x1080では広い視野を覆うのに十分ではなく、ディテールが見えづらいほか、ピクセルの境界で網目模様が見えます(スクリーンドア効果)。

また、多少重かったり、暑いと汗でレンズが曇ったりします。それと、DK2のレンズは適切なコーティングがされていないのかかなり傷が入りやすいです。さらに、次項で触れますが、メガネをかけたままでの装着が難しいです。

ただ、Oculus Riftはまだ開発機の段階です。GPUの性能も含めて、ハードウェアの問題については将来的に改善されていくのではないでしょうか(新型プロトタイプのCrescent Bayは、解像度と重量がだいぶ改善されています)。

他には、原理的に、ヘッドマウントディスプレイを装着すると手元のキーボードやマウス、ゲームコントローラーなどが見えません。周囲が見えないため安全面の問題も生じます。また、VR空間内では自分の手が見えなかったり、身体を動かすと物体をすり抜けてしまったりします。こうした制約をコンテンツや運用でどうカバーするかが鍵になりそうです。おそらく最大の制約はVR酔いです。

視力が低くても大丈夫?

DK2にはA、Bの二種のレンズが付属していて、視力にあわせて交換できます。ただし、近視用のBレンズを使用すると視野がやや狭くなります。空間的な余裕がないため、メガネは基本的に入りません。小さいメガネならぎりぎり入りますので、Riftの横についているダイヤルで目とレンズの距離を広げて装着することもできますが、レンズが遠くなることで視野がだいぶ狭くなりますし、レンズの接触で傷がつくリスクが生じます。100%楽しみたければコンタクトレンズがベストなのではないでしょうか。

とりあえず、かなり目の悪い自分がBレンズ・裸眼で楽しめていますが、度が弱いのと、開発時にメガネをかけたりはずしたりするのが面倒なため、コンタクトレンズを検討中という感じです。

ちなみに、現時点では入手不可能ですが、ソニーのProject Morpheusはメガネが入りやすいです。また、サムスン・Oculus VR共同開発のGear VRは上部ダイヤルで視力にあわせてピントを調整できるようになっています。Oculus Riftにも何らかの対策を期待したいところです。Crescent Bayでもメガネの入りにくさはDK2同様でした。

どうすれば買えるの?

公式サイトから直接注文できます。送料と消費税・関税などがかかります。納期要確認です。自分のときは本体350ドル+送料75ドルで、FedExから別途2100円の請求が来ました。

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

(2015年5月)製品版の発売が決まったため、DK2の供給が制限される可能性があるようです。開発に必要な場合は急ぎ入手したほうがいいかもしれません。

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

基本的には、公式サイトからUnity用のパッケージをダウンロードしてプロジェクトにインポートし、Oculus Rift用のカメラに置き換えてビルドするだけで対応ソフト完成です。実際簡単です。

ただし、OculusのSDKには現状かなり癖がありますので、適宜最新情報を追う必要があります。

UnityのPro版が必要なんでしょ?

無料版で大丈夫です。Unity Technologies社とOculus VR社の提携によって、Unity 4.5.5からPro版でなくてもOculus Rift対応ソフトが作れるようになりました。さらに、Unity 5ではプラグインの使用を含めUnity 4 Proの機能のほとんどが解禁されています。

他にも対応しているゲームエンジンはある?

Unreal Engineが標準でOculus Riftに対応しています。重量級のゲームエンジンのため、フレームレート確保のために若干工夫が必要です。

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

はてなブックマークでOculus RiftタグVRタグなどでちょくちょくブクマしていますので参照してください。また、FacebookにOculusデベロッパー助け合い所VR Japanというグループがあります。

なお、このページも適宜最新情報にあわせて内容を更新しています。

製品版はどうなるの?

とりあえず実物を体験してみたい

有志によるOculus Rift体験イベントが各地で開催されています。OcuFes公式サイトなどをチェックしてみてください。

秋葉原のG-Tune : GarageでDK2の常設展示が行われています(あまり状態は良くないです)。

また、家電量販店のGalaxy ShopでGear VRのデモが行われています。


PC環境について

Oculus Rift向きのPCが欲しい

左右両画面をレンダリングしなければならないこと、常時75fpsの確保が必要なことから、高性能なビデオカードを搭載したPCが必要です。もちろん描画内容次第ですが、普通に3Dゲームを遊ぶときと比べて数倍のGPU性能が必要だと考えてください。2015年現在では、GeForceやRadeonのミドルレンジ以上が望ましいです。いわゆるゲーミングPCを購入するか、自分でそうしたPCを組む必要があります。

重要なことなので強調しておきますが、75fpsのキープは絶対条件です。PSやXboxのゲームでよく、60fpsで動きをなめらかにするか、30fpsでグラフィックを綺麗にするかというような論争がありますが、VRでは高フレームレートが出ていないと頭の動きと視界の不一致で酔います。すぐに気分が悪くなります。また、没入感も大きく変わってきます。

ちなみに、解像度、フレームレートともにまだまだ不足と考えられているため、要求水準は上がっていくものと思われます。解像度が足りないのは、同じ解像度でも、普通のディスプレイに表示するのと視野全体を覆うのとではピクセルの密度がまったく違ってくるためです。DK2は解像度1920×1080・リフレッシュレート75Hzですが、製品版のOculus Riftは2160×1200/90Hzになるようです。要求性能はフレームレートと画素数に概ね比例すると考えるなら、単純計算でDK2の1.5倍のGPU性能が必要になります。また、Oculus VRからは、「完璧なVRには8Kでも足りない」、「120Hzは何としても越えないといけない壁」といった発言が出てきています。これについて行くとすれば、ほどほどの性能のビデオカードを買い換えて行くのがいいのかもしれません。

大雑把な目算ですが、GPUのベンチマークの一つであるPassMark - G3D Markのスコアで、DK2で1500から2000、製品版で3000か4000程度のものが必要なのではという感覚です。

Oculus Rift DK2 動作状況報告シートに多数のPC環境での動作報告がまとめられていますので参考にしてください。

(2015年5月)Oculus VRからOculus Rift製品版の推奨PCスペックが公表されました。

この推奨スペックはOculus Riftの製品ライフタイムの間維持されるので、対応ゲームやアプリケーションを開発する際にはこのターゲット環境に向けて最適化して欲しいとのことです。このスペックのPCがあれば、安心してすべてのOculus Rift用ソフトを楽しめるという状態を作りたいようです。

なお、Windowsに注力するため、MacとLinuxは当面サポートしないとのことです。

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

Oculus VR自身はノートPCの使用を推奨していません。また、製品版もノートPCは非サポートとなることが表明されています。もしデモや展示などでノートPCを使用する場合は、高性能なGPUを積んだゲーミングノートというカテゴリのものが必要です。さらに、そうしたゲーミングノートには、Intel統合グラフィックスとGeForceを自動的に切り替えるOptimusという機構が搭載されていることが多いのですが、このために、Oculus Riftに映像を直接出力するDirectモードが使えない等の支障が発生しているようなので要注意です。

また、ゲーミングノートは薄い筐体にハイパワーなGPUを搭載している都合上、発熱の問題があります。不安になるくらい熱くなったり、真夏の屋外でのOculus Riftの展示で別途冷却が必要になったというような話があります。

無理せずデスクトップPCを使うのも一つの方策かもしれません。また、MSI GT72、NEXTGEAR-NOTE i5702などが非Optimusということで注目されています。

大雑把なGPUの性能表と参考機種です。

GPU PassMark G3D 参考機種
GeForce GTX 980M 6786 MSI GT72
GeForce GTX 880M 4591
GeForce GTX 680M 4341
GeForce GTX 970M 4217 NEXTGEAR-NOTE i5702
Razer Blade(新型)
GeForce GTX 780M 4116
GeForce GTX 750 Ti 3627
GeForce GTX 870M 3586 Razer Blade(旧型)
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

自分はGeForce GT 750M搭載のMacBook Pro Retinaの最上位機種にBoot CampでWindows 7をインストールしてイベント展示などに使用しています。DK2で自作のソフトがDirectモードでほぼ75fps出ていますが、正直、スペック的に厳しいです。製品版のOculus Riftには性能不足だと思います。

こんな感じで外部電源なしでVRできます。HDMI端子とUSBポート2つ(Rift本体と付属の位置トラッキング用カメラ)を使っています。

Macじゃダメなんですか?

(2015年5月)Oculus VRより、Oculus Rift製品版ではWindowsに注力するため、MacとLinuxのサポートを停止するとのアナウンスが出ました。再開を検討しているが時期は未定とのことです。

Windowsをおすすめします。Boot CampでインストールしたWindowsでも使用できます。

まず、ハードウェアとしてのMacの大きな問題として、GPUの制約があります。Windowsでは自作やBTOで高性能なビデオカードの載ったPCを入手しやすいのですが、MacでOculus Riftを快適に動かすためには、iMacの最上位機種か、Mac Proが必要になってきます。また、Windowsにはゲーミングノートがあるのに対して、MacBook Proは最上位機種でもGeForce GT 750M止まりです(とはいえ、Optimus問題のないMacBook Pro Retinaはそれはそれでありな雰囲気です)。

また、UnityやUnreal Engineといったゲームエンジンも、OS XよりもBoot Camp上のWindowsで動かしたほうがフレームレートが出ているように思います。Windows 10でDirectX 12が使われるようになると、さらに差がつく可能性があります。

Oculus Rift対応ゲームもWindowsのほうが多いです。Oculus Riftは、3Dゲームにより没入感をという文脈から登場したデバイスという一面がありますので、現時点ではゲームに強いWindowsがホームグラウンドだと言えるかもしれません。

さらに、Oculus Riftと他の特殊なデバイスを組み合わせて使う場合があるのですが、そうしたデバイスのSDKがMacに対応していないことがあります(例えばLogitechのステアリングコントローラなど)。


開発Tips

以下、開発Tipsです。DK2と、SDKのバージョン0.6.0に基づいています(一部内容が古い場合があります)。0.4.3と0.6.0で大きな変更が入っていますので注意が必要です。Unity 5.1もまた使い方が変わります(「Unity 5.1について」を参照)。

セットアップするには(Windows)

まず、Oculus Runtime for Windowsをダウンロードしてインストールします。インストールしたら、タスクトレイのOculusのアイコンからConfiguration Utilityを起動して、Riftが認識されているか確認してください(「Oculus Rift DK2 Ready」の表示と画像が出ます)。また、Rift Display Modeを確認してください。使えるならRiftのドライバに映像を直接出力するDirect HMDモードがおすすめです。

初めて使用する場合、ファームウェアをアップデートする必要がある場合があります。メニューのTools > Advanced > Update Firmware… を使って更新します。

Userのところの+ボタンを押してユーザープロファイルを作成します。左下のShow Demo Sceneをクリックして、デモが動作すれば成功です。また、Oculus SDK for WindowsをダウンロードしてOculus World Demoも実行してみてください。この2つが一番安定して動作するデモです。

上手くいかない場合、以下も参照してみてください。

Unityで対応ソフトを作るには

Unity 4 Integrationをダウンロードして、OculusUnityIntegration.unitypackageをインポートします(Unity 5でも使用できます)。Main Cameraを削除または無効化して、OVRPlayerControllerまたはOVRCameraRigをシーンに配置してスタンドアローンでビルドし、実行するとRiftの画面に出力されます。

OVRPlayerControllerはキーボードなどでシーンを歩きまわれるようにOVRCameraRigがセットアップされたものです。

(SDK 0.6.0)SDK 0.5.0.1までは通常のexeファイルとあわせて*_DirectToRift.exeが作られ、Riftに出力するにはこちらを実行する必要があったのですが、0.6.0では不要になったようです(ただ、Unity 5ではなぜか生成されてしまいます。バージョンチェックがおかしい?)。

また、OVRPlayerControllerを使用すると無限にエラーが出ます。Input Buttonの設定がおかしいようです。修正を待つか、0.5.0.1を使用するのがいいかと思います。

(Unity 5.1)現在ベータテストが行われているUnity 5.1では、Player Settingsで「Virtual Reality Supported」をチェックするだけでOculus Rift対応になります。パッケージのインポートやカメラの入れ替えは不要になり、*_DirectToRift.exeもなくなります。

動かない/スムーズに動かない

今のところ、だいぶ癖があるようで、試行錯誤することになると思います。正常に動作していればDemo SceneやOculus World Demoと同じようにスムーズに動いてヘッドトラッキングもぴったりついてくるはずですが、そうでない場合何かがおかしいです。

PC環境によって症状がかなりバラバラなようです。以下のようなことを試してみてください。

Unity 5でも使えるの?

動作します。SDK 0.4.4ではOVRMainMenu.csで「’UnityEngine.RenderMode’ does not contain a definition for ‘World’」というエラーが出ますので、SDK 0.5.0.1以降を使用してください。

ビルドせずにOculus Riftで表示を確認したいんだけど…

(Unity 5.1)ベータテスト中のUnity 5.1では、エディタで再生するとOculus Riftで直接表示できるようになっています。

(SDK 0.6.0)コンソールのメッセージを見るとExtendモードにすると可能なように見えるのですが、未調査です。

(SDK 0.5.0)ExtendモードでGameビューをOculus Riftの画面に持って行って最大化する方法があります。試していませんが、これを楽にするスクリプトが作成されています。

OculusのパッケージをインポートするとUnityの起動ダイアログが出なくなる

解像度などを変更できるとOculus Rift向けのセッティングを壊してしまうため、OVRShimLoader.csによって、PlayerSettingsのDisplay Resolution DialogがHidden By Defaultに変更されています。また、UnityのPreferencesにOculus VRという項目が追加されますが、上手く動いていないようです。ちょっと扱いが難しいのですが、おそらくUnity 5.1でこの辺りは解消されるのではと思います。

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

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

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

以前はFollow Orientationというチェックボックスがあったのですが、SDK 0.4.3以降では、単純にOVRCameraRigをオブジェクトの子にすれば良くなりました。

Unity 5.1でも普通にカメラを使用するだけでオーケーです。

オブジェクトに載せたカメラをロールしないようにするには?

VR酔いを軽減する方法の一つに、水平線を傾けないようにするというものがあります(参考:Oculus Rift用シューティングの制作・展示メモ)。LateUpdateでOVRCameraRigのrotationを上書きすれば簡単です。参考コードです。

using UnityEngine;

public class Stabilizer : MonoBehaviour
{
    void LateUpdate()
    {
        Quaternion rotation = transform.parent.rotation;
        rotation.x = 0;
        rotation.z = 0;
        transform.rotation = rotation;
    }
}

親子関係を切って追従するようにしてもいいかもしれません。

OVRPlayerController以外でもOculusのメニューを使いたい

(SDK 0.6.0)OVRMainMenu.csはなくなったようです。

OVRCameraRigにOVRMainMenu.csをアタッチします。”No OVRPlayerController attached.“という警告が出ますが、無視して構いません。気になるようなら該当のDebug.LogWarningを無効にしてください。

OVRMainMenuのショートカットキーを教えて

主なものを挙げます。

キー 機能
スペース メニュー表示オン・オフ
M ミラーリング(Oculus Riftの画面をPCにも表示する)のオン・オフ
R 位置トラッキングのリセット
T Time Warpのオン・オフ
G グリッドキューブを表示
F11 フルスクリーン・ウィンドウモード切り替え
Esc アプリケーション終了

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

表示するオブジェクト(Canvasなど)をOVRCameraRigの孫のCenterEyeAnchorに接続します。

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

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

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

Unity 4.6の新GUIを使うには?

CanvasのRender ModeをWorld Spaceにします。Scaleを小さくして(0.01など)、シーン内の適当なところに配置するか、CenterEyeAnchorに接続してください。

頭の向きなどでインタラクションしたい場合には、凹さんのエントリが参考になりそうです。

位置トラッキングの合わせ方について教えて

まず、OVRCameraRigのみを使用する場合は、OVRCameraRigをシーン内のプレイヤーの頭の両目の中間の位置に正しく配置してください。その上で、アプリケーション開始後にプレイポジションを決めて(ちょうどいい場所に立つ、椅子に深く座るなど)、キーなどで位置・方向をリセットします。以下のようなスクリプトを使用します。

using UnityEngine;

public class RKeyToRecenterPose : MonoBehaviour
{
    void Update()
    {
        // Rキーで位置トラッキングをリセットする
        if(Input.GetKeyDown(KeyCode.R)) {
            OVRManager.display.RecenterPose();
        }
    }
}

OVRPlayerControllerを使用している場合にはOVRMainMenu.cs(SDK 0.5.0以前)によってすでにRキーでリセットできるようになっています。また、OVRPlayerControllerでは、Oculus Configuration Utilityのユーザーの身長の設定でOVRCameraRigの高さが決まります(デフォルトのUse Profile Heightチェック時)。

位置トラッキングカメラのトラッキング範囲は、カメラからの距離0.4メートルから2.5メートル、水平74度、垂直54度の錐台です。Oculus Configuration UtilityのShow Demo SceneでCamera Boundsをオンにしてみると分かりやすいです。Riftがカメラの視界に入ってさえいれば、位置・向きとも比較的自由にトラッキングされますので、必ずしもカメラをプレイヤーの真正面に置く必要はありません。ただし、DK2後方の一定角度は死角になりトラッキングがはずれます。なお、新型プロトタイプのCrescent Bayでは真後ろを向いてもトラッキングできるようになっていました。

(Unity 5.1)Unity 5.1 beta 6以降ではInputTracking.Recenter()で位置トラッキングをリセットできます。

using UnityEngine;
using UnityEngine.VR;

public class RKeyToRecenter : MonoBehaviour
{
    void Update()
    {
        // Rキーで位置トラッキングをリセットする
        if(Input.GetKeyDown(KeyCode.R)) {
            InputTracking.Recenter();
        }
    }
}

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

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

「HEALTH & SAFETY WARNING」の警告メッセージはなくせないの?

隠しオプションで消すことができます。レジストリの

にLibOVRというキーを作って、その中にHSWToggleEnabledという文字列キーで1を設定します。

Oculus Configuration Utilityを開いてAdvanced…をクリックすると、「Disable Health and Safety Warning」というチェックボックスができているはずです(Windowsを再起動しなくても大丈夫です)。警告をきちんと読んだこと、他の人が警告画面を読まずにOculus Riftを使用しないことに同意する必要があります。

公式のドキュメントでは、Oculus Developer Guideの7.2 Health and Safety Warningを参照してください。

警告メッセージが閉じたかどうか調べる方法は?

OVRCameraRigだけのシーンを用意して以下のようなスクリプトを配置すれば、警告メッセージが閉じられるのを待ってメインのシーンに飛ぶことができます。また、DismissHSWDisplayで一定時間後に自動的に閉じることができます。

using UnityEngine;

public class OculusWarning : MonoBehaviour
{
    void LateUpdate()
    {
    OVRManager.DismissHSWDisplay();
    if (!OVRManager.isHSWDisplayed) {
            Application.LoadLevel("main");
        }
    }
}

カメラの背景色やスカイボックス、クリッピング範囲などを変更したい

OVRCameraRigの孫のLeftEyeAnchorとRightEyeAnchorの両方のカメラの設定を変更してください。

イメージエフェクトをかけるには?

OVRCameraRigの孫のLeftEyeAnchorとRightEyeAnchor両方にエフェクトのスクリプトをアタッチします。

レンダリング解像度を変更するには?

パフォーマンスが出ない場合に、OVRCameraRigのNative Texture ScaleとVirtual Texture Scaleでレンダリング解像度を下げることができます。

Native Texture Scaleによって、確保されるレンダリング・テクスチャのサイズが決まります。表示品質が欲しい場合には1より上げ、パフォーマンスが欲しい場合には1より下げます。この値は実行中には変更できません。実際のレンダリング解像度はOculusのメニューのResolutionで確認できます。

デフォルトでは、画面の中央においてレンダリング・テクスチャの1ピクセルがRiftの1ピクセルになるような解像度に設定されています。出力前の樽型変形で周辺部が圧縮されるため、パネルの解像度よりも大きくなっています。

実行中に描画解像度を一時的に落とすにはVirtual Texture Scaleを使います。

(Unity 5.1)Unity 5.1ではVRSettings.renderScaleのみでシンプルにレンダリング解像度を変更できるようになっています。

using UnityEngine.VR;
...
VRSettings.renderScale = 0.5f; // デフォルトは1.0f

beta 6現在、エディタで実行中に変更すると固まったりします。ビルドしたものは大丈夫のようです。

Oculus Riftの位置・向きを取得するには?

OVRManager.display.GetHeadPoseで取得できます。

OVRPose pose = OVRManager.display.GetHeadPose();

// 位置
Vector3 position = pose.position;
// 向き
Quaternion rotation = pose.orientation;

(Unity 5.1)InputTracking.GetLocalPosition/GetLocalRotationでカメラオブジェクトを基点にしたローカル座標と向きが取得できます。

using UnityEngine.VR;
...
Vector3 position = InputTracking.GetLocalPosition(VRNode.CenterEye);
Quaternion rotation = InputTracking.GetLocalRotation(VRNode.CenterEye);

VRNode.LeftEye/RightEye/CenterEye/Headでそれぞれ左右の目と、目の中間、頭部の位置・向きが取得できます。CenterEyeとHeadは同じ値が戻ってくるようです。

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

Riftが接続されていれば、OVRManager.display.isPresentがtrueになります。

(Unity 5.1)Unity 5.1ではUnityEngine.VR.VRDevice.isPresentを使用します。

同じプロジェクトでOculus Rift版と通常版をビルドしたい

Unity 5.1では特に工夫することなく通常・Oculus Rift両対応になりますので、この項目は不要になるはずです。

実行バイナリを分ける方法と、一緒にする方法が考えられます。

まず、バイナリを分ける方法としては、PlayerSettingsのOther SettingsタブにあるScripting Define Symbolsを使って、例えばOCULUSシンボルが定義されていればOVRCameraRigを、されていなければ通常のカメラを有効にするといいのではと思います。参考コードです。

using UnityEngine;

public class VRCamera : MonoBehaviour
{
    public Transform riftCameraPrefab;

    void Awake()
    {
        #if OCULUS
        // OCULUSシンボルが定義されていればカメラを入れ替え
        Transform riftCamera = (Transform) Instantiate(riftCameraPrefab, transform.position, transform.rotation);
        riftCamera.parent = transform;

        transform.Find("Camera").gameObject.SetActive(false);
        #endif
    }
}

一緒にする方法としては、OVRManager.display.isPresentでRiftの有無を調べて、あればOVRCameraRigを、なければ通常のカメラを使用するようにすることが考えられます。

using UnityEngine;

public class VRCamera : MonoBehaviour
{
    public Transform riftCameraPrefab;

    void Awake()
    {
        // Riftの状態を取得するために、OVRCameraRigをとりあえずインスタンス化
        Transform riftCamera = (Transform) Instantiate(riftCameraPrefab, transform.position, transform.rotation);
        riftCamera.parent = transform;

        if (OVRManager.display.isPresent) {
            // Riftが接続されていれば通常カメラを無効化
            transform.Find("Main Camera").gameObject.SetActive(false);
        } else {
            // Riftが接続されていなければOVRCameraRigをただちに削除
            DestroyImmediate(riftCamera.gameObject);
        }
    }
}

なお、先述のように、OVRShimLoader.csによって、起動ダイアログを隠したりといった処理が行われています。これの扱いに困るため、現時点ではバイナリを分けたほうがいい印象があります。

PCの画面に通常のカメラや別視点の映像を表示するには?

Noraさん制作のOVRMirrorで実現できます。Left/RightEyeAnchorにOVRMirror.csをアタッチして、Oculus EnableとOculus Camera Bindedをチェックしてください。別視点のカメラが欲しい場合には、Render Textureを割り当てたカメラを作って、OVRMirror.csをアタッチしてください。

なお、オフィシャルで同様の機能がサポートされる見込みのようです。

シーンにOVRCameraRigを複数設置して同時描画できる?

可能です。マルチレイヤーレンダリングが正式にサポートされています。後から描画する方のOVRCameraRigのLeftEyeAnchorとRightEyeAnchorのCameraのClear FlagsをDon’t Clearに、Depthを1以上に変更してください。また、CenterEyeAnchorにアタッチされている余分なAudio Listenerを削除してください。

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

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

Unity 5.1ではOculus RiftサポートがUnity本体に組み込まれますので、SDK・プラグインを同梱する必要はなくなると思います。

酔いを低減するには?

VR酔いは、乗り物酔いと同じように、自分が予測・体感している動きと視覚情報との間にずれがあると発生します。ですので、とにかくまず描画負荷を低減する、レンダリング解像度を下げる、高性能なビデオカードを使うなどして、最大フレームレートを確保するのが重要です。スムーズに75fps再生できないとあっという間に酔います。それと、現状ゲーム等ではプレイ時間を短めにするのがいいのではないでしょうか。

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

スケール(縮尺)に関する注意

Riftのカメラは実際の左右の目と同じ間隔(デフォルトでは0.064=6.4cm、Oculus Configuration Utilityで変更可)でシーン上に配置され、これによってVR空間の物体が現実的な大きさに感じられるようになっています。Unityは1ユニット=1メートルが基本になっていますので、特に実写系のコンテンツではこれを守りましょう。例えば、身長170cmのキャラクターを出すときは、Unity上で頭頂まできっかり縦1.7になるようにサイズを調整しましょう。これをはずすとちょっともったいない気がします。

Cubeオブジェクトを作って適当なスケールを入力して、定規代わりにすると便利です。

ちなみに、キャラクターのスケールを変更する場合、OVRPlayerControllerやOVRCameraRigのスケールを変更すれば頭部モデルもついてくるはずとのことです。

サウンドに関する注意

スピーカーとヘッドホンでは音声の定位が異なります。ヘッドホンは頭を動かすと一緒に回りますが、スピーカーは回りません。デフォルトではOVRCameraRigのCenterEyeAnchorにAudio Listenerがアタッチされていて、ヘッドホンを想定した状態になっているため、スピーカーで音声を出力する場合は対処が必要になります。

なお、新型プロトタイプのCrescent Bayにはヘッドホンが標準装備されていますので、ヘッドホン使用が基本になるのかもしれません。

APIリファレンスはないの?

公式サイトのこちらにあります。

(Unity 5.1)こちらのドキュメントにUnityEngine.VRのAPIの解説があります。

Oculus SDKの技術的な詳細が知りたい

下記スライドにSDKやOculus Riftの原理上の非常に詳しい解説があります。

Unity 5.1について

Unity 5.1ではOculus RiftサポートがUnity本体に統合されます。これまでのようにパッケージをインポートしたり、カメラを入れ替えたりする必要がなくなり、Player Settingsで「Virtual Reality Supported」をチェックしてエディタで再生するだけでOculus Riftに出力されます。また、*_DirectToRift.exeがなくなり、ビルドしたものをOculus Riftを接続して実行すると自動的にVRモードになります。

Unity 5.1は現在RC版が公開されています。今のところだいぶ不安定な印象です。正式版は6月9日にリリース予定のようです。

また、こちらのドキュメントにUnity 5.1のVRサポートの詳細が書かれています。HRTF(頭部伝達関数)を用いた3Dオーディオや、uGUIの頭の向きによる入力、Gear VRサポートなどが予定されているとのことです。また、UnityEngine.VRで使用できるAPIの解説があります。

使用方法はこれまでのOculus VRのものとは別物で、Unity 5.1とOculus SDKの関係がどうなるかについてはよく分かっていません。

OVRMainMenuのようなメニュー機能は今のところないようです。また、左右両画面でシャドウマップの描画を共通化する等、ステレオレンダリングの最適化が行われているようです。

OVRManager.csで”event must be of a delegate type”というエラーが出る

Actionという名前のクラスがあると競合が発生します。

不具合まとめ

個人的に遭遇している不具合を載せます。


番外編

Oculus Riftアプリケーションの配布方法は?

普通に自分のウェブサイトで公開する以外には、Oculus VR公式のOculus VR Shareに登録して配信することができます(アプリ審査あり)。さらに、これとは別に製品版に向けて公式ストアを準備中だそうです。ただ、こちらは、少なくとも当初は、個人等には開放されないかもしれません。

また、SteamではOculus Riftに対応しているゲームに「VR サポート」というタグがついています。

ブラウザ(HTML5)では使えないの?

現在、FirefoxとChromeにおいて、WebVRというAPIの検討が始まっています。Oculus Riftなどの方向・位置センサーの状態をこのAPIで取得して、Three.jsなどを使って3D描画、変形表示をすることになります。はてなブックマークでWebVRタグで追っていますので参照してください。IEの開発チームも関心を持っているようです。

個人的には、VRというのは表示遅延や描画負荷など非常にシビアな処理ですし、また、ゲームエディタなしでVRソフトを作るのは困難なので、UnityやUnreal Engineなどのネイティブなゲームエンジンに頼ったほうがいいのではと思っています。Unity 5のWebGL出力などもいずれWebVRに対応するのではないでしょうか。

オープンなVRヘッドセットやゲームエンジンの発展にも期待したいところです。

なお、UnityのJonas Echterhoff氏が、「(WebVRの)サポートを追加することはおそらく難しくないので、将来のある時点でそうすることはあり得ると思います。が、我々のゴールは(WebGL)リリースの安定化です。現時点では新機能の追加はしないでしょう」とコメントしていました。

Oculus Riftの取り扱いで気をつけることは?

DK2のレンズは非常に傷つきやすいので注意です。眼鏡の接触で傷が入ったり、袋に入れて持ち運んでいたらいつのまにか細かい傷がたくさん入っていたりというようなことが起きています。拭くときは、カメラ用のレンズクリーナーを使うといいようです。

なお、傷が入ってしまったレンズを研磨剤で磨いてみたところ、一応修復できました。自己責任でお願いします。

また、スポンジ部分は取り外すことができます。ツメを折らないように注意してください。

イベント展示について

展示作品を検討している場合、手妻師さんのスライド「VRソフトのプロデュース」は必見です。特に、26ページからの「VR体験ソフトの評価」はとても参考になります。

また、Oculus VRから一般展示にOculus RiftやGear VRを使用する際のガイドラインが公開されました。厳しい項目もあり議論があるのですが、要確認です。Oculus Riftはまだ開発機だということと、事故を起こさないようにすることが基本軸かと思います。

雑多なメモ

参考になる本はある?

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

また、OcuFes桜花一門さんとゆーじさんが初のOculus Rift本を執筆されました。拙作も1ページ紹介されています。

このページ書いてる人はどんなの作ってるの?

3D駐車シミュレーターや、シューティングゲーム「シルエットストライカー」などを作っています。Oculus Rift対応ソフトコーナーにぜひお立ち寄りください。

書いた人:こりん(@k0rin / id:korinchan
このエントリーをはてなブックマークに追加
ブログトップへ RSS