オクルージョン
オクルージョンは仮想オブジェクトに奥行きを与え、現実世界のオブジェクトの後ろや前に見えるようにします。 バーチャル・コンテンツは、シーン内に物理的に存在しているように見え、ユー ザーがデバイスを動かして空間を移動すると、オブジェクトの視界が動的に遮られる。
マスコットたちが木の陰を歩くときのオクルージョンの例です:
What's New?
ARDK 3.0では、LightshipがARFoundationのXROcclusionとXRMeshingサブシステムをNianticの改良されたアルゴリズムで拡張し、ARFoundationの簡単なワークフローを維持しながら、より良い体験を開発者にシームレスに提供します。 また、Lightshipは、アプリケーションのニーズに応じて、ダイナミックオクルージョンとメッシュベースオクルージョンを切り替えることができる実装を提供します。 この実装は、LiDARの有無に関係なく、どのようなデバイスやプラットフォームでも動作します!
オクルージョンの種類
AROcclusionManager
と ARMeshManager
には、オクルージョンに対応した3つのモードがあります:
- Instant Dynamic Occlusion:
AROcclusionManager
のデフォルトのオクルージョンモード。- 人やペットなど、動きの速い被写体を捉えるのが得意。
- ジャストインタイムのオクルージョンは、常にメッシュと一致するとは限らず、メッシュされたオブジェクトをオーバー/アンダーオクルージョンする可能性があります。
- パフォーマンスを上げるために、オクルージョンを必要としないメッシュではオクルージョンを無効にすることができます。
- インスタント・オクルージョンを使用するには、シーンに
AROcclusionManager
を追加します。
- メッシュオクルージョン (安定した低速オクルージョン):
- メッシュベースのオクルージョンは、インスタント・ダイナミック・オクルージョンよりも安定しており、きれいな結果が得られますが、更新頻度は低くなります。
- メッシュベースのオクルージョンは、深度測定の範囲を平均化するため、環境の静的な領域に対してより正確です。
- 更新頻度が低いため、(人間やペットのような)ダイナミックなエージェントは、オクルージョンの信頼性が低くなるかもしれない。
- メッシュベースのオクルージョンを使用するには、次のように行います。
ARMeshManager
をシーンに追加し、コンポーネントを無効にするか、シェーダーを使用してメッシュジオメトリを不可視にします。ARMeshManager
コンポーネントを追加すると、ゲームオブジェクトのスケールが変わるため、スケールの不整合を避けるために、必ず メインカメラ の子オブジェクトにこのコンポーネントを追加してください。AROcclusionManager
をシーンに追加し、 Occlusion Preference Mode(オクルージョンの優先モード) を No Occlusion(オクルージョンなし) に設定します。 このコンポーネントはメッシュを生成するために必要ですが、オクルージョンには使用されません。
- **インスタント深度+メッシュブレンドによるオクルージョン: **
- オクルージョン安定化 は、両方のモードの利点を兼ね備えています。 この手法では、インスタント・オクルージョンの高速な応答時間と、メッシュによる安定した平均化効果が組み合わされています。
ARMeshManager
の環境メッシュから生成された深度マップがテクスチャにレンダリングされ、AROcclusionManager
のインスタント深度機能と組み合わされることで、ちらつきやZファイティングが回避されます。- このモードを使用するには、
Lightship Occlusion Extension
をシーンに追加し、 オクルージョン安定化 を有効にしてください。
Lightship Occlusion Extension
Lightship Occlusion Extensionは、追加のオプションや機能を提供することで、Lightshipのオクルージョンの視覚的品質を高める拡張機能です。 深度情報とセマンティック情報を組み合わせて使用することで、ARオブジェクトがオクルージョンされない領域を定義したり、ニーズに応じてオクルージョンモードを絞り込むオプションを追加することができます。
この拡張機能には以下のオプションがある:
- オクルージョンの最適設定
- Optimal Occlusionモードは、オクルージョンを提供するために深度バッファがフレーム間でどのように変換するかを決定します。 このモードには、3つの設定があります。
- Closest Occludee: 画面全体からオブジェクトをサンプリングし、カメラに最も近い深度値を使用します。 このモードは、画面上に同じようなサイズと重要性を持つさまざまなCGオブジェクトがある場合に、最も説得力のあるオクルージョンを作成します。
- Specified Game Object: 特定のCGアセットまでの距離をサンプリングし、その特定のオブジェクトに対して最高品質のオクルージョンを提供します。
- Static: 深度テクスチャ全体で最も近いオブジェクトまでの距離をサンプリングする。 このモードは、名前が示すとおり、動かない(静的な)オブジェクトに最適です。
- Optimal Occlusionモードは、オクルージョンを提供するために深度バッファがフレーム間でどのように変換するかを決定します。 このモードには、3つの設定があります。
- Principal Occludee
- Principal Occludee は、 Specified Game Object オクルージョンモードを使用する際に、どのオブジェクトにフォーカスを当てるかを決定します。 この変数を設定しても、 Closest Occluder モードでは効果がありません。
- Occlusion Suppression (オクルージョンサプレッション)
- Occlusion Suppression: 特定のセマンティック・チャンネルのために、ユーザーが遠距離深度平面に深度値を予約することができます。 これは、オブジェクトが地面を動き回っているときにオクルージョンがちらつくなど、ノイズの多いデプス出力がモデルを誤ってオクルージョンするのを防ぐのに便利です。 このオプションを有効にすると、さらに3つのオプションが表示されます:
- セマンティック セグメンテーション・マネージャー
- オクルージョン・サプレッションを使用するには、ここにSemantic Segmentation Managerをアタッチします。 詳しくは How to Setup Real World Occlusion をご覧ください。
- Suppression Channels(サプレッションチャンネル)
- サプレッションに使用するセマンティック・バッファ内のチャンネルのセット。 各チャンネルの名称を個別の名称としてリストに追加します。 多くのオクルージョンの問題に対する有効な総合的な解決策として、
ground
とsky
を追加することをお勧めします。
- サプレッションに使用するセマンティック・バッファ内のチャンネルのセット。 各チャンネルの名称を個別の名称としてリストに追加します。 多くのオクルージョンの問題に対する有効な総合的な解決策として、
オクルージョン抑制をオフにした状態
オクルージョン抑制をオンにした状態。 地面は深度マップには存在せず、キューブはオクルードされません。
- オクルージョンの安定化
- オクルージョン安定化 は、シーン内の永続的なメッシュオブジェクトからレンダリングされた深度フィールドと組み合わせることで、瞬間深度バッファのばらつきを抑えます。 これにより、シーン内の永続的な部分におけるオクルージョンの品質が向上します。
- メッシュマネージャー: オクルージョン安定化を使用するには、メッシュマネージャーをここにアタッチします。 詳しくは、 現実世界のオクルージョンを設定する をご覧ください。
左: オクルージョン安定化をオフにした状態。 右: オクルージョ ン安定化をオンにした状態。 フレーム間の一貫性に注目してください。
- 背景のカスタムマテリアルを使用する: Lightshipの深度、セマンティック、メッシュ深度の入力を使用して独自の背景シェーダーを作成したい場合は、カスタムレンダーマテリアルをここにアタッチします。
- Prefer Smooth Edges(スムースエッジを優先)
- この機能を有効にすると、バイリニアフィルタによって深度テクスチャがサンプリングされ、オクルードされたオブジェクトのエッジが滑らかになります。
- スムースエッジを有効にするには、オクルージョン抑制またはオクルージョン安定化も有効にする必要があります。
左: スムースエッジをオフにした状態。 右: スムースエッジをオンにした状態。
既知の制限
AROcclusionManager
と ARMeshManager
の両方を使用するシーンでは、メッシュの距離と深度バッファが近いが一致していない場合に、Zファイティングが発生し、ちらつきが生じることがあります。 この問題が発生した場合は、 オクルージョン安定化 をオンにすることで軽減され ます。
詳細情報
この機能の使い方については、 How to Setup Real-World Occlusion を参照してください。