Unity+Oculus Rift開発メモ

2015年06月23日

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

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

更新履歴

(2015年6月26日)「製品版はどうなるの?」に一件追加
(2015年6月24日)Unity 5.1.1p1の修正を反映、「不具合まとめ」を更新
(2015年6月19日)「PCの画面に別視点の映像を表示するには?」を更新
(2015年6月18日)「Unity GUIを使うには?」を更新
(2015年6月17日)「VRサポートでエディタから再生するとカクつく」、「unsupported graphics APIと怒られる」を追加
(2015年6月15日)「オブジェクトに載せたカメラをロールしないようにするには?」に解説画像を追加、製品版のメガネ対策について追記
(2015年6月13日)「depthSurface == NULL(略)というエラーで動かない」を追加

Oculus Riftについて

Oculus Riftって何?

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

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

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

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

問題点はないの?

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

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

フレームレートを確保した上でも、視点の移動を抑えたり回避するなど、VR酔いしにくくするための制作上の工夫が必要になります。

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

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

ただ、こうしたハードウェア上の問題は製品版ではいくらか改善されているようです(下の「製品版はどうなるの?」を参照)。

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

視力が低くても大丈夫?

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

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

最新プロトタイプのCrescent Bayでもメガネの入りにくさはDK2同様でした。が、製品版のOculus Riftには交換できる複数の形状の内装が付属し、メガネをかけたまま着用できるそうです。期待です。

ちなみに、現時点では入手不可能ですが、ソニーのProject Morpheusはメガネが入りやすいです。また、サムスン・Oculus VR共同開発のGear VRは上部ダイヤルで視力にあわせてピントを調整できるようになっています。

どうすれば買えるの?

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

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

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

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

Unity 5.1では標準でOculus Riftをサポートしていて、「Virtual Reality Supported」の設定をオンにするだけで使用できます。

ただし現状やや癖がありますので、適宜最新情報を追う必要があります。

Unityの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は何としても越えないといけない壁」といった発言が出てきています。これについて行くとすれば、ほどほどの性能のビデオカードを買い換えて行くのがいいのかもしれません。

大雑把な目算ですが、最低限VRソフトを作るためには、GPUのベンチマークの一つであるPassMark - G3D Markのスコアで、DK2で1500から2000、製品版で3000か4000程度のものが必要なのではという感覚です。Oculus VRは製品版の要求スペックとしてさらに高性能なGPUを推奨しています。

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

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

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

なお、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 (Late 2013)の最上位機種にBoot CampでWindows 7をインストールしてイベント展示などに使用しています。DK2で自作のソフトがDirectモードでほぼ75fps出ていますが、正直、スペック的に厳しいので、最近はデスクトップPCを持ち運びはじめました。製品版の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は最上位のRadeonやGeForce搭載機種でもデスクトップのローエンドのビデオカード程度のGPU性能しかありません(とはいえ、Optimus問題がなくノートPCとしての実用性もあるMacBook Pro Retinaはそれはそれでありな雰囲気です)。

また、UnityやUnreal Engineといったゲームエンジンも、OS XよりもBoot Camp上のWindowsで動かしたほうがフレームレートが出ているように思います。Oculus Rift対応ゲームもWindowsのほうが多いです。

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

さらに、Oculus Riftと他の特殊なデバイスを組み合わせて使う場合があるのですが、そうしたデバイスのSDKがMacに対応していないことがあります。


開発Tips

以下、開発Tipsです。Unity 5.1.1p1およびOculus SDK 0.6.0に基づいています。一部内容が古い場合があります。

