Unity+Oculus Rift開発メモ

2016年01月30日

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

更新履歴

(2016年1月30日)「PCの画面に別視点の映像を表示するには?」を更新
(2016年1月28日)「位置トラッキングカメラが認識されなくなったんだけど」を追加
(2016年1月20日)「PCの画面に別視点の映像を表示するには?」を更新
(2016年1月7日)Oculus Rift製品版の予約開始について更新 
(2015年12月20日)「ブラウザ(HTML5)では使えないの?」を更新 

目次


Oculus Riftについて

Oculus Riftって何?

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

Kickstarterでのキャンペーンののち、二世代の開発者用キット(DK1、DK2)が販売されていましたが、DK2は2015年10月に販売終了になり、2016年1月7日にOculus VR公式サイトで製品版の予約が開始されました。3月以降に順次発送予定とのことです(すでに7月以降になっているようです)。予約価格は税・送料込みで94600円になっています。製品版でも自由に開発が可能とのことです。

(※ 上の写真は開発キットのDK2です)

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

どういう仕組みなの?

ヘッドセットの中に1080×1200×2枚(製品版)/1920×1080(DK2)の有機ELディスプレイパネルがあり、PCでレンダリングした左右両眼の画像を樽型に圧縮したものが表示されます。これをレンズを通して見ることで、パネルのサイズよりも広い視野角(約90~110度)の立体視ができるようになっています。

また、内蔵の各種センサーと外部に設置する位置トラッキングカメラにより頭の向きと位置が取得され、レンダリング時の視点の位置に反映されます。位置トラッキングカメラは赤外線カメラで、ヘッドセットの外装に埋め込まれた不可視の赤外線LED群から位置を推定しています。

PCからヘッドセットへはHDMIで映像を出力します。OSには通常のディスプレイとしては認識されず、GPUドライバから映像が直接出力されます。また、トラッキングデータの取得のためヘッドセットと位置トラッキングカメラをそれぞれUSBで接続します。

まとめると、PCとの接続は、Oculus Rift本体がHDMI端子×1とUSB端子×1、位置トラッキングカメラがUSB端子×1になります(DK2現在)。他に、DK2にはヘッドセットと位置トラッキングカメラの同期用のケーブルと、補助アダプターがあります。

一般的なPCやスマートフォンでは、キーボードやタッチ等の入力からディスプレイの表示が更新されるまで50~100ミリ秒ほどのタイムラグがあるのですが、Oculus Riftでは頭の動きからパネルの画素が変化するまでの遅延(motion-to-photonと言っています)が20ミリ秒程度と非常に高速です。ディスプレイのリフレッシュレートが90Hz(製品版)/75Hz(DK2)と通常より高くなっているほか、レンダリング後の各フレームを最新のトラッキング情報に合わせて補正するタイムワープ等、視界を頭の動きと一致させるためのさまざまな工夫が行われています。

問題点はないの?

大きな問題として、VR酔いという乗り物酔いと同じような症状がしばしば発生します。酔いを引き起こす最大の原因は、頭や身体の動きと目で見ている光景のずれ(感覚の不一致)だとされています。Oculus Riftではずれを抑えるさまざまな工夫によってVR酔いをかなり低減できていますが、PCのセットアップや、ソフトの作り方が重要になります。

特にフレームレートの確保が必須で、左右両画面を常時最大フレームレート(製品版では90fps)で描画するために高性能なゲーミングPCが必要です。2016年現在では、ハイエンドクラスのGeForceやRadeonが必要になります。詳しくは「PC環境について」を参照してください。

また、フレームレートが確保されていても、視点を通常の3Dゲームのように不用意に動かすと酔うため、酔いにくい動かし方をする制作上のノウハウが必要になります。

あと、視野はかなり広いのですが、十分に広いとは言えないかもしれません。現実世界でゴーグルを装着しているような感じです。解像度もDK2の片目あたり960×1080では広い視野を覆うのに十分ではなく、ディテールが見えづらいほか、ピクセルの境界で網目模様が見えます(網戸効果=screen door effect)。

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

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

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

