VR のベスト プラクティス

VR プロジェクトのコンテンツを作成し、最適化するためのベスト プラクティス

Windows
MacOS
Linux

VR (バーチャル リアリティ/仮想現実) は優れた没入感を実現する新しい媒体です。VR ユーザー向けにコンテンツを作成して提供する際は、VR 特有の検討事項を考慮する必要があります。検討すべき事項には、ユーザーの使い心地、コンテンツの最適化、各プラットフォームの制限事項などが含まれます。VR プロジェクトを進めていく上で、これらの検討事項に関する参考資料としてこのページを活用してください。

VR プロジェクト設定

VR プロジェクトはブループリントまたは C++ で作成できます。

VR プラットフォームを対象とするプロジェクトを新しく作成する際は、[Games (ゲーム)] カテゴリの [VR Template (バーチャル リアリティ)] を選択し、[Project Settings (プロジェクト設定)] の画面で次のオプションを指定します。

  • スケーラブルな 3D・2D

  • レイトレースを無効

  • モバイル / タブレット

  • スターター コンテンツ無し

VR_Project_Settings.png

これらの設定により、最小限のレンダリング機能が有効な Unreal プロジェクトが作成されます。これによってプロジェクトを適切なフレームレートで開始することができ、必要なレンダリング機能のみを追加できます。

プロジェクトを作成したら、アプリのパフォーマンス向上のために次のプロジェクト設定を行います。

  • [Edit (編集)] > [Project Settings (プロジェクト設定)] > [Description (説明)] に行き、[Start In VR (VR で開始)] をオンに設定します。

  • [Edit] > [Project Settings] > [Engine (エンジン)] > [Rendering (レンダリング)] > [Forward Renderer (フォワード レンダラ)] で、Forward Shading をオンに設定します。

  • [Edit] > [Project Settings] > [Engine] > [Rendering] > [Default Settings (デフォルト設定)] で、[Anti-Aliasing Method ][MSAA] に設定します。 [Edit] > [Project Settings] > [Rendering] > [VR]Instanced Stereo を有効にします。

  • モバイルでの VR の場合は、[Edit] > [Project Settings] > [Rendering] > [VR] にある Mobile Multi-View を有効にします。

VR .INI 設定

パフォーマンスまたは品質向上のためにアプリのグラフィックをスケーリングする場合の説明と例については、「スケーラビリティ リファレンス」を参照してください。以下の表には、VR プロジェクト向けのコンソール変数の一部と、推奨される設定値が記載されています。

コンソール変数

推奨値

説明

vr.PixelDensity

1

現在使用されている HMD 向けの理想的な解像度は 1 です。これより小さい値に設定すると処理が高速になりますが、アンダーサンプリングが発生します (よりぼやけます)。1 より大きい値に設定すると、処理は遅くなりますがスーパーサンプリングとなります (よりシャープになります)。

r.SeparateTranslucency

0

フィル レートの制限のため、モバイルでの VR 体験向けにはコストが高くなる可能性があります。この機能は無効にすることを推奨します。

r.HZBOcclusion

0

詳細については、「可視性カリング」ページの階層 Z バッファ オクルージョンのセクションを参照してください。

以下の .ini 設定は、UE4 による VR 体験デモ「ショーダウン」で使用されているものです。これらの設定をプロジェクトの「Config/DefaultEngine.ini」ファイルの SystemSettings セクションにコピーして、起点として使用できます。

[SystemSettings]

vr.PixelDensity=1
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 フレームレートの最適化

ほとんどの VR アプリケーションは VR フレームレートを制御するために独自のプロシージャを実装しています。このため、VR アプリケーションを妨げる可能性がある一般的な UE4 プロジェクト設定のいくつかを無効にすることが望ましいです。

次の手順に従って、UE の全般的なフレーム レート設定を無効にしてください。

  1. エディタのメイン メニューから [Edit (編集)] > [Project Settings (プロジェクト設定)] をクリックし、[Project Settings] ウィンドウを開きます。

  2. [Project Settings] の [Engine (エンジン)] セクションにある [General Settings (基本設定)] を選択します。

  3. [Framerate (フレーム レート)] セクションで次のように設定します。

    • [Smooth Frame Rate (フレーム レートをスムージング)] をオフにします。

    • [Use Fixed Frame Rate (固定フレーム レートを使用)] をオフにします。

    • [Custom TimeStep (カスタム時間ステップ)] を [None (なし)] に設定します。

    • [Apply (適用)] をクリックします。

Framerate_after.png

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

VR プラットフォームで最高のユーザー エクスペリエンスを実現する上で最も重要なことの 1 つに、ワールドを正確にスケーリングすることがあります。正確にスケーリングを行わないとユーザーに違和感を感じさせることになり、シミュレーション酔いを引き起こす原因ともなり得ます。オブジェクトが見やすい位置は、プレイヤーのカメラから 0.75 ~ 3.5 メートル (m) の範囲です。UE4 では、1 アンリアル単位 (UU) が 1 センチメートル (cm) に相当します。つまり、Unreal 内では、プレイヤーのカメラ (VR 使用時) から 75 UU ~ 350 UU が最もオブジェクトを見やすい距離ということになります。

