本文へスキップ

オクルージョン

オクルージョンは仮想オブジェクトに奥行きを与え、現実世界のオブジェクトの後ろや前に見えるようにする。 バーチャル・コンテンツは、シーン内に物理的に存在しているように見え、ユーザーがデバイスを動かして空間を移動すると、オブジェクトの視界が動的に遮られる。

マスコットたちが木の陰を歩くときのオクルージョンの例です:

What's New?

ARDK 3.0では、LightshipがARFoundationのXROcclusionとXRMeshingサブシステムをNianticの改良されたアルゴリズムで拡張し、ARFoundationの簡単なワークフローを維持しながら、より良い体験を開発者にシームレスに提供します。 また、Lightshipは、アプリケーションのニーズに応じて、ダイナミックオクルージョンとメッシュベースオクルージョンを切り替えることができる実装を提供します。 この実装は、LiDARの有無に関係なく、どのようなデバイスやプラットフォームでも動作します!

オクルージョンの種類

この AROcclusionManagerARMeshManagerはオクルージョンをサポートする3つのモードを提供します:

  1. Instant Dynamic Occlusion:
  • AROcclusionManagerが提供するデフォルトのオクルージョンモード。
  • 人やペットなど、動きの速い被写体を捉えるのが得意。
  • ジャストインタイムのオクルージョンは、常にメッシュと一致するとは限らず、メッシュされたオブジェクトをオーバー/アンダーオクルージョンする可能性があります。
  • パフォーマンスを上げるために、オクルージョンを必要としないメッシュではオクルージョンを無効にすることができます。
  • インスタントオクルージョンを使用するには、シーンにAROcclusionManagerを追加します。 AROcclusionManager
  1. メッシュオクルージョン(安定、スローオクルージョン):
  • メッシュベースのオクルージョンは、インスタント・ダイナミック・オクルージョンよりも安定しており、きれいな結果が得られますが、更新頻度は低くなります。
  • メッシュベースのオクルージョンは、深度測定の範囲を平均化するため、環境の静的な領域に対してより正確です。
  • 更新頻度が低いため、(人間やペットのような)ダイナミックなエージェントは、オクルージョンの信頼性が低くなるかもしれない。
  • メッシュベースのオクルージョンを使用する:
    • ARMeshManagerをシーンに追加し、コンポーネントを無効にするかシェーダを使用してメッシュジオメトリを不可視にします。 ARMeshManagerコンポーネントを追加すると、ゲームオブジェクトのスケールが変わるので、スケールの不一致を避けるために、必ずメインカメラの子オブジェクトにコンポーネントを追加してください。
    • シーンにAROcclusionManagerを追加し、オクルージョンのプリファレンスモードを No Occlusionに設定します。 このコンポーネントはメッシュを生成するのに必要だが、オクルージョンには使用されない。 無効なARMeshManagerコンポーネント
  1. インスタント・デプス+メッシュ・ブレンデッド・オクルージョン:
  • オクルージョン・スタビライゼーションには、両方のモードの長所がある。 インスタント・オクルージョンの高速レスポンスと、メッシュ生成の安定した平均化効果が組み合わされている。
  • ARMeshManager環境メッシュから深度マップが生成され、テクスチャにレンダリングされ、AROcclusionManagerインスタント深度機能と、ちらつきやZファイトを回避する方法で結合されます。
  • このモードを使用するには、シーンにLightship Occlusion Extensionを追加し、Occlusion Stabilizationを有効にします。

ライトシップ・オクルージョン・エクステンション

Lightship Occlusion Extensionは、オプションと機能を追加することで、ライトシップオクルージョンのビジュアルクオリティを向上させます。 深度情報とセマンティック情報を組み合わせて使用することで、ARオブジェクトがオクルージョンされない領域を定義したり、ニーズに応じてオクルージョンモードを絞り込むオプションを追加することができます。

ライトシップ・オクルージョン・エクステンション