視力が低くても大丈夫?

開発キットのDK1とDK2はメガネが入りにくかったのですが、製品版ではメガネをかけたまま着用できるとの話がありました(ただ、実際どうかは分かりません)。

また、DK1とDK2では数種類のレンズが付属していて、視力にあわせて交換できるようになっていましたが、製品版ではレンズの交換はなくなっています。

ちなみに、ソニーのPlayStation VR(のプロトタイプ)はメガネが入りやすいです。また、サムスン・Oculus VR共同開発のGear VRもメガネが入りやすいほか、上部ダイヤルで視力にあわせて度を調整できるようになっています。

どうすれば買えるの?

2016年1月7日にOculus VR公式サイトで製品版の予約が開始されました。3月以降に順次発送予定とのことです(すでに7月以降になっているようです)。予約価格は税・送料込みで94600円になっています。当初、350ドル以上という話や、500ドル前後という観測がありましたが、だいぶ高くなったようです。

なお、残念なことに、過去の開発キットで、特定の輸入代行業者を通しての購入でトラブルが発生していますので注意してください。

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

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

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

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

無料版で大丈夫です。

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

Unreal Engineが標準でOculus Riftに対応しています。デフォルトで描画負荷の重い設定になっているため、フレームレート確保のために若干工夫が必要です。

参考になる情報源などはある?

日本語のVR全般のニュースについてはMoguraVRがおすすめです。また、FacebookにOculusデベロッパー助け合い所VR Japanというグループがあります。

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

製品版はどうなるの?

(2015年9月)Oculus Connect 2で製品版の設計の詳細が公開されました。

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

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

秋葉原のG-Tune : GarageGALLERIA LoungeでDK2の常設展示が行われています。また、家電量販店のGalaxy ShopでGear VRのデモが行われています。

なお、製品版のOculus RiftはDK2から上記のようにさまざまな改良が施されていますので、その点に留意してください。


PC環境について

Oculus Rift向きのPCが欲しい

左右両画面をレンダリングしなければならないこと、90fps(製品版)の描画が必要なことから、高性能なビデオカードを搭載したPCが必要です。もちろん描画内容次第ですが、普通の3Dゲームを60fpsで動かすときと比べて、さらに数倍のGPU性能が必要だと考えてください。2016年現在では、ハイエンドクラスのGeForceやRadeonを搭載したゲーミングPCを購入するか、自分でそうしたPCを組む必要があります。

重要なことなので強調しておきますが、フレームレートのキープは絶対条件です。PSやXboxのゲームでよく、60fpsで動きをなめらかにするか、30fpsでグラフィックを綺麗にするかというような論争がありますが、VRではフレームレートが低いと頭の動きと視界の不一致で酔います。すぐに気分が悪くなります。また、没入感も大きく損なわれます。60fpsでは足りないということで、90Hzのディスプレイパネルが使用されています。

Oculus VRから、Oculus Rift製品版の推奨PCスペックが公表されています。Oculusの公式ストアで配信されるゲームについては、このスペックのPCで快適に動作することが必須条件となるようです。

なお、OS XとLinux、ノートPCは当面サポートしないとのことです。

簡単にまとめると、ハイエンドクラスのビデオカードが載っていて、Oculus Riftを接続するためのUSB 3.0ポート2つとHDMI端子があるWindowsデスクトップPCが必要ということになります。

Oculus VRは、推奨スペックを満たすPCに「Oculus Ready」ロゴをつける認定プログラムを始めるようです。第一弾のブランドはASUSとDell、Alienwareとのことです。

また、NVIDIAも、GeForce GTX 970以上の性能のビデオカードおよびPCに「GeForce GTX VR Ready」のロゴを表示するプログラムを開始するようです。こちらのロゴは広く普及しそうで、目安になると思います。

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