距離

アンリアル単位 (UU) での距離

1 センチメートル (cm)

1 UU

1 メートル (m)

100 UU

1 キロメートル (km)

100,000 UU

ワールドのスケールは、[World Settings (ワールド セッティング)][World to Meters (ワールドの単位をメートルに)] 変数を使って調整できます。この数値を増減させると、ユーザーは周辺のワールドに相対して自分が大きく、または小さくなったように感じます。コンテンツが「1 アンリアル単位 = 1 cm」でビルドされている場合、[World To Meters]10 に設定するとワールドが非常に大きくなり、1000 に設定するとワールドが非常に小さくなります。

T_VR_World_To_Meters_00.png

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

シミュレーション酔いとは、没入型体験中に生じる乗り物酔いの一種です。以下は、ユーザーの VR 体験中に不快感を抑えるためのベスト プラクティスです。

  • フレーム レートを維持する: フレームレートが低いとシミュレーション酔いの原因となります。プロジェクトを可能な限り最適化することで、ユーザーの VR エクスペリエンスを高めることができます。以下の表は、各 XR プラットフォームで推奨されるターゲット フレーム レートです。

    HMD デバイス

    ターゲット フレーム レート

    Oculus Rift S

    90

    Oculus Quest 1 および 2

    90

    HTC Vive

    90

    HTC Vive Pro

    90

    Valve Index

    最小 90、最大 144

    HP Reverb

    90

    Windows Mixed Reality VR

    90

    PSVR

    Situational:60/120、90/90、120/120

    HoloLens 2

    60

    ARKit

    60

    ARCore

    60

  • ユーザー テスティング: シミュレーション酔いの発生を防ぐために、できるだけ幅広いタイプのユーザーにを使ってテストし、VR アプリで生じるあらゆる不快感をチェックするようにします。

  • ユーザーによるカメラの制御: シネマティック カメラや、プレイヤーがカメラ移動を制御できないカメラを使用すると、没入型体験中に不快感を生じさせる原因となり得ます。頭の振りやカメラの揺れなどのエフェクトは、ユーザーがこれらを制御できない場合に不快感を生じさせる原因となり得るため避けてください。

  • 視野角 (FOV) をデバイスに一致させる: FOV の値はデバイスの SDK と内部設定によって設定され、ヘッドセットとレンズの物理ジオメトリに一致します。このため、UE 内で FOV を変更しないでください。また、ユーザーによる変更も許可すべきではありません。FOV 値を変更すると、ユーザーが頭を動かした際にワープしたように見え、不快感を生じさせます。

  • ライトと色は薄暗いものを使用し、不鮮明になることを避ける: VR 向けに要素をデザインする際は、通常よりも薄暗いライトと色を使ってください。VR で強く鮮やかなライティングを使用すると、すぐにシミュレーション酔いを起こす可能性があります。通常よりも落ち着いた色のシェードと薄暗いライトを使うことで不快感を回避できます。また、こうすることで、画面上の明るい領域と暗い領域間の不鮮明さを回避するための一助ともなります。

  • 移動速度を変更しない: ユーザーは、徐々に加速して最高速度にするのではなく、始めから最高速度で開始すべきです。

  • ユーザーが見ているものに大きな影響を及ぼすポスト プロセス エフェクトは避ける: 不快感を回避するために、被写界深度 (DOF) やモーション ブラーなどのポスト プロセス エフェクトは避けます。

VR カメラの設定

UE4 での VR カメラの設定は、VR 体験を座って行うか、立って行うかによって大きく変わります。

  • 座って行う場合: カメラの基点をキャラクターが立っている状態まで人為的に高くする必要があります。Eye Height (目の高さ) を、ポーンのコリジョン カプセルの [Cylinder Height (シリンダーの高さ)] (マイナスの値) の半分に設定します。

  • 立って行う場合:カメラの基点が、ポーンのルートに相対して 0 に設定されていることを確認します。通常、これは地面になります。カメラ コンポーネントをシーン コンポーネント内のポーンのベース (地面) にアタッチします。

立った場合の VR カメラ

座った場合の VR カメラ

VR キャラクター設定

VR ヘッドセットを使用したキャラクター設定は、標準的なキャラクター設定とは若干異なります。キャラクターの 高さ速度カメラ位置 などは、VR キャラクターに合わせて多少修正する必要があります。

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

キャラクターの高さと幅

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

プロパティ

UE4 でのデフォルト値

VR での推奨値

Height

192 cm

176 cm

Width

84 cm

68 cm

移動速度

