Unity AR Foundation は Google AR Core と Apple ARKit を Unity上で統合して、マルチプラットフォームで ARアプリを開発できるフレームワーク です。
Unityは AR Foundationを簡単に理解できるように、いくつものシーンを含んだサンプルプロジェクトをGitHubにあげています。
そのサンプルの中の ARで一般的な機能、マーカーの認識とトラッキングの機能サンプル「ImageTracking」の使用法を前回から紹介しています。
【Unity AR Foundation のサンプルを試してみた(ImageTracking)Part.1】
今回はその応用編として、マーカー画像や表示画像を変更したり、3Dモデルをマーカー位置に表示させたりしてみます。


【表示イメージの変更】
サンプルのデフォルトでは登録されたマーカー画像自体をマーカーに重ねて AR表示する作りとなっています。
その表示する画像をマーカー画像とは別に、自分の好きな画像に変えてみましょう。
上記した TrackedImageInfoManagerクラスの UpdateInfoメソッド内で画像を内で AR表示する部分を他の画像に変更します。
以下のように変更してみました。

すると、以下のような感じで表示されます。
【3Dモデルを表示】
次に、マーカーの位置に3Dモデルを表示してみます。ARでよくあるパターンかと思います。
また TrackedImageInfoManagerクラスの UpdateInfoメソッドの画像を AR表示するあたりに、3Dモデルの表示を追加します。
以下のように変更してみました。

すると、以下のような感じで表示されます。
Unityは AR Foundationを簡単に理解できるように、いくつものシーンを含んだサンプルプロジェクトをGitHubにあげています。
そのサンプルの中の ARで一般的な機能、マーカーの認識とトラッキングの機能サンプル「ImageTracking」の使用法を前回から紹介しています。
【Unity AR Foundation のサンプルを試してみた(ImageTracking)Part.1】
今回はその応用編として、マーカー画像や表示画像を変更したり、3Dモデルをマーカー位置に表示させたりしてみます。

【マーカー画像の変更】
最も簡単な方法として Reference Image Library の登録済みの Imageを直接変更してみます。
Reference Image Library とはこのアプリで使用するマーカーのライブラリです。
本サンプルでは、Projectビュー内の Assets > Scenes > ImageTracking > Images フォルダ配下にある「ReferenceImageLibrary」ファイルがそれにあたります。

それをクリックすると、Inspectorビュー上にライブラリの中身が表示されます。デフォルトで3つの画像が登録されています。
その画像を1つ直接変更します。

そして、再ビルドしてデバイスにインストールすると、もうその画像がマーカーとして使えます。

最も簡単な方法として Reference Image Library の登録済みの Imageを直接変更してみます。
Reference Image Library とはこのアプリで使用するマーカーのライブラリです。
本サンプルでは、Projectビュー内の Assets > Scenes > ImageTracking > Images フォルダ配下にある「ReferenceImageLibrary」ファイルがそれにあたります。

それをクリックすると、Inspectorビュー上にライブラリの中身が表示されます。デフォルトで3つの画像が登録されています。
その画像を1つ直接変更します。

そして、再ビルドしてデバイスにインストールすると、もうその画像がマーカーとして使えます。

【Reference Image Libraryを作成】
次に、「Reference Image Library」自体を自分で作ってみます。
Projectビューより Create > XR > Reference Image Library をクリックして Reference Image Library を新規作成します。

すると空の Reference Image Library が Projectビュー上にできますので、それをクリックしてInspectorビュー上から「Add Image」ボタンでマーカー画像を追加していきます。

[Reference Image Library の設定項目]
Name:実行時に利用可能な名前。同名チェックはされない。
Specify Size:現実世界の大きさ。設定しなくても良い。外部からこの値を使用する場合は設定する。幅か高さのどちらかを入れると、画像のアスペクト比からもう一方が自動計算される。
Keep Texture at Runtime:Texture自体を実行ファイルに含めるかどうか。何かに使う場合は含める。含めない方が、当然ファイルサイズは小さくなる。

最後に、その新規作成した Reference Image Library を AR Session Originオブジェクトの AR Tracked Image Manager コンポーネントにある Serialized Libraryにアタッチすれば、マーカーとして使用可能です。