現状、ほとんどのノートPCでGPU性能が足りないか、そもそもOculus Rift(DK2)が認識されません。OculusチームもノートPCはサポートしていない、推奨しないということを公式フォーラムで繰り返し強調しています。

GeForceを搭載したゲーミングノートを使えばGPU性能はある程度確保できるのですが、現行のゲーミングノートの大半には、省電力のためにIntel統合グラフィックスとGeForceを自動的に切り替えるOptimusという機構が搭載されており、これによる不都合が発生しています。これらOptimus機にはOculus Riftは基本的に繋がらないので注意してください。現時点であえてノートPCを使う場合は、Optimus非搭載などの対策が行われているゲーミングノートを探すことになります。

現状、DK2が動作することをうたっている国内販売のゲーミングノートとしては、GALLERIA QSF980HGSNEXTGEAR-NOTE i5910NEXTGEAR-NOTE i5710などがあります(高価な品ですし、動作を保証することはできませんので、購入する場合はよく確認・検討するようお願いします。Oculus Rift製品版の動作報告を待ったほうがいいかもしれません。また、どの機種も製品版の推奨スペックには届かないことに注意してください)。

また、デスクトップ向けのGeForce GTX 980を搭載したゲーミングノートがあり、Oculus Riftの使用も想定されています。ただ、国内で第一弾として登場したMSIのゲーミングノートは数量限定の上、ものすごいお値段)になっていました。

GPU性能の目安が知りたい

3DMarkによるGPUのベンチマーク値一覧と、参考機種です。あくまでおおまかな目安として考えてください。

GPU 3DMark 参考機種・備考
GeForce GTX 980 Ti 23670
GeForce GTX 980 18630
GeForce GTX 970 15710 (Oculus Rift製品版推奨スペック)
Radeon R9 290 15260 (Oculus Rift製品版推奨スペック)
GeForce GTX 980M 12630 GALLERIA QSF980HGSNEXTGEAR-NOTE i5910
GeForce GTX 970M 10220 NEXTGEAR-NOTE i5710、i5702(販売終了)
GeForce GTX 950 9100
GeForce GTX 750 Ti 5690 (デスクトップPC用ミドルレンジ)
Radeon HD 7770 4110
GeForce GT 750M 2590 15” MacBook Pro Retina (Mid 2014、Late 2013)
Intel Iris Pro 6200 2240
GeForce GT 650M 2170 15” MacBook Pro Retina (Early 2013)
Intel HD Graphics 6000 1333 MacBook Air (Early 2015)
Intel HD Graphics 5000 1050 MacBook Air (Early 2014)、Surface Pro 3
Intel HD Graphics 4400 740 Surface Pro 2
Intel HD Graphics 4000 580

推奨スペックとなるGeForce GTX 970搭載ビデオカードの価格が2016年1月時点で4万円前後です。2スロットを専有し、補助電源が必要です。

推奨スペック厳しくないですか?

厳しいです。Steamのユーザー統計によると、推奨スペックを満たすPCを持っている人は5~6%だそうです(2015年10月現在)。ただ、今後GPUの性能が上がっていくに従って、ハードルは下がっていくことと思います。

もっとも、ヘッドセット側の要求スペックも上がっていく可能性が高いです。現状、解像度、視野角、フレームレートすべてまだ不足だと考えられています。Oculus VRからは、「完璧なVRには8Kでも足りない」、「120Hzは何としても越えないといけない壁」といった発言も出てきています。Oculus Rift製品版についてはとりあえずスペックが固定されるようですが、VRヘッドセットとGPUの性能のいたちごっこが長期に渡って続くかもしれません。

Oculus VRの推奨スペックはOculus Storeなどで配信される高品質な商業ゲームの目安ですので、とりあえず簡単なVRソフトを作ってみるだけなら、ミドルレンジのGPUでもなんとかなるかもしれません。ローエンドやMacBook Pro Retina搭載のGPUでは体感として完全に性能不足です。

