導入
このページでは、拡張現実(AR)オブジェクトの一部をマスクし、代わりに実世界のカメラの映像を表示する方法について説明します。
例えば、ここではARウィンドウが実世界の壁に配置されています。
ウィンドウ内のシーンは実際のウィンドウの枠をはるかに超えて広がっています。しかし、シーンはウィンドウの枠内のみに表示され、残りはARマスクで隠されています。
よりシンプルな例として、ARマスクを仮想の床として機能させ、その下にある仮想オブジェクトを隠す方法があります。ここでは、椅子がこのARマスク床を通過しています:
仮想モデルがレンダリングされた後、床の高さにARマスクがレンダリングされると考えられます。ARマスクで隠されたARオブジェクトの部分は、現実世界の背景で置き換えられます。
1: 仮想モデル | 2: 赤いARマスク | 3: 現実世界の背景 |
注:この効果を実現する方法は複数あります。このページでは最もシンプルな方法を説明しています。より複雑な状況では、より複雑なシェーダーや方法が必要になる場合があります。
Aximmetry SE - Aximmetryでレンダリングされたシーン
Aximmetryのカメラモジュールには、Maskと呼ばれる特別なレンダリング出力があります。ARオブジェクトはこのMaskレンダリング出力を使用してマスクできます。マスクは、Maskレンダリング出力に書き込む特別なシェーダーを持つモデルです。
ARマスク
インポートしたモデルをマスクとして使用できますが、この例ではAximmetryの組み込みの矩形ボディモジュールをモデルとして使用しています。この矩形ボディは、現実世界の床のマスクとして機能します。
矩形を床と揃えるには、Rectangle モジュールを追加した後、そのPlane ピンを XZ (1)に設定します。また、床全体を覆うように寸法を拡大するため、X Start - Y End ピンを大きな値に変更することをおすすめします。Scene Node モジュールを使用して、矩形を現実世界の床の位置に配置できます。シャドウまたは平面反射ミラー平面を使用している場合、シーンノードを使用して矩形をそれらよりやや下に配置する必要があります。
矩形が正しく配置されたら、[Common_Studio]:Shaders\VCamU_Billboard_Mask.xshad シェーダーを矩形モジュールに接続します。これは、マスクレンダリング出力にも書き込む特殊なシェーダーです。
次に、レンダリングされたマスクでレンダリングされた画像をマスクする必要があります。これには、Render General Linked Compound に入ります。
Render General コンパウンド内では、カメラ モジュールの Mask 出力ピンを使用します。まず、追加した Inverter モジュールでこのマスク出力を反転します。その後、追加した Masker モジュールでマスクとして使用します。
上記ではカメラのソリッドレンダリング出力のみをマスクしていますが、場合によってはカメラでレンダリングされたトランスペアレンシー出力、ハイライトマップ、その他のレンダリング画像もマスクしたい場合があります。
カメラはデフォルトでマスク内に黒い背景をレンダリングするため、マスクの境界にアーティファクトが発生する可能性があります。これを防ぐため、カメラモジュールのMask Bg Colorピンを完全に透明に設定します。
現在、ARオブジェクトをARマスクの下の床レベルに移動させると、現実世界の床でクリップされるはずです。
デバッグ用マスク
マスクを編集する際、レンダリングされたマスク出力を見ても、その境界がどこにあるか確認しにくい場合があります。
シーンを編集中にマスクを可視化するため、以下のロジックを追加できます。このロジックは、マスクのイメージを最終出力にブレンドします。
Solid Color モジュールのカラーピンでマスクの色を変更できます。
シーンで目立つ色を選択してください。例えば赤など。
NOTE: このデバッグ画像は透明な画像を含みません。例えば鏡の反射など。
マスク用の複雑なジオメトリ
前の段落では、椅子が地面に直接クリップされていました。これはARマスクの意図した使用方法ではありません。例えば、仮想の窓やドアの効果を作成したい場合などです。このようなジオメトリは、Flow Editorで簡単に作成しアニメーション化できます。
上記の円形マスクは、Rectangleモジュール で、 Disc Section モジュールを使用することで実現できます。Disc Section モジュールのRadii Innerピンに正の値を設定すると、ジオメトリに穴が開きます。PlaneピンをXZ (1)に設定し、Radii Outerピンに十分な値を設定して、意図した仮想床全体を覆うようにしてください。
円の下に何も存在しないため、現実世界の画像が表示されます。しかし、穴の内部として機能し、現実世界の画像を隠す箱や他のジオメトリを簡単に追加できます。
この場合、ボックス ボディ モジュールが追加されています。テクスチャが内側を向いているのは、フリップ ピンがオンになっているためです。
上記のイメージでは、ボックスの寸法が3x3x3に設定されているため、接続されたシーン ノードの高さをマイナス3より少し大きく設定し、マスク、反射平面、シャドウ平面と重ならないようにしています。
NOTE: 同じマスク形状を矩形にする場合は、Disc SectionモジュールのCircum Segmentsピンを4に設定します。楕円形にする場合は、Transformationピンの入力モードをPos-Rot-ScalXYZに設定し、シーンノードのスケールを調整します。
円形の穴の開閉とARオブジェクトの高さをアニメーション化するには、シーケンスエディターとシーケンスモジュールを使用できます。
追加の考慮事項
または、[Common]:Shaders\Special\Cut.xshad.のようなカットアウトシェーダーを使用することも可能です。カットアウトシェーダーはアルファをレンダリングされた画像に書き出します。これはカメラモジュールのOut出力ピンを確認すると確認できます。この方法ではアルファが既にレンダリングされるため、Render_Generalコンパウンドにマスク用の追加ロジックを追加する必要はありません。ただし、ポストプロセス効果を使用する場合、複雑化する可能性があります。
NOTE: 上記のすべてのSEメソッドは、非ARカメラコンパウンドでも使用可能です。ただし、ビルボードを含むカメラコンパウンドでは、ビルボードのマスクがカメラモジュールのMask出力ピンにレンダリングされ、複雑化する可能性があります。
Aximmetry DE - Unrealでレンダリングされたシーン
この段落では、UnrealでARマスクを作成する方法について説明します。最初に、このドキュメントに記載されたガイドラインに従って、UnrealとAximmetry内でARシーンを設定する必要があります:
UnrealでARマスクを生成する主な方法は2つあります:
- ジオメトリ:この方法は、オブジェクトのジオメトリをマスクとして使用します。ただし、この方法は透明なマテリアルを完全にサポートしていない点に注意が必要です。
- マテリアル: このテクニックでは、オブジェクトのマテリアル内のロジックを構成して、ピクセルが不可視になる領域を定義します。この方法は透明なマテリアルと互換性がありますが、ジオメトリがマスクとして機能しないため、不規則な境界線の設定が複雑になる点が主な欠点です。固定された境界線(例えば均一に上昇した床など)には比較的簡単に適用できます。さらに、マスクの影響を受ける可能性のあるすべてのマテリアルを修正する必要があります。
ジオメトリ方法
Unrealのスターターコンテンツシーンに仮想ウィンドウを追加し、ARオブジェクトをマスクするために壁を作成します。もちろん、他のARオブジェクトやシーンでも同様の処理が可能です。
まず、新しいマテリアルを作成します:
マテリアルを開き、そのマテリアルのBlend ModeをAlphaHoldoutに設定し、Shading ModelをUnlitに設定します:
Translucency PassをBefore DOFに設定します:
マテリアルを保存し、ウィンドウ周辺のメッシュにマテリアルを適用します。
スターターコンテンツシーンでは、ウィンドウは既に壁で囲まれていたため、壁にマテリアルを適用するだけで desired 効果を得られました:
プロジェクトをビルドし、Aximmetry で実行すると、カメラのウィンドウ周辺の画像が表示されます:
複雑なジオメトリとテクスチャによるマスク
ほとんどのケースでは、上記の段落の壁のようなシンプルなマスクを作成するために複雑なジオメトリは必要ありません。Unrealの基本形状を組み合わせて、モデリングソフトウェアを使用せずに同じ効果を実現できます。例えば、窓の周囲に壁を作成するには、4つの平面またはキューブを組み合わせて作成できます。
ジオメトリにマスクを定義するためにテクスチャを使用することもできます。これには、マテリアルの不透明度にテクスチャを接続する必要があります:
テクスチャでグラデーションの移行を定義できます:
NOTE: Get Aximmetry Videoブループリントノードを使用すると、Aximmetryの動画をUnrealでアニメーションマスクテクスチャとして使用できます。
透明オブジェクト
アルファホールドアウトブレンドモードは、透明オブジェクトをクリップできません。代わりに、アクターの配置に応じて、その前か後ろに突然移行します。
透明オブジェクトのレンダリング順序を決定する方法は複数あります。
例えば、アクターの「Translucency Sort Priority」を-1に設定し、他の透明アクターがTranslucency Sort Priorityを調整していない場合、この設定はシーン内のすべての透明オブジェクトの後ろにAlphaholdoutマスクを配置します:
透過ソート優先度は、透過パスが Before DOF に設定されていないマテリアルでは機能しません。これは、Alpha Holdout マテリアルで使用される同じ設定です。
Unreal での透過処理に関する詳細情報は、Unreal のドキュメントをご参照ください。
マテリアル方法
プロジェクトにマスクの平面をクリップする可能性のある透明オブジェクトが含まれる場合、代替方法が利用可能です。この方法では、これらのオブジェクトのマテリアルにロジックを組み込み、指定された位置範囲内のピクセルを表示しないようにします。
例えば、床面の下のピクセルを隠す必要がある場合、ピクセルのワールド高さ位置値を使用し、床の高さ以下のピクセルを表示しないようにします。この処理は、マテリアルのWorld Positionノードを通じてピクセルの位置にアクセスすることで実現できます。次に、ワールド位置の高さが床の高さよりも低いピクセルの透明度を0に調整する論理を適用します:
NOTE: 上記の論理はハードカットを生成します。ただし、やや複雑な論理を使用することで、ソフトカットやその他の移行効果を実装可能です。
Sky
通常、ARシーンでは背景全体が実世界のカメラの映像であり、人工的な空を表示する必要はありません。そのため、Unreal ARカメラではデフォルトで空は表示されません。
ただし、非常に稀なケースでは、例えば上記の例のように別の世界への窓のような背景の空を表示したい場合があります。
この場合、SM_SkySphere メッシュをスカイマテリアルと組み合わせて使用できます。
SM_SkySphere メッシュは、コンテンツブラウザのEngineフォルダー内にのみ存在します。
NOTE: このアクターオブジェクトにAximmetryARタグを設定する必要があります。
NOTE: HDRIスカイマップもマテリアルとして使用可能です。また、UnrealのHDRI BackdropプラグインはARマスクとも互換性があります。