次に、「Reference Image Library」自体を自分で作ってみます。
Projectビューより Create > XR > Reference Image Library をクリックして Reference Image Library を新規作成します。

すると空の Reference Image Library が Projectビュー上にできますので、それをクリックしてInspectorビュー上から「Add Image」ボタンでマーカー画像を追加していきます。

[Reference Image Library の設定項目]
Name:実行時に利用可能な名前。同名チェックはされない。
Specify Size:現実世界の大きさ。設定しなくても良い。外部からこの値を使用する場合は設定する。幅か高さのどちらかを入れると、画像のアスペクト比からもう一方が自動計算される。
Keep Texture at Runtime:Texture自体を実行ファイルに含めるかどうか。何かに使う場合は含める。含めない方が、当然ファイルサイズは小さくなる。

最後に、その新規作成した Reference Image Library を AR Session Originオブジェクトの AR Tracked Image Manager コンポーネントにある Serialized Libraryにアタッチすれば、マーカーとして使用可能です。

新しい Reference Image Libraryを試してみます。Merlionのアイコンのみを登録して、サンプルにあった Unityのロゴは登録していないので、新しい Reference Image Libraryが使われていることが確認できます。

【表示ロジックの説明】
表示関連で重要となるのが、Session Spaceと言う ARの座標と Unity Space:Unityの座標の変換を行う AR Session Originクラスが付いた AR Session Origin オブジェクト。
ここには、Image Tracking で重要となる「AR Tacked Image Manager」と「Tacked Image Info Manager」がアタッチされています。
これらを利用して画像やオブジェクトを AR表示するのに必要となるのが「Tacked Image Info Manager」クラス 内の UpdateInfoメソッドです。

表示の仕組み:
毎フレーム ARTrackedImageの追加・更新・削除に関する情報と共に、ARTrackedImageManagerクラスの trackedImagesChangedが呼び出される。
その際に、TrackedImageInfoManagerクラスの OnTrackedImagesChangedメソッドが呼び出され、そこから TrackedImageInfoManagerクラスの UpdateInfoメソッドがコールされる。
この UpdateInfoメソッドが画像情報の表示や画像自体の表示を行っている。

【表示ロジックの説明】
表示関連で重要となるのが、Session Spaceと言う ARの座標と Unity Space:Unityの座標の変換を行う AR Session Originクラスが付いた AR Session Origin オブジェクト。
ここには、Image Tracking で重要となる「AR Tacked Image Manager」と「Tacked Image Info Manager」がアタッチされています。
これらを利用して画像やオブジェクトを AR表示するのに必要となるのが「Tacked Image Info Manager」クラス 内の UpdateInfoメソッドです。

表示の仕組み:
毎フレーム ARTrackedImageの追加・更新・削除に関する情報と共に、ARTrackedImageManagerクラスの trackedImagesChangedが呼び出される。
その際に、TrackedImageInfoManagerクラスの OnTrackedImagesChangedメソッドが呼び出され、そこから TrackedImageInfoManagerクラスの UpdateInfoメソッドがコールされる。
この UpdateInfoメソッドが画像情報の表示や画像自体の表示を行っている。

【表示イメージの変更】
サンプルのデフォルトでは登録されたマーカー画像自体をマーカーに重ねて AR表示する作りとなっています。
その表示する画像をマーカー画像とは別に、自分の好きな画像に変えてみましょう。
上記した TrackedImageInfoManagerクラスの UpdateInfoメソッド内で画像を内で AR表示する部分を他の画像に変更します。
以下のように変更してみました。

public Texture targetTexture; material.mainTexture =
(trackedImage.referenceImage.texture == null) ? defaultTexture : targetTexture;
すると、以下のような感じで表示されます。

【3Dモデルを表示】
次に、マーカーの位置に3Dモデルを表示してみます。ARでよくあるパターンかと思います。
また TrackedImageInfoManagerクラスの UpdateInfoメソッドの画像を AR表示するあたりに、3Dモデルの表示を追加します。
以下のように変更してみました。

public GameObject targetPrefab; private GameObject instantiatedGO; if (instantiatedGO == null) instantiatedGO =
Instantiate(targetPrefab, planeGo.transform.position, Quaternion.identity);
すると、以下のような感じで表示されます。
Sponsored Link