Macじゃダメなんですか?

Windowsのみ対応です。OS XとLinuxのサポートは停止されました。再開時期は未定とのことです。MacでもBoot CampでWindowsをインストールすれば使用できる場合があります(手元にないため確認できませんが、Radeon搭載のMacはドライバ周りで手こずるようです)。

Macが非対応になった理由ですが、AppleがGPU性能を重視していないというのが大きいようです。Mac ProやiMacに採用されているGPUは最高でもミドルレンジ相当の性能です。また、Windowsにはゲーミングノートがあるのに対して、MacBook Pro Retinaは最上位機種でもローエンドのビデオカード程度のGPU性能しかありません。

また、NVIDIAやAMDがGPUドライバにVR支援機能(GameWorks VRなど)を入れるようになってきており、Oculusのランタイムやゲームエンジンもこれを利用しているのですが、その辺りもWindows以外に対応する余力は今のところなさそうに見えます。当分Windowsがホームグラウンドということになりそうです。

このページ書いてる人は何使ってるの?

現在、GeForce GTX 980M搭載ゲーミングノートのGALLERIA QSF980HGSを開発および展示に使用しています。Windows 10でOculus Runtime 0.8を使用しています。

デスクトップでは、自作のMini-ITXキューブPCにGeForce GTX 750 Tiを載せて、展示などにはこれをキャリーバッグで持ち込んでいました(運搬に不慣れなうちは、ネジが何本も抜けたり、CPUクーラーが脱落したり……)。GeForce GTX 970搭載の短いビデオカードや、Radeon R9 Nanoあたりに換装するとよさそうな気がします。

また、GeForce GT 750M搭載のMacBook Pro Retina (Late 2013)にBoot CampでWindows 7、Oculus Runtime 0.7をインストールしています。DK2でごく軽量なソフトならスムーズに動きますので、以前はこれを使って展示していたのですが、性能的にかなり厳しく、結局、デスクトップを運搬したりするようになりました。


セットアップ編

Oculus Runtime for Windows V0.8.0.0-betaとOculus Utilities for Unity 5 V0.1.3-betaに基づいています。一部内容が古い場合があります。

セットアップするには

まず、GeForceまたはRadeonではビデオカードのドライバをVR支援機能のある最近のバージョンに更新する必要があります

次に、Oculus VRのサイトからOculus Runtime for Windowsをダウンロードしてインストールします。インストールしたら、タスクトレイのOculusのアイコンからConfiguration Utilityを起動して、Riftが認識されているか確認してください。「Oculus Rift DK2: Ready」の表示と画像が出たら、Userのところの+ボタンを押してユーザープロファイルを作成します。左下のShow Demo Sceneをクリックして、デモが動作すれば成功です。

また、Oculus SDK for WindowsもダウンロードしてOculus World Demoを実行してみてください。この2つが一番安定して動作するデモです。

Windows 10でも大丈夫?

対応しています。Windows 10は64ビット版が必要です。上の項目の通り、GPUドライバを最新版にしてください。

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

Unityは標準でOculus Riftをサポートしていますので、これを使用します。

現状、UnityのOculus Riftサポートは機能追加や不具合修正が頻繁に行われていますので、バージョンによっては正常に動かなかったり、パフォーマンスが出ないことがあります。何か問題が起きるときは、毎週リリースされるパッチリリースを含めバージョンを変えてみてください。なお、Windows版のUnityはインストール時にフォルダを変更すると複数のバージョンを併用できます。

Oculus Riftに対応するには、Player SettingsのOther Settingsにある「Virtual Reality Supported」をチェックしてオンにしてください。エディタの再生ボタンを押すか、Standaloneでビルドして実行するとOculus Riftで表示されます。

また、Unity公式からVR Samplesというサンプルプロジェクトが提供されています。とりあえずこれをビルドしてみるのがおすすめです(要Unity 5.3以降)。同じくUnity公式のVRのチュートリアルは英語ですが非常に分かりやすい内容になっています。