VR の移動速度は、主に目的とする 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 コンテンツの制作時に注意すべき事項です。

  • スケール: VR ワールド内のオブジェクトのスケールは、できるだけ実際のサイズと同じにしてください。オブジェクトのサイズが現実世界のものと異なると、混乱を招いて シミュレーション酔い の原因となることがあります。

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

  • ライティングのタイプ: VR プロジェクトには常に Static Lights とライトマップを使用します。これがレンダリングを行う上で最も負荷の低いオプションであるためです。動的ライティングを使う必要がある場合は、動的ライトの数をできるだけ少なくして、互いに触れ合うことのないようにしてください。屋外のシーンがある場合は、指向性ライトを固定ではなく動的に設定して、 Cascade シャドウ マップ (CSM) を有効にします。こうすると、最もシンプルな設定でシャドウを付けることができます。

  • VR と VFX: SubUV テクスチャによる炎や煙のシミュレーションなど、一部の VFX テクニックは VR ではうまく反映されません。ほとんどの場合、爆発や煙の軌跡などのエフェクトのシミュレーションには、2D パーティクルではなくスタティック メッシュを使用する必要があります。 近距離フィールド エフェクト、あるいはカメラ付近で発生するエフェクトは VR できれいに表現されますが、これはエフェクトがスタティック メッシュ パーティクルで作成されている場合に限ります。

  • VR と透過性: 全般的に、透過処理では何も変更がないことを確認するために各フレームを再評価する必要があるため、3D グラフィクスでのレンダリング透過処理は非常に負荷が高くなります。この再評価のために VR のレンダリング透過処理の負荷が大きくなり、これによって得られるメリット以上の負担となります。ただし、DitherTemporalAA マテリアル関数を使うことでこの問題を迂回することができます。このマテリアル関数を使用すると、マテリアルで透過処理が適用されているかのように見せることができ、セルフ ソートなどの発生しがちな透過処理の問題も回避できます。

    画像をクリックしてフルサイズで表示。

    • できる限り模倣する: 動的シャドウやライティングなど、負荷の高いレンダリング オプションを再現する方法を知っておくと、VR で希望のパフォーマンスを得やすくなります。ショーダウンでは、キャラクターに動的シャドウをキャストすると各フレームの負荷が大きすぎることが判明したので割愛しました。すると今度は、キャラクターが移動中に宙に浮いているように見えてしまいました。そこで、ワールド内のキャラクターとオブジェクト間の距離に基づいて位置と強度を動的に調整可能な偽の BLOB シャドウを導入して修正しました。これにより、キャラクターが地面や他のオブジェクトに近づくと、キャラクターがシャドウをキャストしているように見せかけることができるようになりました。

    画像をクリックしてフルサイズで表示。

既知の制限事項

以下は、HMD の設計上の理由により、VR では期待どおりに動作しない可能性のある機能とその回避策です。

  • スクリーン スペース反射 (SSR): SSR は VR で機能しますが、生成される反射をワールド内の反射と一致させる上で問題が発生する場合があります。SSR ではなく反射プローブを使うことで、反射アライメントの問題を緩和すると同時に負荷を下げることができます。

  • スクリーン スペース グローバル イルミネーション: スクリーン スペース技術により、HMD でそれぞれの目のディスプレイの間に差異が生じることがあります。このような差異はユーザーに不快感を感じさせる原因となり得ます。VR で推奨されるライティングのタイプについて、「ライティング タイプ 」を参照してください。

  • レイ トレーシング: 現在、レイ トレーシングを使用する VR アプリでは、快適な VR 体験を実現するために必要な解像度とフレーム レートを維持することができません。

  • 2D UI またはビルボード スプライト: 2D UI またはビルボード スプライトは、ステレオでの表示時にうまく機能しないため、ステレオ レンダリングではサポートされていません。2D UI またはスプライトの代わりに、3D ワールド内に配置されたウィジェット コンポーネントを使用してください。これらのウィジェットの作成方法については、「3D ウィジェット インタラクションを作成する」を参照してください。

ノーマル マッピングに関する問題

VR でオブジェクトの法線マップを表示すると、以前には有効だった効果が反映されていないことがわかります。これは、法線マッピングでは両眼の視差または運動視差が考慮されないことが原因です。VR デバイスで法線マップを表示すると、結果として多くの場合は平坦に見えるようになります。ただし、法線マップを使用すべきでない、もしくは使用する必要がないわけではありません。より緊密に評価を行い、法線マップを通じて伝えようとしているデータが、ジオメトリを使ったほうがより良く伝わるかどうかを確認してください。次は、法線マップの代わりに使用可能な技法です。

  • 視差マッピング: 視差マッピングでは、法線マッピングでは考慮されない深度キューを組み合わせることで、法線マッピングよりも優れたテクスチャ マッピングが可能になります。視差マッピング シェーダでは深度情報をより良く表現でき、本来の詳細よりも細かくオブジェクトを描くことができます。視差マップでは、プレイヤーが見る角度にかかわらず、プレイヤーの視点で適切な深度情報が表示されるよう、常に補正が行われるためです。視差マップが最大の効果を発揮する例としては、きめ細やかな石畳の小道やサーフェスなどがあります。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる