Oculus Riftで始めるVRアプリ開発(1)
Oculus Rift Development Kitの基礎知識
UnityとUnreal Engine 4で、ゴーグル型のヘッドマウントディスプレイ「Oculus Rift」(Development Kit 2)用アプリを開発する方法を解説する連載がスタート。
Oculus Riftとは
2014年3月にFacebookに買収されたことで一躍話題を集めたOculus Riftは、米国Oculus VR社が開発を進めているゴーグル型のヘッドマウントディスプレイデバイスだ。2012年8月にKickstarterで1万人弱からの支援を受け、2013年3月から米国をはじめとして第1弾Development Kit(以下、DK1)が出荷された。Oculus Riftの特徴は、広視野角のディスプレイ表示と、頭の向きに高速に追従するヘッドトラッキングによって生まれる非常に高い没入感だ。
DK1の出荷が始まって以降、世界各地でゲームに限らずさまざまなアプリケーションが企業個人問わず開発されている。初期に開発された最も有名なものの1つがUnreal Development Kitで作成された「Rift Coaster」という名のジェットコースターアプリだ。また日本でも多くのアプリケーションが開発されており、日本で最初のソフトであるMikulusを始めとしてキャラクターを使ったものが非常に多く、Razer HydraやKinectのような他のVRデバイスを組み合わせた作例も多数見られる。Unityを使って開発されたアプリケーションが非常に多いのも日本のOculusシーンの特徴だ。
Oculus Riftを使ったアプリケーションはまだまだ数が少ない。もともとはゲームを遊ぶために作られたOculus Riftだが、がんで寝たきりの祖母が外の世界を体験することができた事例など、その応用の可能性は無限に満ちあふれている。
本連載では、DK1を持っているが開発はしたことがない人、またDK2や製品版が出たら購入しようと思っている人に向けて、Unityと、後述するUnreal Engine 4でのアプリ開発方法を解説していく。第1回となる今回は、Oculus RiftのハードウェアとSDKを要素ごとに解説する。
Oculus Riftのハードウェア
この項目ではOculus Riftのハードウェアである、
- ディスプレイ
- トラッカー
- コントロールボックス
の3つを、今年7月出荷開始予定のDK2での変更点を踏まえて解説する。実際にソフトを開発する際には、次項で解説するSDKを通して利用することになるため、これらを全く意識しなくてもいきなりOculus Rift対応ソフトを開発することも可能だ。
ディスプレイ・レンズ
DK1のディスプレイは、2012年版Nexus7用の7インチ液晶パネルを流用して作られている。そのため、解像度は1280×800と2014年現在のタブレットと比べても低く、画面のドットが目に見えて分かるレベルの粗さだ。
Oculus Riftでは、画面中央を仕切って640×800に分割し、レンズを通して見ることで、このディスプレイを水平視野角90度(それまでの民生品は45度以下のものばかりだった)という高視野角のヘッドマウントディスプレイに仕立て上げている(図1)。このレンズは3種類付属しており、遠視用のAレンズ、やや近視用のBレンズ、強度の近視用のCレンズを交換することで、視力による見え方の違いをカバーしている。
これがDK2では、フルHD(1920×1080)の5.6インチ有機ELパネルに変更される予定だ。横幅のピクセル数は1.5倍程度しか増えていないが、画面サイズ当たりのピクセル数が1.8倍に増加しているため、DK1に比べるとドットの粗さは格段に目立たなくなっている。液晶よりも応答速度が高い有機ELを採用しており、DK1で感じられた映像の残像や遅延が極めて少ない。Oculus VR社は「遅延が利用者の酔いを引き起こす」と考えており、DK2ではリフレッシュレート75Hz、製品版では90Hz以上という高速なパネルの採用を予定している(一般的な液晶は60Hz)。
トラッカー(センサー)
Oculus Riftの非常に低遅延なヘッドトラッキングを可能にしているトラッカーは、「3軸(X-Y-Z)の加速度」「ジャイロスコープ」「地磁気」という3種類のセンサーを持っており、もともとのPalmer Luckey氏が作った最初期のプロトタイプでは、スマートフォンなどで用いられているHillcrest社のものが使われていた。これは125Hzでトラッキングを行うもので、後にJohn Carmack氏がファームウェアを改良し250Hzまで引き上げられた。
しかし、Kickstarter成功の後、元AppleのNirav Patel氏が開発に加わり、彼が作ったオープンソースハードウェアのAdjacent RealityをOculus Rift向けに改良したオーダーメイドの品が用いられることになった。Adjacent Realityはもともと500Hzという高性能だったが、DK1などに搭載されているモデルでは1000Hzとさらに改良されている。
コントロールボックス
Oculus Riftのディスプレイと、PCをつなぐための機器がこのコントロールボックスだ(図2)。コントロールボックスの背面には「DC電源」「DVI/HDMI映像」「miniUSB」の3つの端子があり、ディスプレイの明るさとコントラストを調節するボタンが上部に設置されている。DK1のディスプレイとコントロールボックスはケーブルで直結されており、PCからの映像がディスプレイに送られ、逆にトラッカーのセンサー情報がPCへと送られる。
だが、DK2ではコントロールボックスがなくなり、しかもバスパワーのみで動作するようになったため、USBとHDMIでPCと直接接続できるようになった。ケーブルも右後部から伸びていて邪魔だったのが前頂部から伸びるようになっており、DK1よりも装着しやすい構造となっている。だが、その分ケーブルへの負担も大きくなってしまっているのか、16台製造されたDK2プロトタイプは2台壊れてしまったようだ(ちなみに筆者もUnite Japanでの展示時にDK2のケーブルが壊れるところに立ち会ってしまった)。
DK2との差異
上記の通り、DK1とDK2には単なるパネル解像度の向上以外にも多くの変更が加えられている。以下は現時点で確定しているDK1とDK2の比較表だ。特に理由がない限り、まだOculus Riftを手に入れていない方はDK2を予約しておいた方がよいだろう。
DK1 | DK2 | |
---|---|---|
パネル解像度 | 1280x800 | 1920x1080 |
片目あたりの解像度 | 640x800 | 960x1080 |
パネル方式 | 液晶 | 有機EL |
位置トラッキング | なし | 赤外線方式 |
コントロールボックス | HMDと直結 | なし |
価格(米ドル) | $300 | $350 |
Oculus RiftのSDKが持つ機能
この項目ではOculus Riftの公式SDKが持っている機能について解説する。前述したハードウェアを利用してかなり複雑な処理が行われているが、幸いにも開発ではこれらの処理を自分で行う必要はないようにSDKが整備されている。
ステレオ表示
Oculus Riftは左右2つのレンズを通して1枚の液晶を見るようになっているが、当然そのままの映像を表示してしまっては目に見える映像は狂ってしまう。ただ640×800の同じ映像を横に並べて表示しても、レンズを通しているため映像がゆがむし、両目が全く同じものを見るせいで視差による立体感が生まれない。
Oculus Riftではこれに対応するため、レンズを通して見た際の映像に対応するためのピクセルシェーダーを作成していた。レンズを通して見た映像は「Pincushion(針山) Distortion」と呼ばれる凸形のゆがみ(Distortion)が掛かっている。これに対して、表示される映像に「Barrel(樽) Distortion」と呼ばれる凹形のゆがみをわざと加えることによって、Oculus Riftでは実際に見たときに違和感のない視野を再現している(図3)。
以前のSDKではピクセルシェーダーを利用していたが、4月に公開されたSDK 0.3以降では「Distortion Mesh」と呼ばれるBarrel Distortionを適用した3Dモデルを生成し、それに両目用の画面をテクスチャとして貼り付けることで実装している。これにより、ピクセルシェーダーと比べて解像度に依存した負荷の向上が少ない処理が行われるようになった。DK1→DK2→製品版→第2世代製品……とOculus Riftは高解像度化を進める方針なので、解像度が上がるほど負荷が増えるピクセルシェーダーでは不十分だったということである。
各種センサー
ハードウェアの項目で述べた通り、Oculus Riftには1000Hzという、一般的なゲームソフトにおけるリフレッシュレート(秒間30/60フレーム)とは懸け離れて高速なセンサーが搭載されている。OculusのSDKでは3種類のセンサーから得られた情報を統合し、1000Hzのログから「描画フレーム時の頭の向きを予測する」機能や、現在地の地磁気を基にして補正を行い、「ドリフト」と呼ばれるセンサーのブレを防ぐ機能などが実装されている。
これらの機能も、アプリケーションを開発する際は決まったコンポーネントや関数を呼び出すだけでSDKの内部で行ってくれる。
今後搭載される予定の機能
Oculus RiftはDK1の機能のみでは全く不十分と考えており、製品版までにさまざまな機能を追加する予定だ。以下で主な2つの機能を紹介する。
位置トラッキング
DK1が取得できる情報はあくまで頭の向きだけだ。加速度センサーを搭載しているので、常時加速度を反映すれば「頭の移動を捉える」といったことは不可能ではないが、現在のセンサー技術では誤差が大きくなりすぎてしまうので現実的には不可能に近い。
そこで、DK2では外部の赤外線カメラを用いた頭部位置のトラッキングが搭載されることになった。DK2のフロント部分には目に見えない赤外線を発するLEDがびっしりと配置され、それを赤外線カメラが捉えることによってプレイヤーの前後左右上下の移動を追うことができる。これにより、表示される映像が頭の向きだけでなく移動も反映できるようになり、現実の動きと違和感のない映像が表示されるため、酔いの改善につながる。当然、操作性の自由度もさらに向上する。DK2では赤外線LEDがフロントにしか搭載されていないため、プレイ中に左右後方を向くとトラッキングが外れてしまうが、製品版で改善される予定とのことである。
レイテンシ(遅延)テスター
レイテンシテスターを用いると、実行中のアプリケーションの遅延を計測できる。それの何がうれしいかというと、前述のトラッカーの予測機能は一定時間ごとに行われる仕様となっているため、PCでの描画命令から実際の表示までの時間を把握できればより正確な予測が実行でき、それによって操作感覚がより快適になる。
DK1ではレイテンシテスターが別売りだったため、これを購入した上で、手動で予測の間隔を設定する必要があった。DK2ではレイテンシテスターが内蔵となるため、SDKの内部処理にレイテンシ補正機能が含まれると思われる(あくまで予測であり、DK2が出ていない現時点では不明)。
公式SDKの内容
ここでは、Oculus Riftの公式SDKに含まれるソフトウェアについて紹介する。基本的にSDKはWindows/Mac/Linuxという全てのPCプラットフォームに対応しているが、4月現在最新のバージョンである0.3.1はプレビュー版という扱いになっており、Windows版しか配布されていないので(図4)、Mac/Linuxユーザーの方は注意してほしい。
公式で用意されているもの
C/C++(LibOVR)
通常のアプリケーションからOculus Riftを利用する場合はこのLibOVRと呼ばれるC++ライブラリを使って開発を行う。DirectX 9/10/11とOpenGLの描画コードも付属しているが、あくまで単純なサンプルアプリケーション用のコードなので、下記Unity/Unreal版のサンプルに比べると描画品質は劣る。基本的に自作のアプリケーションや後述するゲームエンジン・ライブラリがOculus Riftに対応するためのものだと考えてほしい。
また、SDK 0.3.1からC言語でラップされたヘッダーファイルが追加されたため、C++コードを利用するインターフェースは無いがC言語とのインターフェースはある、他の一般的なプログラミング言語から利用することも可能になった。
Unityパッケージ(ライブラリ・デモ)
日本では最も多く使われているUnityで開発するためのパッケージだ。スクリプトとライブラリ、サンプルプロジェクトを含んだ.UnityPackageファイルとして配布されている。動作にはUnity Proが必要だが、DK1を購入した場合にはOrder InformationページからPro体験版の期限を4カ月延長できるシリアルコードを発行してもらえる(DK2でUnity Pro体験版コードを配布する予定は、今のところないとのこと: DK2 FAQより)
OVRAgentというUnity Freeでも扱えるようにするUnityパッケージもあるが、作者も言うようにFree版の機能で力技の対応を行っており、パフォーマンスが本来のものより非常に低下するため筆者はおススメしない。無理にFree版を使い続けるよりは、Unity Proを購入するか、後述する他のゲームエンジンを試してみることをおススメする。
Unreal Development Kit(UDK)
米国Epic Games社が開発したUnreal Engine 3の個人向けゲームエンジンがUnreal Development Kitだ。Oculus Rift対応版の本体がそのまま公開されているが、2014年3月にUnreal Engine 4がリリースされたため、本連載では取り扱わない。
サンプルアプリケーション: Tuscany
イタリア・トスカーナ州の風景を再現したサンプルアプリケーションとなっている。LibOVRとUnityパッケージにもプロジェクトファイルごと付属しているが、単体のアプリケーションとして配布されているファイルはUnityで制作されたバージョンのみとなっている。
Oculus Riftに対応したゲームエンジン
現在Oculus Riftの開発者サイトで配布されているゲームエンジンはUnityとUDKのみだが、LibOVRを利用してOculus Riftに対応したゲームエンジンも数多く存在する。以下はユーザーの手ではなくエンジンメーカーによって正式対応したゲームエンジンの一部だ。
- Unreal Engine 4: Unreal Engine 3までは企業向けの価格しか存在していなかったが、月19ドルのソースコードアクセス付きのサブスクリプションモデルが開始され、個人でも身近なゲームエンジンとなっている。UDKと同じくOculus Riftにも標準で対応している。
- Project Anarchy: Intelに買収された物理エンジンメーカーHavok社がリリースしているゲームエンジン。モバイル向けはフル機能で無料という大胆なライセンス形態を取っており、PC版は499ドルでOculus Riftにも対応している。
- Torque Engine: 以前は有償だったが、現在は完全オープンソース化され無償で利用できるようになったゲームエンジン。マルチプラットフォームで、Oculus RiftやRazer Hydraなどのデバイスにも正式対応している。
- Esenthel Engine: 有償だがOculus Riftを含む主要機能を無期限で試用でき、Unity以外で唯一Windows/Mac/Linux全てのPCプラットフォームでOculus Riftを利用できるゲームエンジン。月9.5ドルのバイナリライセンスと、月19ドルのソースコード付きライセンスが存在する。
まとめ
今回は、現在も製品版に向けて開発が進められているヘッドマウントディスプレイであるOculus Riftを構成するハードウェアとSDKについて、今夏発売予定のDK2での更新内容も含めて解説した。
次回はOculus VR社の公式デモであるTuscanyのプロジェクトファイルをUnityで読み込み、Oculus Riftアプリケーションを構成するスクリプトやゲームオブジェクトについて解説していく。
渡部 晴人
島根県松江市出身。2013年よりフェンリル株式会社島根支社に所属。
現職ではWeb開発のフロントエンドとバックエンド両方を担当。
2013年から個人で開発したOculus Rift・LEAP Motion対応ゲームソフトBLAST BUSTER(旧称:Perilous Dimension)を数多くのイベントで出展し、2014年には窓の杜ゲーム大賞を受賞。
学生時代から非接触ジェスチャーデバイスに触れており、真に万人向けの入力インターフェースを模索中。
1. 【現在、表示中】≫ Oculus Rift Development Kitの基礎知識
UnityとUnreal Engine 4で、ゴーグル型のヘッドマウントディスプレイ「Oculus Rift」(Development Kit 2)用アプリを開発する方法を解説する連載がスタート。
2. Oculus Riftと2015年の商用ヘッドマウントディスプレイの勃興 ― 開発環境の変化と業界の動向
ここ最近のOculus Riftの進化を、時系列を追って押さえておこう! ハードウェアの変遷やGPUメーカーの動向、2015年のVR開発のポイントについても言及する。