さらに、Oculus VRが提供しているOculus Utilitiesをインポートすることで、Oculus Rift固有の機能が使えるようになります。ただ、Oculus Utilitiesは将来的にフェードアウトする可能性があるようです(「Oculus Utilitiesは何をするの?」を参照)。

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

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

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

エディタで再生するとカクつくんだけど

GameビューのMaximize on Playをオンにしておくと、いくらかカクつきが減るかもしれません。

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

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

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

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

なお、Oculus Riftを接続していないとチェックボックスの設定が保存されませんので注意してください。


開発Tips

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

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

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

Oculus Riftが接続されていなければ通常通りPCに表示されます。これによって、Oculus Riftと非Oculus Rift両対応のソフトを作ることができます。

Oculus Utilitiesは何をするの?

Oculus Utilitiesをインポートすると、UnityのVRサポート機能にはない、以下のようなOculus Rift固有の機能を使用できるようになります。

なお、UnityのVRサポートとOculus Utilitiesの関係についてですが、長期的にはOculus Utilitiesの機能をUnity本体と標準アセットに移す計画とのことです。ですので、どうしても必要なものを除き、できるだけUnity本体のAPIを使うようにしたほうがいいかもしれません。

ちなみに、Google CardboardとHTC Viveについても、現状では独自のSDKとカメラリグを使いますが、Unityでのネイティブサポートが計画されているようです(Google CardboardHTC Vive)。

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

まず、シーン内のカメラをプレイヤーの頭の位置(正確には両目の中間)に配置してください。その上で、実行中にプレイポジションを決めて(ちょうどいい場所に立つ、椅子に深く座るなど)、キーなどで位置・方向をリセットします。以下のようなスクリプトを適当なゲームオブジェクトにアタッチして使います。

using UnityEngine;
using UnityEngine.VR;

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

位置トラッキングカメラの有効範囲は、カメラからの距離0.4メートルから2.5メートル、水平74度、垂直54度の錐台です。Oculus Configuration UtilityのShow Demo SceneでTracker Boundsをオンにすると、有効範囲がワイヤーフレームで簡単に確認できます。

Riftがカメラの視界に入ってさえいれば、位置・向きとも比較的自由にトラッキングされますので、必ずしもカメラをプレイヤーの真正面に置く必要はありません。ただし、DK2後方の一定角度は死角になりトラッキングがはずれます。

なお、製品版では真後ろを向いても位置トラッキングできるようになり、トラッキング範囲も広くなるようです。

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

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

スケール(縮尺)の合わせかたを教えて

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

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

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

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

Unity GUIを使うには?

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

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

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

Unity GUIのUIを頭の向きで選択したい場合には、VR Gaze Inputで公開されているスクリプトを使うのが簡単です(サンプルが入ったパッケージも公開されています)。

UIとのインタラクションについては、Unity公式のVR Samplesに含まれているスクリプトを使用するのが簡単です。使い方や、VRでのUIの考え方については、チュートリアルのInteraction in VRおよびUser Interfaces for VRで解説されています(手抜きですいません。そのうち詳しく……)。

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

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

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

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

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 Riftの接続チェックをするには?

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

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

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

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.3.2p1以降)Unityの本体機能で可能になりました。カメラをシーンに追加し、Target Eyeを「None (Main Display)」に設定してください。また、どちらかのカメラから余分なAudio Listenerを削除してください。ビルドして実行すると別視点の画面がPC側に表示されます。

PC側のカメラのDepthの数値をRift側のカメラより大きくしておく必要があります。もしくは、VRSettings.showDeviceViewでRift側のカメラのミラー表示を無効にしてください(こちらのほうがより軽量なのではと思います)。

using UnityEngine;

public class HideRiftView : MonoBehaviour
{
    void Start()
    {
        UnityEngine.VR.VRSettings.showDeviceView = false;
    }
}

