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 をクリックします。

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

ポップアップで必要に応じて標準精度または低精度を選び、対応する ダウンロード ボタンをクリックしてマスクファイルの圧縮ファイル(zip)を取得します。解凍してモデルファイルを取り出します。

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

注記

圧縮ファイルには 1 つ以上の glb モデルファイルが含まれる場合があります。複数のモデルは Unity に個別にインポートするか、Blender などのデジタルコンテンツ制作ソフトで統合してから使用できます。

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

ダウンロードしたモデル全体で Block 全体を覆います。Block 全体を遮蔽する場合はこの手順を省き、そのまま Unity にインポートします。一部だけを遮蔽する場合は、次の手順でモデルを切り取ります。

解凍したモデルファイルを Blender などのデジタルコンテンツ制作ソフトにインポートします。

トリミング前

遮蔽に必要な部分だけを残してモデルを切り取り、glb 形式でエクスポートします。複数のモデルをインポートした場合は、必要に応じて統合してからエクスポートできます。Unity へのインポート後も Block に一致するよう、Block 座標系での位置、向き、サイズを変更しないでください。

トリミング後

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

モデルを Unity にインポートし、シーン内の対応する Block ノードの子として配置します。複数のモデルを使用する場合は、それぞれをインポートして同じ Block ノードに配置します。

注記

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

Inspector パネルで各遮蔽モデルの Transform を変更し、Block ノードに対する位置、回転、スケールを設定します。

  • 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 マテリアルを割り当てる

各モデルに遮蔽マテリアルを割り当てます。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 を変更し、Position と Rotation がすべて 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 を遮蔽として使用することをお勧めします。

関連トピック