Table of Contents

Unity で EasyAR Mega を使用して遮挡を実現する

遮挡(Occlusion)は、AR における仮想と現実の融合の没入感を高める重要な技術です。この記事では、Unity で EasyAR Mega を通じて遮挡効果を実現する方法を説明します。

開始する前に

遮挡の実装方式

  • オフラインモデリング: Block 座標系の下で、壁、柱、大型設備など現実世界の実体に対して 1:1 で一致する geometry を作成します。または Block dense model を裁剪し、面数削減して最適化されたモデルを得ます。

  • runtime alignment: 実行時に、cloud localization によって Block 座標系と現実空間を合わせ、対応する geometry を読み込みます。

  • material replacement: これらの geometry に特殊な遮挡 material を割り当てます。

  • 視覚効果: GPU が他の仮想オブジェクトをレンダリングするとき、遮挡された部分のピクセルは depth test に通らないため自動的に除去され、仮想オブジェクトが現実物理空間の遮挡ロジックに従うようになります。

マッピング結果のマスクファイルを使用する

以下の手順で、cloud localization database の Mask file download からマッピング結果のマスクファイルをダウンロードし、occlusion 用の白モデルとしてシーンにインポートします。マスクファイルはそのまま使用することも、必要に応じてトリミングすることもできます。

注記

このダウンロード方法は mapping version 9.6 以降のマッピング結果にのみ適用されます。

マスクファイルをダウンロードする

Block を cloud localization database に追加した後、その Block の行の Action 列で Mask file download をクリックします。

マスクファイルダウンロード入口

ポップアップで必要に応じて standard precision または low precision を選択し、対応する Download ボタンをクリックして glb 形式のマスクファイルをダウンロードします。

マスクファイルをダウンロード

[任意] モデルをトリミングする

マスクファイルは Block 全体を覆います。範囲が occlusion の要件を満たす場合はそのまま使用します。一部だけが必要な場合は以下のようにトリミングします。

Blender などのデジタルコンテンツ作成ソフトでダウンロードしたモデルを開きます。

トリミング前

モデルをトリミングし、occlusion に必要な部分だけを残して glb 形式で保存します。Unity にインポートした後に Block と合うよう、position、rotation、scale は変更しません。

トリミング後

Unity にモデルをインポートする

モデルを Unity にインポートし、シーン内の対応する Block ノードの子ノードとして配置します。

注記

glb モデルを Unity にインポートするには、com.unity.cloud.gltfast パッケージ 6.8 以降が必要です。Package Manager からインストールまたは更新してください。

Inspector パネルで、Block ノードに対する occlusion モデルの Transform を設定します。

  • Position(0, 0, 0) に設定します。
  • Rotation(0, 180, 0) に設定します。
  • Scale(1, 1, 1) に設定します。

完了すると、occlusion モデルは Block dense model の対応部分と重なります。

occlusion モデルをインポート

注記

cloud localization database からダウンロードしたマスクファイルは Unity と異なる座標系定義を使用するため、Rotation の Y 成分を 180 に設定する必要があります。

モデルに occlusion マテリアルを割り当てる

モデルのマテリアルを occlusion マテリアルに変更します。Unity 組み込みの SpatialMappingOcclusion を使用できます。

occlusion モデルのマテリアルを変更

EIF データでシミュレーション実行または実機実行

EIF データシミュレーションまたは実機実行で、仮想オブジェクトが対応する実空間領域に遮られるか確認します。

geometry を遮挡として使用する

以下の手順に従って、シーンに遮挡として使用する geometry を追加し、効果を検証できます。

遮挡 geometry を配置する

Mega Block の dense model に基づいて、built-in geometry または自作 geometry を遮挡として使用し、Block 座標系下の正しい位置に配置します。 Place occlusion geometry

[Optional] パノラマに基づいて geometry の位置を微調整する

Fine-tune occlusion according to the panorama

geometry に遮挡 material を割り当てる

geometry material を遮挡 material に変更します。Unity 標準の SpatialMappingOcclusion を使用できます。 Fine-tune occlusion according to the panorama

EIF data で模擬実行する、または実機実行する

実行効果に基づいて遮挡モデルの配置を微調整できます。

裁剪および面数削減した dense model を遮挡として使用する

以下の手順に従って、エクスポート後の Mega Block dense model を裁剪し、面数削減して遮挡用の白モデルを得て、シーンに import して遮挡として使用します。

Mega Blocks で export

Mesh 右側の Export ボタンをクリックして dense model を export します。

export options を変更する

export 時には export options の変更に注意してください。

図中 1 は LOD level です。level が低いほどモデルは簡単で、面数は少なくなります。最高精度が必要な場合は最高 level を選択します。

図中 2 は texture export option です。ここでは遮挡用の白モデルのみが必要で、texture は不要です。

モデルを裁剪し面数削減する

エクスポート後のモデルを Blender などの digital content creation software で裁剪し、面数削減して glb として保存します。

ヒント

例では Blender の Decimate Modifier を使用しています。

Before cropping

裁剪および面数削減後:

After cropping

遮挡モデルを Unity に import し、シーン内の Block ノード下にマウントする

Import occlusion model

モデルの Transform を変更する

モデルの Transform を変更し、PositionRotation がすべて 0 になるようにします。

この時点で、遮挡用の白モデルは dense model と一致するはずです。これは、digital content creation software で裁剪および面数削減を行ったときに、Block 座標系の定義を変更していないためです。

Occlusion model fit

モデルに遮挡 material を割り当てる

モデル material を遮挡 material に変更します。Unity 標準の SpatialMappingOcclusion を使用できます。

Replace occlusion model material

EIF data で模擬実行する、または実機実行する

EIF data を使用して模擬実行するか、実機で実行して効果を確認します。

遮挡効果の期待値

遮挡効果は主に次の点に影響されます。

  • localization tracking 自体の精度
  • モデル配置の正確さ
  • モデル自体の精度(単純な geometry ではない場合)

localization drift 時に数センチのずれが発生するのは正常です。

遮挡用モデルの面数が多すぎると性能に影響しやすいため、必要な領域でのみ使用し、できるだけ単純な geometry を遮挡として使用することをお勧めします。

関連トピック