この機能を使用するには、パッチリリースのUnity 5.3.2p1以降が必要です。安定版のUnity 5.3.2f1以前にはPC側の表示が横長になる不具合があります。

なお当然ですが、一画面余分にレンダリングしますので、そのぶん負荷が増えます。フレーム落ちする場合は、起動ダイアログの解像度設定を下げてみてください。

別のPCでプログラムをもう1つ動かして、ネットゲームの要領で同期表示することを検討してもいいかもしれません。

(Unity 5.2.3p3まで)Noraさん制作のOVRMirrorで実現できます。新しくカメラを作り、Projectビューで正方形のRender Textureを作り割り当てて、OVRMirror.csをアタッチしてください。Unity 5.3以降では表示が横長になってしまうようです。また、Player SettingsのColor SpaceがLinearになっていると色がおかしくなります。

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

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

Oculus Utilitiesを使用している場合、OVRCameraRigが複数あると警告が出ます。Unityの通常のカメラを追加してください。

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

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

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

サウンドに関する注意

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

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

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

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

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を再起動してください。


不具合まとめ

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


酔い対策編

酔いを低減するには?

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

フレームレートが出なかったり、カクつく場合は、Window>ProfilerでUnityのプロファイラを開いて処理の重い部分を探します。GPUがボトルネックになっている場合が多いので、プロファイラパネルの左上からAdd Profiler>GPUでGPU使用率のペインを開いて確認します。

酔いの原因となるため、VRソフトはフレーム落ちを極力避ける必要があります。プロファイラのグラフにスパイク(負荷が瞬間的に増えること)がある場合は、原因を探して重点的に対策します。経験的には、Asset Storeのアセットのスクリプトには処理負荷が安定しないものが結構あるため(たとえば特定のタイミングで重いテクスチャやメッシュの生成を行うなど)、スパイクを起こすものを使っていないかどうか、早いうちにプロファイラで確認しておいたほうがいいと思います。

コンテンツ自体の作り方については、公式からOculusベストプラクティス(日本語)というガイドラインが公開されています(原文の英語版はこちら)。縮尺や移動速度を正確にする、頭の動きとは無関係なカメラ移動をしない、ユーザーが常に(ポーズ中やカットシーンでも)周囲を見回せるようにする、水平線や大きな表示要素を動かさない、加減速は短くあるいは即座に、残弾数は浮いているHUDではなく武器それ自体に表示する、等々、非常に多数のノウハウや注意事項がまとめられていますので、じっくり読んでおいたほうがいいと思います。

また、Oculusベストプラクティスの他にも、酔い対策に関する分かりやすいスライドや記事が公開されていますので紹介します。 

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

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から参照します。

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

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


Oculus Touchについて

Oculus VRは、Oculus Riftとは別に、Oculus Touchという両手に握って操作する入力コントローラを2016年後半に発売予定とのことです。

Oculus Touchはヘッドセット同様、主に外周リング部に埋め込まれた赤外線LEDと位置トラッキングカメラでトラッキングされます。精度の向上と、手や身体でLEDが隠れて位置をロストする問題の軽減のために、少なくとも2つ(“at least two”)の位置トラッキングカメラを使用することになっており、Oculus Touchを購入するともう1つの位置トラッキングカメラがついてくるようです。カメラの配置は比較的自由なようです。

Oculus TouchのAPIはOculus Utilitiesに含まれています。公開されているドキュメント(Oculus Touch ControllersOVRInput)から、以下のような仕様が伺えます。

また、Oculus Touchの位置はOVRCameraRigの子のTransformとして読めるほか、OVRInput.GetLocalControllerPosition/GetLocalControllerRotationで取得できるようです。

Oculus Touchとの無線通信についてはOculus Rift(ヘッドセット)に受信機が入っており、展示でたくさん並べて使用しても電波干渉の心配はないとのことです。

