空間アンカー
このサンプルでは、現実世界の特定の箇所を正確に追跡するために空間アンカーを作成および破棄する方法を紹介します。
空間アンカーに関する基本的な情報や、AR FoundationのAR Anchor Manager
コンポーネントの機能については、Unityのドキュメントを参照してください。
機能の有効化
この機能を使用するには、以下のOpenXRのプロジェクト設定でSpatial Anchorsにチェックする必要があります。
Project Settings > XR Plug-in Management > OpenXR (Androidタブ)
サンプルのインポート
まだサンプルをインポートしていない場合は、以下の手順でインポートすることができます。
サンプルシーンは以下の場所に存在します。
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アンカーのギズモは、ARAnchorManager
のanchorsChanged
イベントによって更新され、トラッキング状態を表します。
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) {
...
}
}
全てのアンカーの破壊
全てのアンカーとギズモは、UIのDestroy All Anchors
を選択することで破壊できます。
削除コマンドは、すべて削除された後に「Select」ボタンでアンカーが作成されるのを防ぐために、遅延を伴って発行されます。
サンプルでのアンカーの保存、削除、読み込み
Save new anchors to local store
(新しいアンカーをローカルに保存)のトグルを 有効にすると、新しいアンカーが作成されるたびに、そのアンカーはローカルに保存されます。
つまり、シーンにAR Anchor Manager
がある限り、この保存されたアンカーは他の通常のアンカーとして再作成され、トラッキングされます。
通常のアンカーと保存されたアンカーを区別するために、アンカーの中心に立方体のメッシュが生成されます。立方体が赤い場合は、保存されたアンカーがトラッキングされていないことを意味し、白い場合はトラッキングされていることを意味します。
Load All Saved Anchors
をクリックすると、ローカルに保存されているすべてのアンカーが読み込まれ、その位置を特定しようとします。一方、Clear Store
をクリックすると、ローカル・ストアに保存されているすべてのアンカーが削除されます。この操作では、ストアからロードされた既存のアンカーは破棄されません。