Language:
Page Info
Tags:
Engine Version:

仮想現実 (VR) のベスト プラクティス

ユーザーに最高の VR 体験を提供するには、仮想現実 (VR) 向けのコンテンツ開発の ワークフローを部分的に調整する必要があります。このガイドの目的は、VR プロジェクト用のコンテンツの開発にあたり、 留意しておくべき主要項目を分かりやすく説明することです。

VR プロジェクト設定

ベースがブループリントまたは C++ のいずれの場合も、VR 用プロジェクトを新規作成するには、Scalable 3D または 2D グラフィクスと No Starter Content を使って [Mobile / Tablet] オプションを使用したプロジェクトを作成するのがベストです。 この方法だと、VR プロジェクトが起動直後にフレームで確実に実行されます。

VR_Project_Settings.png

VR .INI 設定

以下は、UE4 が搭載された VR デモの Showdown の.INI 設定です。 これらの .INI 設定を使用する場合は、プロジェクト 「Config\DefaultEngine.INI」 ファイルの [SystemSettings] に追加しなければなりません。

[SystemSettings]
r.screenpercentage=130
r.SeparateTranslucency=0
r.HZBOcclusion=0
r.MotionBlurQuality=0
r.PostProcessAAQuality=3
r.BloomQuality=1
r.EyeAdaptationQuality=0
r.AmbientOcclusionLevels=0
r.SSR.Quality=1
r.DepthOfFieldQuality=0
r.SceneColorFormat=2
r.TranslucencyVolumeBlur=0
r.TranslucencyLightingVolumeDim=4
r.MaxAnisotropy=8
r.LensFlareQuality=0
r.SceneColorFringeQuality=0
r.FastBlurThreshold=0
r.SSR.MaxRoughness=0.1
r.rhicmdbypass=0
sg.EffectsQuality=2
sg.PostProcessQuality=0

VR Instanced Stereo

UE 4.11 のリリースでは、VR のパフォーマンスに対する影響を緩和するために Instanced Stereo レンダリングが実装されました。 この機能は、[Edit (編集)] -> [Project Settings (プロジェクト設定)] -> [Rendering (レンダリング)] -> VR の [Instanced Stereo] オプションにチェックを入れて有効にします。

VR_ISR.png

Instanced Stereo レンダリングを有効にした後、エンジンを再起動し、シェーダーを再コンパイルする必要があります。 ベース パスと Early-Z パス (両方ともシリアルおよび並列レンダリング パス) は、機能が有効にされると、スタティック メッシュ、スケルタル メッシュ、スプライト パーティクル、メッシュ パーティクルで機能します。 現在、Instanced Stereo は PC (DirectX) と PS4 で使用できます。それ以外のプラットフォームのサポートは 4.11 初回リリースの後になります。 VR における Standard Stereo レンダリングおよび Instanced Stereo レンダリングを以下の動画で紹介しています。

モバイルで VR マルチビューをサポート

(サポート対象の) モバイル デバイスのいくつかで VR マルチウィンドウがサポートされました。モバイル マルチビューはデスクトップ PC で使用できる Instanced Stereo レンダリングと似ており、ステレオ レンダリング用に最適化したパスをモバイル デバイスの CPU 上に提供して機能します。この機能を有効にするには、以下の手順を行います。

この機能は実験的なので、最新のメール ベースの GPU でのみ動作します。機能が成熟し、オンラインでより多くのモバイルをサポートするようになると、この警告は出なくなります。

  1. メイン ツールバー から [Edit (編集)] > [Project Settings (プロジェクト設定)] を選んで、エディタのプロジェクト設定を開きます。

  2. 次に、[Engine] > [Rendering] > [VR] を開き、[Mobile Multi-View (実験的)] オプションを探します。

  3. [Mobile Multi-View (実験的)] オプションは、名前の横のチェックボックスにチェックを入れると有効になるので、その後で再起動して変更を反映させます。

    VR_MobileMultiView.png

この機能を使うためには、Android のビルド設定を以下のようにする必要があります。

  • [Android] > [Build] セクションで [Support OpenGL ES2] が有効になっていることを確認してください。

  • [Mobile HDR][Instanced Stereo Rendering] が無効になっているか確認してください。

  • 現時点では、Mobile Multiview は最新のメール ベースの GPU でのみ動作します。

  • 互換性のある GPU を搭載せずに本機能でプロジェクトをパッケージ化した場合、この機能はランタイムで無効になります。

