プレーンの検知

現実世界のプレーンを検知してインタラクトさせることで、より没入感のある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デバイスの場合、 ARSessionAnchorsMerged イベントを発生させます。

  • iOSデバイスの場合、 ARSessionAnchorsRemoved を発生させ、さらに AnchorsUpdated イベントを発生させます。 AnchorsMerged は発生しません。

プレーンの分類(iOSのみ)

iOS 12以上を使用しているiPhone XS/XR以降のデバイスでは、平面の分類が可能です。この分類はアンカーの PlaneClassification を通して公開されます。プレーンアンカーの分類が None の場合、アンカーの PlaneClassificationStatus プロパティで平面を分類できない理由がわかります。どちらの値の更新も AnchorsUpdated イベントを通して公開されます。

Androidおよび非対応のiPhoneにおけるすべてのプレーンアンカーは、 None``の``PlaneClassificationNotAvailablePlaneClassificationStatus を持っています。