プレーンの検知
現実世界のプレーンを検知してインタラクトさせることで、より没入感のあるAR体験を生み出す。
プレーン更新のリッスン
IARSession.Run(configuration) を呼び出す時に ARConfiguration.PlaneDetection の値を設定し、ARSessionが検知すべきプレーンのタイプを指定します。
ARSession
は検知されたプレーンをイベントを用いて ARAnchor オブジェクトとして表出させます。各アンカーには AnchorType があり、それによってアンカーがプレーンなのか画像なのかが示されます。
session.AnchorsAdded += OnAnchorsAdded; session.AnchorsUpdated += OnAnchorsUpdated; session.AnchorsMerged += OnAnchorsMerged; session.AnchorsRemoved += OnAnchorsRemoved;
よって、検知されたプレーンアンカーがあるシーンにGameObjectを配置したい時は:
private readonly Dictionary<Guid, GameObject> planeLookup = new Dictionary<Guid, GameObject>(); private void AnchorsAdded(AnchorsArgs args) { foreach (IARPlaneAnchor anchor in args.Anchors) { // If the anchor isn't a plane, don't instantiate a GameObject if (anchor.AnchorType != AnchorType.Plane) continue; // Remember this anchor and its GameObject so we can update its position // if we receive an update. planeLookup.Add(anchor.Identifier, Instantiate(PlanePrefab)); var gameObject = planeLookup[anchor.Identifier]; // Display the plane GameObject in the same position, orientation, and scale as the detected plane gameObject.transform.position = anchor.Transform.ToPosition(); gameObject.transform.rotation = anchor.Transform.ToRotation(); gameObject.transform.localScale = anchor.Extent; } } void AnchorsUpdated(AnchorsArgs args) { foreach (IARPlaneAnchor anchor in args.Anchors) { GameObject gameObject; if (planeLookup.TryGetValue(anchor.Identifier, out gameObject)) { gameObject.transform.position = anchor.Transform.ToPosition(); gameObject.transform.rotation = anchor.Transform.ToRotation(); gameObject.transform.localScale = anchor.Extent; } } }
ARPlaneManagerの使用
planefindingを有効にするプロセスを簡略化できるように、シーンに追加できる マネージャー を用意しています。使用方法についてはARPlaneManagerのAPIリファレンスやコード内コメント、ツールヒントを参照してください。
アンカーの統合
トラッキングしていたプレーンアンカーのうちの2つが、より大きなプレーンの一部であるとわかった時、 ARSession
はそれらを統合します。ただしこの統合はプラットフォームによって処理方法が変わります:
Androidデバイスの場合、
ARSession
が AnchorsMerged イベントを発生させます。iOSデバイスの場合、
ARSession
が AnchorsRemoved を発生させ、さらに AnchorsUpdated イベントを発生させます。AnchorsMerged
は発生しません。
プレーンの分類(iOSのみ)
iOS 12以上を使用しているiPhone XS/XR以降のデバイスでは、平面の分類が可能です。この分類はアンカーの PlaneClassification を通して公開されます。プレーンアンカーの分類が None
の場合、アンカーの PlaneClassificationStatus プロパティで平面を分類できない理由がわかります。どちらの値の更新も AnchorsUpdated イベントを通して公開されます。
Androidおよび非対応のiPhoneにおけるすべてのプレーンアンカーは、 None``の``PlaneClassification
と NotAvailable
の PlaneClassificationStatus
を持っています。