VR パフォーマンスのプロファイル

VR に対する負荷が大きすぎるアセットを追跡する場合は、プロジェクトのライフタイムを通じて、CPU と GPU へのプロジェクトの負荷要因をプロファイルする必要があります。

  • GPU Profiling - プロジェクトの実行中に CTRL + SHIFT + , (カンマ キー) を一緒に押すと、GPU プロファイラを有効が有効になります。キーを押すと、新規ウィンドウが開いて以下の画像のようになります。 VR_GPU_Profiler.png

  • CPU Profiler - CPU 上のプロジェクトの負荷分析は、GPU のプロファイルよりも若干複雑になります。この方法についての詳細については、パフォーマンス プロファイラ をご覧ください。

VR フォワード レンダリング

ForwardRenderingBanner.png

アンリアル エンジン 4 はディファード レンダラを使用するデフォルト設定なので、多様性を高め、より多くのレンダラ機能へのアクセスが保証されます。 ただし、ディファード レンダラにはトレードオフもあります。すべての VR 体験に適しているというわけではありません。 フォワード レンダリング は、レンダリング パスが速くなることで基準値も上がるので、VR プラットフォーム上でのパフォーマンスが良くなる場合があります。 また、速くなるだけではなく、提供されているアンチ エイリアシング オプションを使うとビジュアルも一層きれいになります。

詳細は VR でフォワード レンダリングを使用する のドキュメントをご覧ください。

VR ポストプロセス設定

VR のレンダリング要件は厳しいので、デフォルトで有効設定にされている高度なポスト プロセス機能のほとんどを無効にしておかないと、 プロジェクトのパフォーマンスに問題が生じる可能性があります。無効にするには、以下の手順に従います。

  1. Post Process(PP) ボリュームがレベルにない場合は、レベルに追加します。

  2. PP ボリュームを選択し、[Post Process Volume] セクションで [Unbound (境界なし)] オプションを有効にして、PP ボリュームの設定がレベル全体に適用されるようにします。

    VR_PP_Unbound.png

  3. [Post Process Volume][Settings (設定)] を展開して、各セクションをクリックしてプロパティを有効にして、デフォルト値に値を設定します。デフォルト値 (通常 1.0) を 0 にすれば、この機能は無効になります。

    VR_Disable_PP_Settings.png

    この操作をする場合、セクションすべてを開いてプロパティを 0 にする必要はありません。その変わりに、レンズフレア、スクリーン スペース反射、テンポラル アンチエイリアシング、SSAO、ブルームなどの非常に重たい機能や、パフォーマンスに影響を与える機能を最初に無効にします。

VR ワールドのスケーリング

VR プラットフォームで可能な限り最高のユーザー体験を提供するためには、 ワールドのスケーリングを正確に行うことが最も重要です。正確なスケーリングを怠ると、ユーザーに様々な感覚的な違和感を与え、 シミュレーション酔いをさせてしまう可能性もあります。オブジェクトは、プレイヤーのカメラから 0.75 から 3.5 メートル (m) の範囲が一番見やすくなります。 UE4 内では、1 アンリアル ユニット (UU) は 1 センチ (cm) と等しくなっています。つまり、アンリアル内にあるオブジェクトは、 プレイヤーのカメラ (VR 使用時) から 75 UU から 350 UU 離れた位置にある時が最も見やすいということです。

距離 アンリアル ユニット(UU) での距離
1 センチ (cm) 1 アンリアル ユニット
1 メーター 100 アンリアル ユニット
1 キロメーター 100,000 アンリアル ユニット

UE4 内の [World Settings (ワールド設定)] にある World to Meters 変数でワールドのスケールを調整することができます。 この数字を増減すると、周りのワールドとの関係でユーザーは自分が大きく、あるいは小さく感じます。 仮にコンテンツが 1 アンリアル ユニット = 1 CM でビルドされている場合、[World To Meters]「10」 に設定するとワールドが非常に大きくなります。 逆に World To Meters1000 に設定すると、ワールドは非常に小さくなります。

T_VR_World_To_Meters_00.png

VR とシミュレーション酔い

