メインコンテンツまでスキップ
バージョン: 1.0.1

空間アンカー

このサンプルでは、現実世界の特定の箇所を正確に追跡するために空間アンカーを作成および破棄する方法を紹介します。

空間アンカーに関する基本的な情報や、AR FoundationのAR Anchor Managerコンポーネントの機能については、Unityのドキュメントを参照してください。

機能の有効化

この機能を使用するには、以下のOpenXRのプロジェクト設定でSpatial Anchorsにチェックする必要があります。
Project Settings > XR Plug-in Management > OpenXR (Androidタブ) alt text

サンプルのインポート

まだサンプルをインポートしていない場合は、以下の手順でインポートすることができます。

  1. 基本パッケージのインポート
  2. 基本サンプルのインポート

サンプルシーンは以下の場所に存在します。
Assets/Samples/Snapdragon Spaces/1.X.X/Core Samples/Scenes/Anchor Sample/Anchor Sample.unity

サンプルの仕組み

シーン内では、アンカーに関するUIパネルがカメラから2メートル先に配置されています。

Place anchor on surfaces (平面にアンカーを配置) トグルを有効にすると、現実世界の平面に対するアンカーの位置を特定するために、毎フレーム頭部の中心から前方にレイが飛ばされます。
ヒットが検出されると、配置されるギズモは黄色に変わります。

スマートフォンのタッチパッドをタップするか、視線インタラクタを選択した場合に表示されるUIパネルで視線を操作すると、空のゲームオブジェクトとARAnchorのゲームオブジェクトがインスタンス化されます。

空のゲームオブジェクトには透明なギズモの3Dモデルがあり、AR Sessionによってトラッキングされます。
ARアンカーのギズモは、ARAnchorManageranchorsChangedイベントによって更新され、トラッキング状態を表します。

    public GameObject GizmoTrackedAnchor;
public GameObject GizmoUntrackedAnchor;

private override void Start() {
FindObjectOfType<ARAnchorManager>().anchorsChanged += OnAnchorsChanged;
}

private void OnAnchorsChanged(ARAnchorsChangedEventArgs args) {
foreach (var anchor in args.added) {
...
}

foreach (var anchor in args.updated) {
Destroy(anchor.transform.GetChild(0).gameObject);
var newGizmo = Instantiate(anchor.trackingState == TrackingState.None ? GizmoUntrackedAnchor : GizmoTrackedAnchor);
newGizmo.transform.SetParent(anchor.transform, false);
}

foreach (var anchor in args.removed) {
...
}
}

全てのアンカーの破壊

alt text 全てのアンカーとギズモは、UIのDestroy All Anchorsを選択することで破壊できます。
削除コマンドは、すべて削除された後に「Select」ボタンでアンカーが作成されるのを防ぐために、遅延を伴って発行されます。

サンプルでのアンカーの保存、削除、読み込み

Save new anchors to local store(新しいアンカーをローカルに保存)のトグルを有効にすると、新しいアンカーが作成されるたびに、そのアンカーはローカルに保存されます。

つまり、シーンにAR Anchor Managerがある限り、この保存されたアンカーは他の通常のアンカーとして再作成され、トラッキングされます。
通常のアンカーと保存されたアンカーを区別するために、アンカーの中心に立方体のメッシュが生成されます。立方体が赤い場合は、保存されたアンカーがトラッキングされていないことを意味し、白い場合はトラッキングされていることを意味します。

Load All Saved Anchorsをクリックすると、ローカルに保存されているすべてのアンカーが読み込まれ、その位置を特定しようとします。一方、Clear Storeをクリックすると、ローカル・ストアに保存されているすべてのアンカーが削除されます。この操作では、ストアからロードされた既存のアンカーは破棄されません。