Unity+Oculus Rift開発メモ(DK2対応)

2013年09月24日

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

(2014年11月27日更新/SDK 0.4.3.1に対応、「不具合まとめ」「シーンにOVRCameraRigを複数設置できる?」の追加など)

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

Oculus Riftについて

Oculus Riftって何?

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

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

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

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

問題点はないの?

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

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

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

また、多少重かったり、暑いと汗でレンズが曇ったりします。

ただ、Oculus Riftはまだ開発機の段階ですし、GPUの性能も今後さらに伸びていくでしょう。ハードウェアの問題については将来的に改善されていくのではないでしょうか。

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

それと、DK2のレンズは適切なコーティングがされていないのかかなり傷つきやすいため取り扱い注意です。

視力が低くても大丈夫?

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

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

ちなみにソニーの対抗機Project Morpheusはメガネが入りやすいです。

どうすれば買えるの?

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

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

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

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

注:DK2には現状かなり癖がありますので、適宜最新情報を追う必要があります。

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

Unity Technologies社とOculus VRの提携によって、Unity 4.5.5からフリー版でもOculus Rift対応ソフトが作れるようになりました。Unity 5ではさらにエディタ統合やデバッグ機能、Oculusの公式ストア向けのビルドなどがサポートされるそうです。

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

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

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

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

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

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


PC環境について

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

左右両画面をレンダリングしなければならないこと、常時75fpsの確保が必要なことから、高性能なGPUが必要です。もちろん描画内容次第ですが、普通に3Dゲームを遊ぶときと比べて数倍のGPU性能が必要だと考えてください。2014年現在では、GeForceやRadeonのミドルレンジ以上が望ましいです。

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

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

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

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

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

Oculus VR自身はノートPCの使用を推奨していません。特に、CPU内蔵のGPUでは性能がまったく足りません。もしデモや展示などでノートPCを使用する場合は、ゲーミングノートというカテゴリのものが必要になります。

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

また、Optimus搭載ノートでいろんな不具合が起きているようで、注意が必要です。izmさんのブログに詳しくまとめられています。

無理せずデスクトップPCを使うのも一つの方策かもしれません。また、MSI GT72がGeForce GTX 980Mで非Optimusということで注目されています(でもお高い……)。

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

GPU PassMark G3D 参考機種
GeForce GTX 980M 6786 MSI GT72
GeForce GTX 880M 4591  
GeForce GTX 680M 4341  
GeForce GTX 780M 4116  
GeForce GTX 750 Ti 3627  
GeForce GTX 870M 3586 Razer Blade
GeForce GTX 970M 3423  
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出ていますが、たまに厳しい場面があります。公式のUnity版トスカーナデモでは40fpsほどまで落ちます。製品版のOculus Riftにはおそらく性能不足だと思います。

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

Macでも大丈夫なの?

現状、OculusのSDKや新機能がWindowsから先に提供される傾向があるため、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で動かしたほうがフレームレートが出ているように思います。DirectX 12が使われるようになると、さらに差がつく可能性もあります。

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

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


開発Tips

以下、開発Tipsです。DK2と、SDKのバージョン0.4.3.1に基づいています(一部内容が古いです)。0.4.3でAPIの大規模な改変が行われ、0.4.2までとは別物になっています。

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

まず、Oculus Runtime for Windowsをダウンロードしてインストールします。インストールしたら、タスクトレイのOculusのアイコンからConfiguration Utilityを起動して、Riftが認識されているか確認してください。また、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をインポートします。Main Cameraを削除または無効化して、OVRPlayerControllerまたはOVRCameraRigをシーンに配置してスタンドアローンでビルドします。通常のexeファイルとあわせて*_DirectToRift.exeが作られ、これを実行するとRiftの画面に出力されます(上手く行けば)。

OVRPlayerControllerはキーボードなどでシーンを歩きまわれるようにOVRCameraRigがセットアップされたものです。メニュー機能がついていて、スペースキーを押すとメニューが表示されます。

なお、フリー版のUnityで使用するにはUnity 4.5.5以降とOculus SDK 0.4.3以降が必要です。

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

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

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

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

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

UnityからOculus Riftでダイレクト表示できるようにする予定があるとのことですが、時期は未定とのことです。

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