シミュレーション酔いとは、VR ワールドで HMD デバイスを使用する際に生じる乗り物酔いの一種です。シミュレーション酔いがユーザーの VR 体験に与える打撃はかなり大きく、 せっかくの VR 体験を台無しにしてしまう事もあります。ユーザーに辛い VR 体験をさせないためにも、 以下のベストプラクティスを 遵守 してください。でないと、 ユーザーに非常に不快な VR 体験をさせてしまう可能性があります。

  • HMD のネイティブ フレームレートを常に上回るようにするために、フレームレート、そして欲を言えばバッファの維持は必要です。 低いフレームレートもシミュレーション酔いの別の要因になるため、出来る限りゲームを最適化してください。 以下の表は、各種 HMD の UE4 のサポートとこれらのデバイス上での実行に VR プロジェクトが必要とするターゲット フレーム レートです。

    HMD デバイス ターゲット フレーム レート
    DK1 60 FPS
    DK2 75 FPS
    Rift Retail 90 FPS
    Vive 90 FPS
    Gear VR 60 FPS
    PSVR 最高 120 FPS まで変動
  • 開発者は VR デバイスの使用に慣れているため、テスト対象者としては最も不適切です。シミュレーション酔いの発生を防ぐためにも、テスト対象者はできるだけ幅広いタイプから選んでゲームをチェックしてください。

  • シネマティクス カメラ、あるいはプレイヤーがカメラ移動を制御できなくするカメラは、ユーザーが最悪の VR 体験をする元凶になりやすいため、使用は避けてください。

  • 視野角 (FOV) を手動でオーバーライトしないでください。また、エンド ユーザーに編集目的で視野角を公開しないでください。値はヘッドセットとレンズの物理ジオメトリと一致していなければなりません。これはデバイスの SDK と内部コンフィギュレーションにより自動的に設定されます。不整合があれば、頭を回転させたときにワールドが歪んでいるように見えて、不快感や吐き気につながります。

  • カメラ効果に "Walking Bob" を使用しないでください (ファーストパーソンゲームでよくあります)。人の動きを真似するためにカメラを上下すると、プレイヤーにシミュレーション酔いを起させて、VR 体験を台無しにしてしまいます。

  • イベントをプレイヤーに伝えようとする時に、カメラを揺らさないでください。手榴弾がプレイヤーの横で爆発した時、VR 以外のゲームではカメラが揺れるのは自然に思いますが、VR ゲームの場合はすぐにシミュレーション酔いを起こします。

  • VR ゲーム用にワールドとレベルを設計している場合、通常よりも暗いライトとカラーを使用するようにしてください。VR ゲームで強く鮮やかなライティングを使用すると、シミュレーション酔いが速く起こる可能性があります。通常よりも落ち着いた描画や暗いライトを使用することで、こうした状況を回避します。

  • 階段は避けて代わりにエレベーターを使ってください。プレイヤーが素早く移動すると、特に階段の上り下りの場合、方向感覚を失いやすくなります。

  • プレイヤーは、徐々にフルスピードにするのではなく、一気にフルスピードにします。さらに、移動速度への加速は常に一定でなくてはなりません。

  • 被写界深度あるいはモーション ブラー ポストプロセスは使用しないでください。ユーザーが見ているものへの影響が大きく、さらに重要なのは、ユーザーにシミュレーション酔いをさせてしまうからです。

これらは、シミュレーション酔いの根本的原因の徹底調査結果ではありませんが、VR ゲームのプレイ中にプレイヤーの具合を悪くする原因のヒンとして役立つはずです。

VR カメラの設定

UE4 で VR カメラを設定する場合、VR 体験を立って行うか、座って行うかによって全く異なります。 座って行う体験の場合、カメラの基点をキャラクターが立っている状態まで人為的に高くする必要があります。 ただしこの場合、カメラの原点が 0 (グラウンド上) になるようにしてください。 そのためには、キャラクターのベースでカメラ コンポーネントをシーン コンポーネントにアタッチするか、 Eye Height (目の位置) をキャラクター上のコリジョン カプセルの (マイナスの) Cylinder Height (シリンダーの高さ) の半分に設定します。

VR キャラクター設定

VR ヘッドセットを使用したキャラクターのセットアップは、標準のキャラクターのセットアップとは若干異なります。例えば、キャラクターの 高さ、幅、速度、カメラ位置、これらはすべて VR キャラクターに合わせて若干の修正が必要となります。