セットアップするには(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で対応ソフトを作るには

2015年6月時点では、Unity 5.1標準のVRサポートを使用する方法と、Oculus VR社のUnity 4 Integrationパッケージを使用する方法があります。基本的には前者を使います。

(Unity 5.1)Player SettingsのOther Settingsにある「Virtual Reality Supported」をオンにしてください。エディタの再生ボタンを押すか、StandaloneでビルドするとOculus Riftで表示されます。簡単です。

なお、Color SpaceをLinearにする場合はUnity 5.1.1ではエラーになりますので、パッチリリースのUnity 5.1.1p1以降を使用する必要があります。

(Oculus SDK 0.6.0)Unity 4 Integrationをダウンロードして、OculusUnityIntegration.unitypackageをインポートします(Unity 5でも使用できます。Unity 5.1ではエラーが出ますので2つ下の項目を参照してください)。Main Cameraを削除または無効化して、OVRPlayerControllerまたはOVRCameraRigをシーンに配置してスタンドアローンでビルドし、実行するとRiftの画面に出力されます。

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

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

Virtual Reality Supportedをオンにすると何が起きるの?

ビルドするとプラグインが出力ファイルに同梱され、Oculus Riftが接続されていると自動的にOculus Riftに出力するようになります。Render Textureの設定されていないカメラが自動的にステレオレンダリングになり、左右両画面のカリングやシャドウマップの共通化などの最適化が行われます。

また、実行時にカメラのField of ViewがHMDにあわせて変更され、PositionとRotationがトラッキングの動きで上書きされるようになります。このため、スクリプトなどでカメラを動かす場合には、他のオブジェクトの子オブジェクトにする必要があります。

Oculus Riftが接続されていなければ通常通りPCに表示されます。

Unity 5.1とOculusのパッケージの関係はどうなってるの?

Unity Technologies社とOculus VR社の提携によって、今後、Unityの標準機能としてOculus RiftやGear VRのサポートが行われることになっています。また、Oculus VRは「レガシーなVRプロジェクトをUnityのVRサポートでシームレスに動かすためのUnity Integrationのアップデートを提供予定」とのことです。

ですので、Unity 5.1のVRサポートが本流ということになりそうです。これからOculus Rift用ソフトを作る場合、特に不具合などで引っかかっていなければVRサポートを使うのがいいかと思います。

Unity 5.1でOculusのパッケージを使用するには

SDK 0.6.0では「Virtual Reality Supported」はオフにしてください。Unity 5.1にUnity 4 Integrationをインポートすると、API Update Requiredのダイアログが出ますので「I Made a Backup. Go Ahead!」をクリックします。また、

Assets/OVR/Editor/OVRShimLoader.cs(56,32): error CS0117: `UnityEditor.PlayerSettings' does not contain a definition for `d3d11ForceExclusiveMode'

というエラーが出ますので、ダブルクリックしてOVRShimLoader.csを開き、52行目の #if (UNITY_5_0) を #if (UNITY_5_0 || UNITY_5_1) に書き換えます。

*_DirectToRift.exeって何?

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

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

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

以下のようなことを試してみてください。

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

(Unity 5.1)Unity 5.1では、エディタで再生するとOculus Riftで直接表示できるようになりました。

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

VRサポートでエディタから再生するとカクつく

GameビューのMaximize on Playをオンにしておくと、いくらかジャダー(カクつき)が減るようです。

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

(Oculus SDK 0.6.0)解像度などを変更できるとOculus Rift向けのセッティングを壊してしまうため、OVRShimLoader.csによって、PlayerSettingsのDisplay Resolution DialogがHidden By Defaultに変更されています。また、UnityのPreferencesにOculus VRという項目が追加されますが、上手く動いていないようです。

Unity 5.1ではこの件について気にかける必要はなくなりました。

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

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

(Unity 5.1)Unity 5.1では、特に設定なしでシーン間で向きが維持されるようになっています。

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

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

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

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

VR酔いを軽減する方法の一つに、水平線を動かさないようにするというものがあります(参考:Oculus Rift用シューティングの制作・展示メモ)。簡単なやり方としては、カメラの親子関係を切って、LateUpdateで視点の向きを加工して追従させます。参考コードです。

using UnityEngine;

public class VRCamera : MonoBehaviour
{
    public GameObject viewpoint;
    
    void LateUpdate()
    {
        transform.position = viewpoint.transform.position;
        
        Vector3 angles = viewpoint.transform.eulerAngles;
        // ロールとピッチを消す
        angles.x = 0f;
        angles.z = 0f;
        transform.eulerAngles = angles;
    }
}

下のような構成にして使います。自動車などの子に視点の位置・向きをあらわす空のGame Objectを作り、スクリプトのViewpointから参照します。

Unity 5.1ではカメラのPositionとRotationがRiftの動きで上書きされるため、Main Cameraを空オブジェクトの子にして親のオブジェクトを動かしています。

さらに進めて、視点のぶれ補正などを行ってもいいかもしれません。人間は、頭の動き(前庭感覚)に対して反射的に眼球、首、四肢を動かし視界を安定化させているのですが、それを代わりに行うような感じです。

Unity GUIを使うには?

Canvasを作成し、Render ModeをWorld Spaceにして、Scaleを0.01などに設定して小さくしてシーンに配置します。

UIをカメラの向きに追随させて常に同じ位置に表示する場合は、Render ModeをScreen Space - CameraにしてRender Cameraにカメラを割り当て、Plane Distanceに表示する距離(メートル)を設定します。

Unity 5.1のリリースノートには、「Overlayはサポートされていません。Screen Space - CameraまたはWorld Spaceを使用することを推奨します。UIがGear VRで同じように見えるようにするために”Scale With Screen Size”を推奨します」とあります。

なお、Oculus VRのベストプラクティスでは、UIは3D空間の構成要素として作成し、視点から2~3メートル=ユニットの距離に表示することが推奨されています。

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

また、Unity 5.1のVRサポートのドキュメントに、開発中の機能として「頭の向きに基づいたUGUIの入力メソッド」という記述が見えます。

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

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

(Unity 5.1)

using UnityEngine;
using UnityEngine.VR;

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

(Oculus SDK 0.6.0)

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では真後ろを向いてもトラッキングできるようになっていました。トラッキング範囲も広いようです。

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を参照してください。

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

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

using UnityEngine;

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

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

(Unity 5.1)普通にカメラの設定を変更すればオーケーです。

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

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

Depth of Fieldなど多数のエフェクトが立体視では正常に動かないので注意です。

(Unity 5.1)普通にカメラにアタッチすればオーケーです。

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

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

GPUの描画負荷は画面の解像度とシェーダの複雑さに比例することが多いです。パフォーマンスが出ない場合、レンダリング解像度を下げると効果がある場合があります。

(Unity 5.1)VRSettings.renderScaleでレンダリング解像度を変更できます。パッチリリースのUnity 5.1.0p1以降が必要です。

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

(Oculus SDK 0.6.0)OVRCameraRigのNative Texture ScaleとVirtual Texture Scaleでレンダリング解像度を下げることができます。

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

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

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

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

(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の位置・向きによってカメラのtransformが変化しますので、これを参照してもいいようです。

(Oculus SDK 0.6.0)OVRManager.display.GetHeadPoseで取得できます。

OVRPose pose = OVRManager.display.GetHeadPose();

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

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

(Unity 5.1)Riftが接続されていれば、VRDevice.isPresentがtrueになります。

using UnityEngine.VR;
...
if (VRDevice.isPresent) { /* Riftあり */ }

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

接続しているデバイスの種類を知るには?

(Unity 5.1)VRDevice.family/modelを使用します。

using UnityEngine.VR;
...
Debug.Log("VRDevice.family = " + VRDevice.family);
Debug.Log("VRDevice.model = " + VRDevice.model);

このような出力が得られます。

VRDevice.family = oculus
VRDevice.model = Oculus Rift DK2

PCの画面に別視点の映像を表示するには?

(Unity 5.1)Noraさん制作のOVRMirrorで実現できます。新しくカメラを作り、Projectビューで作ったRender Textureを割り当ててOVRMirror.csをアタッチしてください。また、余分なAudio Listenerを削除してください。ビルドして実行すると別視点のウィンドウが表示されます。

オフィシャルで同様の機能を実現する件については、要望はたくさん来ているができるかどうか分からないとのことです。

(Oculus SDK 0.6.0)上記と同じように行います。プレイヤー視点が欲しい場合には、LeftEyeAnchorまたはRightEyeAnchorにOVRMirror.csをアタッチして、Oculus EnableとOculus Camera Bindedをチェックしてください。

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

(Unity 5.1)通常のプロジェクトと同じようにカメラを複数使用してレイヤー表示できるようです。後から描画する方のカメラのClear FlagsをDon’t Clearに、Depthを1以上に変更してください。また、余分なAudio Listenerを削除してください。

(Oculus SDK 0.6.0)上記をOVRCameraRigのLeftEyeAnchorとRightEyeAnchorについて行います。

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

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

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

酔いを低減するには?

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

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

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

Riftの左右の映像はUnityのシーン内で左右の目の間隔(デフォルトでは6.4cm)ぶんずらしてレンダリングされ、この両眼視差によってVR空間の物体が現実的な大きさに感じられるようになっています。Unityは1ユニット=1メートルが基本になっていますので、特に実写系のコンテンツではこれを守りましょう。例えば、身長170cmのキャラクターを出すときは、Unity上で頭頂まできっかり縦1.7になるようにサイズを調整しましょう。これをはずすとちょっともったいない気がします。

VR空間の物体が現実より大きく感じたり、小さく感じたりする場合には、Oculus Configuration UtilityのIPD(interpupillary distance=瞳孔間距離)というのが両目の間隔の設定ですので、これを変更してみてください。視差を広げるほどVR空間が小さく感じるようになります。

IPDが多少ずれていてもスケール感を合わせられるように、普段の生活で大きさをよく知っているものをVR空間に出して手がかりにするのも良いかと思います。

また、オブジェクトのサイズを調整する際には、エディタ上でCubeオブジェクトを作って適当なスケールを入力して、定規代わりにすると便利です。

キャラクターのスケールを変更したい

既存のプロジェクトが1ユニット=1メートルになっていない場合や、巨人の視界などを表現したいというような場合があります。

(Unity 5.1)カメラを別のオブジェクトの子にして、親オブジェクトのScaleを変更すれば実現できます。カメラ自身のScaleを変更しても反応しないので注意です。

(Oculus SDK 0.6.0)OVRPlayerControllerやOVRCameraRigのスケールを変更すれば頭部モデルもついてくるとのことです。

サウンドに関する注意

スピーカーとヘッドホンでは音声の定位が異なります。ヘッドホンは頭を動かすと一緒に回りますが、スピーカーは回りません。スピーカーで音声を出力する場合は、カメラまたはOVRCameraRigのCenterEyeAnchorからAudio Listenerを削除して別のオブジェクトにアタッチする必要があります。

なお、製品版にはヘッドホンが標準装備されていますので、ヘッドホン使用が基本になるかと思います。

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

(Unity 5.1)

(Oculus SDK 0.6.0)公式サイトのこちらにあります。

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

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

depthSurface == NULL(略)というエラーで動かない

Unity 5.1.1はリニアカラースペースに対応しておらず、Project SettingsのColor SpaceをLinearにすると、

SUCCEEDED(hr)
depthSurface == NULL || rcolorZero->backBuffer == depthSurface->backBuffer

というエラーが出ます。パッチリリースのUnity 5.1.1p1で修正されています。

unsupported graphics APIと怒られる

VRサポートを有効にしても、

[Compositor] ERROR: Cannot start with unsupported graphics API.
Bad config or LibOVR not found. VR disabled.

と表示されてVRモードにならない場合、Player SettingsのGraphics APIs for WindowsでDirect3D9が使用されている可能性があります。すぐ上のAutomatic Graphics APIをチェックしDirect3D11が使用されるようにして、Unityを再起動してください。

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

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

不具合まとめ

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


番外編

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

普通に自分のウェブサイトで公開する以外には、Oculus VR公式のOculus Shareに登録して配信することができます(アプリ審査あり)。さらに、これとは別にOculus Homeという公式ストアを準備中だそうです。

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

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

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

個人的には、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はまだ開発機だということと、事故を起こさないようにすることが基本軸かと思います。

展示でたくさんの人に被ってもらうとDK2のスポンジが汗や化粧などを吸ってしまい敬遠されるので、対処が必要です。自分はこちらの保護シートを貼りつけて、一人ごとにウェットティッシュと布で拭くようにしています。

また、VR Coverから展示用の防水カバーが販売されていて気になっています。

ノートPCを使用する場合、発熱の問題があります。Open Hardware Monitorを使えば、CPUやGPUの使用率や温度などをリアルタイムでチェックできます。

位置トラッキングカメラは赤外線を使用します。周辺環境やデバイスの組み合わせによっては誤作動することが報告されていますので注意です。西日などに弱いそうです。

参考になる本はある?

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

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

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

「3D駐車シミュレーター」その他、各種ゲームや展示物などを制作しています。
Oculus Rift対応ソフトコーナーにぜひお立ち寄りください。

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