ちなみに、Unreal EngineではMotion ControllerコンポーネントでOculus Touchにアクセスできると思われます。上の動画のToyboxデモはUnreal Engine製だそうです。


番外編

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

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

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

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

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

WebVRにおいては、一つのウェブページでスマートフォン単体からGoogle Cardboard、ハイエンドのOculus Riftまで対応しようというレスポンシブなVRという考え方や、HTMLでVR空間を構築するA-Frameというフレームワークなどが登場しています。

ただ、個人的には(目的次第ですが)、VRは性能要求が非常にシビアなことや、ブラウザのヘッドセット対応がどうしても遅くなること、ゲームエディタなしでVR空間を構築するのは困難なこと、Oculus Storeにリリースできないことなどから、UnityやUnreal Engineがしばらく基本になるのではと思います。また、UnityのWebGL出力などもいずれWebVRに対応するのではないでしょうか。

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

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

*_DirectToRift.exeって何?

従来のOculus Unity Integrationでは、ビルドすると通常のexeファイルとあわせて*_DirectToRift.exeが作られ、Riftに出力するにはこちらを実行する必要がありました。Unity 5.1以降では必要なくなっています。

この当時に作られたOculus Rift用アプリケーションは、現行のOculus Runtimeでは動作しません。

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

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

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

DK2の接続が切れるようになったんだけど

ケーブルが断線しやすいようです。カバーをはずしてUSBケーブルとHDMIケーブルを市販品に交換すると治るかもしれません。DK2のもう一つのカバーをはずすと同期用のケーブルを挿すところがあります。同期ケーブルは2.5mmステレオケーブルです。長いものが必要な場合、なかなか売っていないので、3.5mmステレオケーブルの両側に変換プラグを使うといいかもしれません。

また、自分の場合、補助アダプターを使っていると接続がたまに切れるということがありました(個体差や環境差もあると思いますが)。

位置トラッキングカメラが認識されなくなったんだけど

ケーブルの断線以外の可能性としては、Oculus Runtimeのアンインストール・再インストールを行うと、Oculus Rift Sensor Driverがインストールされないことがあります(コントロールパネルの「プログラムと機能」で確認)。その場合、C:\Users{ユーザー名}\AppData\Local\Temp\Oculus IncにあるOculusPTDriver_*.msiを実行すると復元できるかもしれません。

イベント展示について

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

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

展示でたくさんの人に被ってもらうと、DK2のスポンジに汗や化粧などが染み込んでしまい敬遠されるので、対処が必要です。個人的には、防水性の何かで覆って一人ごとに拭き取る方向がいいのではと思います。 

Amazonで各種保護シートが販売されていますが、あまり有効でないものや、素材の臭いがきついものも多いです。VR Coverから展示用の防水カバー(DK2用)を取り寄せて使用してみたところ(29ドル+送料7ドルで約2週間で到着しました)そこそこ良好な印象でした。他にも良いものがあるかもしれません。

Oculus Rift本体の手入れも必要です。レンズや外装、ヘアバンドを綺麗にしておくほか、スポンジを取り外して洗浄したり、消臭スプレーを使ったりするといいと思います。

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

位置トラッキングカメラは赤外線LEDで位置を推定します。西日などに弱いという話がありますので注意です。

また、こちらに@mkt_さんが展示のノウハウをまとめられていますので紹介します。

参考になる本はある?

Oculus Riftよりも前の情報になりますが、VRの原理、歴史、技術などを包括的に扱っている日本バーチャルリアリティ学会の本があり、おすすめです。

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

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

「3D駐車シミュレーター」「VRちゃぶ台返し」「オーバーストリーム」その他、各種ゲームや展示物を自主制作しています。また、最近は主にフリーのUnity/UE4エンジニアとしてVRコンテンツ制作のお手伝いをしています。詳しくはOculus Rift対応ソフトページおよびこのサイトについてをご覧ください。


参考リンク

書いた人:こりん(@k0rin / id:korinchan
ブログトップへ RSS