VR ワールドからオブジェクトをビルドする場合、 デジタル オブジェクトのスケールを現実世界のオブジェクトと同じにすることが重要です。現実世界のサイズより小さくても大きくても、 得られるはずの没入感を台無しにしてしまうことがあります。

キャラクターの高さと幅

キャラクターの高さと幅は、可能な限り現実世界のサイズと同じにします。現実世界のサイズより小さくても大きくても、 得られるはずの没入感を台無しにしてしまうことがあります。

プロパティ UE4 デフォルト 推奨 VR
Height: 192 cm 176 cm
Width: 84 cm 68 cm

移動速度

VR の移動速度は設定の推奨が難しいです。 なぜなら、達成しようとする体験のタイプによって異なるからです。例えば、Elemental VR デモでは、 移動速度を通常の約 1/4 にしています。

プロパティ UE4 デフォルト 推奨 VR
Movement Speed: 60 m/s 24 m/s

カメラ位置

VR カメラは基本的な目の高さよりも若干低めに配置して、キャラクターの目の高さになるように補正する必要があります。

プロパティ UE4 デフォルト 推奨 VR
Base Eye Height: 180 cm 160 cm

VR コンテンツに対する配慮

VR コンテンツを制作する場合には、ユーザーは複数の角度からコンテンツを見ていることを忘れないでください。今まで問題なく行ったことであっても、 VR の場合は以下のように回避すべきことがあります。

  • Scale - VR ワールドのオブジェクトをスケールする場合は、できるだけ実際のサイズを使うのが最善の方法です。 オブジェクトのサイズが現実世界と異なると混乱を招き、シミュレーション酔いにつながることがあります。

  • Missing Polygon Faces - 標準的なゲームでは、ポリゴン面をプレイヤーには見えないオブジェクトから削除することができます (推奨します)。 しかし、VR ゲームではプレイヤーは周囲をかなり自由に見渡すことができるため、この方法だとプレイヤーは見えないはずのものが見えてしまう場合があります。

  • Which Type of Lighting to use - VR プロジェクトの作成には、レンダリング負荷が最も低い Static lighting (静的ライト)ライトマップ を常に使います。 動的ライティングを使う必要がある場合は、動的ライト数を可能な限り少なくして、お互いに触れ合うことのないようにしてください。 屋外のシーンがある場合は、指向性ライトを Stationary light (固定ライト) ではなく動的に設定して、Cascaded Shadow Maps(CSM); を有効にしておくと、最もシンプルな設定でシャドウを付けることができます。

  • VR と VFX - SubUV テクスチャ による炎や煙のシミュレーションなどのトリックは、VR ではうまく反映されません。 ほとんどのケースにおいて、爆発や煙のトレイルなどの VFX のシミュレーションには 2D パーティクルではなくスタティック メッシュを使います。
    近距離フィールド エフェクトあるいはカメラに近いエフェクトは VR できれいに出ますが、これはエフェクトがスタティック メッシュ パーティクルで作成されている場合に限ります。

  • VR と Transparency - 一般的に透過処理は、何も変更がないことを確認するために各フレームを再評価する必要があるため、3D グラフィクスでのレンダリング透過処理は非常に負荷が高くなります。 この再評価のために、VR のレンダリング透過処理は負荷があまりに大きすぎて、本来の良さが生かせなくなります。 ただし、DitherTemporalAA マテリアル関数を使えばこの問題を回避することができます。 このマテリアル関数は、マテリアルが透過処理を使っているかのように見せることができますし、セルフ ソートなど一般的な透過処理の回避も可能です。

    VR_Dither_Trans_AA.png

  • Fake everything you can (できる限り真似をする) - 動的シャドウ、ライティングなど、負荷の大きいレンダリング オプションを再生成する小技を頭に入れておくと、VR で希望するパフォーマンスがしやすくなります。 Showdown では、キャラクターに動的シャドウをキャストすると各フレームの負荷が大きすぎることが判明したので割愛しました。 すると今度は、キャラクターが移動中に宙に浮いているように見えてしまいました。 そこで、偽の BLOB シャドウを導入して修正すると、位置と強度を大幅に調整することができました。 これにより、キャラクターがグラウンドや他のオブジェクトに近づくと、シャドウをキャストしているように簡単に見せることができるようになりました。

    クリックしてフルサイズで表示

VR ブループリント関数

