【Unity】Apple Vision Proで画像マーカーによるAR
Unity Polyspatialを使用したApple Vision Pro向けアプリで画像マーカーを使用したARをおこなう場合、iOSやAndroidのときと同じようにARFoundationのARTrackedImageManager
コンポーネントを使用します。
Projectウィンドウで右クリックCreate > XR > Reference Image Library
によりXRReferenceImageLibrary
アセットを作成し、マーカーとして使用する画像を登録します。PolyspatialではSpecify Size
で実寸値の入力が必須となっています。
次にHierarchyウィンドウで右クリックXR > XR Origin (Mobile AR)
でXR Origin
オブジェクトを作成し、このオブジェクトにAdd Component
からARTrackedImageManager
コンポーネントを追加します。ARTrackedImageManager
コンポーネントのSerialized Library
プロパティに先ほど作成したXRReferenceImageLibrary
を設定します。
画像マーカーを検出したときに表示したいオブジェクトがある場合、Tracked Image Prefab
プロパティに表示したいオブジェクトのプレハブを登録します。スクリプトで処理したい場合は以下のようにtrackableChanged
プロパティを利用します。
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class ImageTrackingSample : MonoBehaviour
{
[SerializeField] ARTrackedImageManager trackedImageManager;
void OnEnable()
{
trackedImageManager.trackablesChanged.AddListener(HandleTrackedImagesChanged);
}
void OnDisable()
{
trackedImageManager.trackablesChanged.RemoveListener(HandleTrackedImagesChanged);
}
void HandleTrackedImagesChanged(ARTrackablesChangedEventArgs<ARTrackedImage> eventArgs)
{
foreach (var added in eventArgs.added)
{
Debug.Log($"Added: {added.referenceImage.name}");
}
foreach (var updated in eventArgs.updated)
{
Debug.Log($"Updated: {updated.referenceImage.name}, Tracking State: {updated.trackingState}");
}
foreach (var removed in eventArgs.removed)
{
Debug.Log($"Removed: {removed.Value.referenceImage.name}");
}
}
}
画像トラッキングはvisionOSのWorld Trackingとは連動していないようで、ARAnchorManager
コンポーネントを用いたAnchorトラッキングと比べて位置合わせの精度が落ち、位置の補正も1秒に1回程度しか行われないのでカクついたような挙動になります。ただし、画像マーカーから離れたり視線を外したりしてARTrackedImage
のtrackingState
がLimited
になるとWorld Trackingによる位置合わせになるようです。
ARTrackedImageManager
コンポーネントにはMax Number Of Moving Images
という動く画像マーカーに対応するためのプロパティがありますが、Apple Vision Proは動く画像マーカーには対応していないようで、値を変えても挙動は変わりません。
ARTrackedImageManager
はカクついたような表示となるので、画像マーカーをもとにしたARをしたい場合、ARAnchorManager
と組み合わせて画像マーカーを認識したらWorld Anchorを同じ場所に配置してアンカーにより位置合わせしたほうが良い結果になるかもしれません。
Discussion