OVR/Editor/OVRShimLoader.csによって、PlayerSettingsのDisplay Resolution DialogがHidden By Defaultに変更されています。また、UnityのPreferencesにOculus VRという項目が追加されますが、上手く動いていないようです。ちょっと気持ち悪いので、どう扱うか悩みの種です……。

OVRShimLoader.csはビルド後の*_DirectToRift.exeの作成も行っており、これは、OVR/Editor/OculusUnityPatcher_32(64).exeをコピー・リネームすることで行われています。

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

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

SDK 0.4.3にはReset Tracker On Loadをオフにしてもリセットされてしまう不具合があります。0.4.3.1で修正されています。

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

SDK 0.4.3以降では、単純にOVRCameraRigをオブジェクトの子にすれば良くなりました。

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

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

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;
    }
}

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

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

3D Textかテクスチャを貼ったポリゴンを、OVRCameraRigの子のCenterEyeAnchorに接続します。

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

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

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

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

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

using UnityEngine;

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

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

位置トラッキングカメラのトラッキング範囲は、カメラからの距離0.4メートルから2.5メートル、水平74度、垂直54度の錐台です。Oculus Developer Guideの7.1.1 Position Trackingに解説と図があります。Riftがカメラの視界に入ってさえいれば、位置・向きとも比較的自由にトラッキングされるようです。

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

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

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

0.4.3のランタイムから隠しオプションで消せるようになりました。レジストリの

に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/OVRCameraControllerだけのシーンを用意して以下のようなスクリプトを配置すれば、警告メッセージが閉じられるのを待ってメインのシーンに飛ぶことができます。SDK 0.4.3ではDismissHSWDisplayで一定時間後に自動的に閉じることができます。

(SDK 0.4.3以降)

using UnityEngine;

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

(SDK 0.4.2)

using UnityEngine;

public class OculusWarning : MonoBehaviour
{
    void LateUpdate()
    {
        if (!OVRDevice.HMD.GetHSWDisplayState().Displayed) {
            Application.LoadLevel("main");
        }
    }
}

カメラのクリッピング範囲を変更したい

OVRCameraRigのLeftEyeAnchorとRightEyeAnchorのClipping Planesを両方変更してください。

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

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

OVRCameraRigのNative Texture ScaleとVirtual Texture Scaleって何?

レンダリング解像度を変更して、パフォーマンスと表示品質のバランスを調整できます。

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

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

実行中に描画解像度を一時的に落とすにはVirtual Texture Scaleを使います(……とドキュメントにありますが、正常に動いていないようです。修正待ちです)。

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

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

OVRPose pose = OVRManager.display.GetHeadPose();

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

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

(SDK 0.4.3以降)

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

(SDK 0.4.2)

SDK 0.4.2では64bitビルドではこれらの関数はNullReferenceExceptionで使えないようです。

OVRDevice.IsHMDPresent()でRiftが接続しているかどうか調べられます。

また、OVRDevice.IsCameraPresent()で位置トラッキングカメラの有無が分かります。ただし、Rift本体が繋がっていないとこちらもFalseになるようです。

なお、これらの関数はOVRDevice.Awake()が実行されたあと(Startなど)に呼び出す必要があります。

同じプロジェクトで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によって、起動ダイアログを隠したりといった処理が行われています。これの扱いに困るため、現時点ではバイナリを分けたほうがいい印象があります。

将来的には、おそらくUnityのビルドプラットフォームの一つにOculus Riftが加わるのではと思います。

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

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

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

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

酔いを低減するには?

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がアタッチされていて、ヘッドホンを想定した状態になっているため、スピーカーで音声を出力する場合は対処が必要になります。

なお、2014年9月に発表されたOculus Riftの新型プロトタイプCrescent Bayにはヘッドホンが装備されています。ヘッドホン使用が基本になるのかもしれません。

APIリファレンスはどこ?

公式のドキュメントページの下のほうにあります。

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

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

不具合まとめ

個人的に遭遇している不具合を載せます。今のところバージョンごとに何かある感じです。


番外編

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

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

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

オープンなVRヘッドマウントディスプレイやゲームエンジンの発展にも期待したいところです。

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

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

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

雑多なメモ

参考になる本はある?

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

また、Oculusクラスタからはこのような本が出るようです。

これ書いてる人はどんなの作ってるの?

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

comments powered by Disqus