ブループリント エディタには、VR ヘッドセットとモーション コントローラとインタラクトするために使用できるブループリント ノードが豊富にあります。 以下は、各ノードの名前と機能の説明です。

ヘッドマウント ディスプレイのブループリント ノード

VR_HMD_BP_Nodes.png

ブループリント ノード名 機能
Enable HMD HMD ステレオ レンダリングの使用の切り替えをします。
Enable Low Persistence Mode Low persistence モードと Full persistence モードを切り替えます。
Get Orientation And Position HMD の現在の方向と位置を取得します。
Get Positional Tracking Camera Parameters HMD にポジション トラッキング カメラが付いている場合、カメラのゲーム ワールド位置を返すと同時に、トラッキング カメラの境界範囲のパラメータでもあります。これにより、ゲーム内で正しいポジション トラッキング範囲を表示することができます。カメラが利用できない、あるいは HMD がサポートしていない場合、すべての値はゼロになります。
Get Screen Percentage VR モードで使用する画面比率を返します。
Get World to Meters Scale ワールドをマスター スケールに戻すことで、プレイヤーが感じるワールドのスケールに一致させます。
Has Valid Tracking Position HMD がポジション トラッキングをサポートする場合、現在トラッキングされているかどうかを示します。
Is Head Mounted Display Enabled ヘッドマウント ディスプレイを現在使用しているかどうかを返します。
Is In Low Persistence Mode HMD が、Low persistence モードの場合、true を戻します。そうでない場合は、false を戻します。
Reset Orientation And Position 現在のヨーが前方方向で、現在のポジションがゼロポイント (ポジション トラッキング用) であると想定して、ロール (進行軸回転) とピッチ (上下動) を 0 に設定します。
Set Clipping Planes 遠近のクリッピング平面 (NCP と FCP それぞれ) のステレオ レンダリングを設定します。'stereo ncp = fcp' コンソール コマンドと似ていますが、このコマンドで設定した NCP and FCP は .INI ファイルには保存されません。
Set World to Meters Scale ワールドをマスター スケールに設定することで、ワールドのスケールをプレイヤーが感じるワールドのスケールに変更します。

Steam VR ブループリント ノード

VR_Steam_VR_BP.png

ブループリント ノード名 機能
Get Hand Position and Orientation コントローラ インデックスと手がある場合、コントローラの位置と方向を返します。
Get Tracked Device Position and Orientation HMD の現在の方向と位置を取得します。
Get Tracking Space 追跡中の空間 (座っている、立っているなど) を取得することにより、基本の位置を決定します。
Get Valid Tracked Device Ids (有効な追跡デバイス ID を取得) 現在追跡されているデバイス ID の配列を返します。
Set Tracking Space 追跡空間 (座っている、立っているなど) を設定することにより、変更します。追跡位置をどの空間に返すのかを変更します。

VR に関する既知の問題

HMD 機能が原因で、ビデオ ゲーム開発には必須だったアート技術にあった影響がなくなってしまいました。 以下は、VR では期待どおりに動かない機能、およびそれに対する回避策です。

既知の問題 回避策
Screen Space Reflections(SSR) (スクリーン スペース反射) SSR は VR で機能しますが、生成される反射をワールド内の反射と一致させる上で問題が発生する可能性があります。負荷がかなり小さく、反射アライメントの問題も減るため、SSR ではなく 反射プローブ を使います。

法線マッピングの問題

VR でオブジェクト上の法線マップを見ると、これまでのような効果がなくなっていることがわかります。 法線マップが両眼表示や運動視差を考慮していないためです。 このため、法線マップは VR デバイスではフラットに見えます。 ただしこれは、法線マップを使用する必要がないという意味ではありません。 法線マップにしようとしているデータをジオメトリで作成すべきかどうかを、しっかり評価する必要があるという意味です。 以下は、法線マップの代わりに使用することができる技術です。

形状タイプ 説明
視差マッピング 視差マッピングは、法線マッピングでは考慮しないデプスキューを考慮することで法線マッピングを次のレベルに高めます。視差マッピング シェーダーは、オブジェクトを実際よりも詳細に表示して、深さ情報を詳しく表示できます。これは、どのアングルから見ても、その視点からの正確な深度情報が表示されるように視差マップが常に補正しているからです。視差マップは、敷石道や表面の細部の表現に最適です。
Tags