この拡張機能には以下のオプションがある:

  • オクルージョンの最適設定
    • Optimal Occlusionモードは、オクルージョンを提供するために深度バッファがフレーム間でどのように変換するかを決定します。 3つのモードがある:
      • Closest Occludee 画面全体からオブジェクトをサンプリングし、カメラに最も近い深度値を使用する。 このモードは、画面上に同じようなサイズと重要性を持つさまざまなCGオブジェクトがある場合に、最も説得力のあるオクルージョンを作成します。
      • Specified Game Object: 特定のCGアセットまでの距離をサンプリングし、その特定のオブジェクトに対して最高品質のオクルージョンを提供します。
      • Static: 深度テクスチャ全体で最も近いオブジェクトまでの距離をサンプリングする。 その名の通り、このモードは動かないオブジェクトに最適である。
  • Principal Occludee
    • Principal Occludee は、 Specified Game Object オクルージョンモードを使用する際に、どのオブジェクトにフォーカスを当てるかを決定します。 この変数を設定しても、 Closest Occluder モードでは効果がありません。
  • Occlusion Suppression (オクルージョンサプレッション)
    • Occlusion Suppression: 特定のセマンティック・チャンネルのために、ユーザーが遠距離深度平面に深度値を予約することができます。 これは、オブジェクトが地面を動き回っているときにオクルージョンがちらつくなど、ノイズの多いデプス出力がモデルを誤ってオクルージョンするのを防ぐのに便利です。 このオプションを有効にすると、さらに3つのオプションが表示されます:
    • Semantic Segmentation Manager(セマンティック・セグメンテーション・マネージャー)
      • オクルージョン・サプレッションを使用するには、ここにSemantic Segmentation Managerをアタッチします。 詳しくは How to Setup Real World Occlusion をご覧ください。
    • Suppression Channels(サプレッションチャンネル)
      • サプレッションに使用するセマンティック・バッファ内のチャンネルのセット。 各チャンネルの名称を個別の名称としてリストに追加します。 多くのオクルージョンの問題に対する有効な総合的な解決策として、 groundsky を追加することをお勧めします。
オクルージョン抑制をオフにした例オクルージョン抑制をオフにした例
オクルージョン抑制がオフ
オクルージョン抑制をオンにした例オクルージョン抑制をオンにした例
オクルージョン抑制がオン。 地面はデプスマップには存在せず、キューブをオクルードしない。
  • オクルージョンの安定化
    • オクルージョン安定化(Occlusion Stabilization)は、シーン内の永続的なメッシュオブジェクトからレンダリングされた深度フィールドと組み合わせることで、瞬間的な深度バッファのばらつきを滑らかにします。 これにより、シーンの永続的な部分とのオクルージョンがより高品質になる。
    • メッシュマネージャ:オクルージョンスタビライゼーションを使用するには、ここにメッシュマネージャを取り付けます。 詳しくは実世界オクルージョンの設定方法をご覧ください。
オクルージョン安定化をオフにした例オクルージョン安定化をオフにした例
左:オクルージョン・スタビライゼーションはオフ。 右:オクルージョン安定化をオンにした状態。 フレームを超えた持続性に注目。
  • カスタム背景マテリアルを使用する:ライトシップの深度、セマンティクス、メッシュの深度入力を使って独自の背景シェーダを書きたい場合は、ここにカスタムレンダーマテリアルを添付できます。
  • 滑らかなエッジを好む
    • この機能を有効にすると、深度テクスチャをバイリニアフィルタでサンプリングし、オクルーデッドオブジェクトのエッジを滑らかにします。
    • 滑らかなエッジを有効にするには、オクルージョン抑制またはオクルージョン安定化も有効にする必要があります。
滑らかなエッジのない例滑らかなエッジの例
左:エッジスムージングなし。 右:エッジスムージングをオンにした状態。

既知の制限

AROcclusionManagerと ARMeshManagerの両方を使用するシーンでは、メッシュの距離と深度バッファが近いが等しくない場合にZファイトが発生し、ちらつきが発生することがあります。 この現象が発生した場合は、オクルージョン安定化をオンにすると軽減されます。

詳細情報

この機能の使い方については、 How to Setup Real-World Occlusion を参照してください。