【UE4】ARコンテンツを作る際の手順やTips


本記事は Unreal Engine 4 (UE4) Advent Calendar 2020 20日目の記事 です。

はじめに

本記事では UE4 でARコンテンツを作る手順や各種機能についての記事になります。

公式で対応しているARプラットフォームとしては ARCoreARKit がメインですが、本記事では ARKit 寄りの内容が多めです。
また、内容によって異なりますが、UE4.24~UE4.26 の範囲のバージョンの内容になります。



クイックスタート

一から作る場合はテンプレートから作成するだけで実機で動作確認できます。

f:id:shuntaendo:20201218161037p:plain:w400


既存のプロジェクトでAR機能を使う場合は以下の手順でセットアップを行います。

1.プラグインの有効化
ARCore もしくは ARKit のプラグインを有効化します。

f:id:shuntaendo:20201218161634p:plain:w300

f:id:shuntaendo:20201218161708p:plain:w300


2.ARSessionConfig の作成
"コンテンツブラウザを右クリック → Miscellaneous → Data Asset → ARSessionConfig" からアセットを作成します。

f:id:shuntaendo:20201218165824p:plain:w400


3.パラメータ設定
ARSessionConfig のパラメータを設定します。
ここのパラメータによって AR 機能全般の挙動が変わります。基本的には "AR Settings" の項目を主に設定していきます。


4.AR機能の開始
StartARSession ノードに2,3で作成した ARSessionConfig アセットを指定して、実行するとAR機能が有効になります。

f:id:shuntaendo:20201218180227p:plain:w200





ラッキング済みジオメトリの取得、表示

以下のノードでトラッキング済みのジオメトリ、特徴点を取得できます。

f:id:shuntaendo:20201219100532p:plain:w500


ジオメトリにはいくつか種類があり、特定の種類のジオメトリだけ取得できるノードもあります。
UE4.25 以前では種類ごとにノードが分かれていました。

f:id:shuntaendo:20201219100727p:plain:w400


ラッキング時の通知イベントを使う

"AR Trackable Notify" コンポーネントから各トラッキング時のイベントを取得できます。

f:id:shuntaendo:20201219125644p:plain:w800






マーカー読み込み

ARCore, ARKit はマーカーレスのARプラットフォームですが、画像検出機能でマーカーを利用することも可能です。

1.マーカー画像の用意
通常の画像と同じようにエディタ内にテクスチャアセットとしてインポートします。


2.ARCandinateImage の作成
"コンテンツブラウザを右クリック → Miscellaneous → Data Asset → ARCandinateImage" からアセットを作成します。

f:id:shuntaendo:20201218203605p:plain:w400


3.テクスチャ情報の登録
ARCandinateImage のパラメータを設定します。
1でインポートしたテクスチャを指定し、Friendly Name(任意の名前)と現実の縦幅・横幅(cm)を設定します。
Orientation(縦長か横長か)は自動的に設定されます。

f:id:shuntaendo:20201219095700p:plain:w500


4.ARSessionConfig に登録
Candidate Images のリストに2で作成した ARCandidateImageアセットを登録します。
UE4.26 では "Image Tracking" の項目から設定します。

f:id:shuntaendo:20201219101933p:plain:w600


5.トラッキングしたマーカー情報の取得
以下のような形でトラッキングしたマーカーの位置・角度、元のテクスチャ情報などを取得できます。

f:id:shuntaendo:20201219104547p:plain:w600


実際に動かしてみたものです。
5の情報を使ってトラッキングしたマーカーの位置にグレーマンをスポーンして Friendly Name でアニメーションを変更しています。


動的にマーカー情報の追加

"AddRuntimeCandidateImage" ノードで動的にマーカー情報を ARSessionConfig に登録できます。

f:id:shuntaendo:20201219105251p:plain:w300




カメラ映像をテクスチャとして取り込む

端末のカメラ映像をテクスチャとして取り込むことが可能です。
メッシュに貼り付けてオクルージョンとして使ったり、テクスチャの色情報から現実に合わせたパーティクルを発生させたりと様々な表現に使えそうです。

1.マテリアルを用意する
取り込んだテクスチャを貼り付けるだけの簡易的な内容のマテリアルです。
現実に合うようにマッピングしてくれる "Map AR Passthrough Camera UVs" というノードが用意されているのでテクスチャノードに繋ぎます。

f:id:shuntaendo:20201219172906p:plain:w500


2.テクスチャを取得
メッシュに貼り付ける想定でノードを組みました。
"GetCameraImage"ノードを使うだけでテクスチャを取得できます。1で用意した "CameraImage" パラメータに設定してます。

f:id:shuntaendo:20201219173606p:plain:w800




People Occlusion

基本的に現代の AR では端末のカメラから取り込んでいる現実映像の上に仮想コンテンツを乗せるのが一般的ですが、
ARKit 3 から追加された People Occlusion を使うと、人体の形を認識して仮想コンテンツを人体部分だけ遮蔽することができます。


実装はとても簡単で ARSessionConfig を以下のように設定するだけです。

Use Person Segmentation for Occlusion:有効
Enable Session Tracking Feature:Person Segmentation with Depth

f:id:shuntaendo:20201218133814p:plain:w500

注意点

People Occlusion は ARKit3 から追加された機能のため、ARKit3 に対応した端末でのみ動作します。

また、UE4.25 ではエンジン内のバグで表示が正しくありません。
こちらは UE4.26.1 で修正予定だそうです。投稿時点でこちらの機能を使う場合は UE4.24 以前のバージョンを使うか、エンジンを改造する必要があります。




まとめ

まだまだ書ききれていない機能がたくさんあるので随時追加していこうと思います。
また、実はメインで書きたかったこととしては『LiDAR Scanを使ったオクルージョン』を実装してプラグインとして公開しようというものでした。(書けなくて悔しい。。)
こちらも後日書きたいと思います。

UE4 の AR 機能周りはアップデートによって挙動が変わりやすい部分でもあり情報がまだまだ足りていないと思っているので自分も積極的に発信していきたいと思います。(UE4.26のアップデートでも結構変わっていました。。)