Table of Contents

AR session を作成して設定する

Unity で AR を使うには、まずシーン内に AR session を作成して設定する必要があります。この記事では、AR session を作成・設定する主な方法を紹介します。通常、作成に成功すると、Hierarchy ビューで次の構造が見えます。

alt text

はじめる前に

  • ARSession の概要 で session の基本概念、構成、ワークフローを理解する。

デフォルト設定の session を作成する

Hierarchy ビューの 空白 部分を右クリックし、メニュー EasyAR Sense > [ AR 機能 ] > AR Session ([ 機能 ] Preset) を使うと、あらかじめ設定された session を作成できます。session には、その機能に適した frame source と frame filter コンポーネントが事前に設定されています。

コードでは ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset, ARSessionFactory.Resources) を使って session を作成できます。

たとえば、EasyAR Sense > Image Tracking > AR Session (Image Tracking Preset) で image tracking 用の session を作成できます。

alt text

対応するコードは次のとおりです。

ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.ImageTracking);

ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilderARSessionFactory.ARSessionPreset.DenseSpatialMapBuilder の preset を使う場合は、resource パラメータも渡す必要があります。たとえば、次のコードは sparse spatial mapping 用の session を作成し、point cloud material を指定します。

ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial });

スクリプトが editor でのみ実行される場合は、editor の default resource も使えます。

ARSessionFactory.CreateSession(ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder, ARSessionFactory.Resources.EditorDefault());

メニュー EasyAR Sense > AR Session (Preset) > ** には利用可能なすべての session preset が並んでおり、参考にできます。

alt text

注記

同じシーンで複数の session を同時に実行すると互いに競合するため、シーン内に有効化された (GameObject.activeInHierarchy == true) session は 1 つだけにしてください。

コンポーネントを追加する

session の frame source と frame filter コンポーネントは、作成後に必要に応じて追加・削除できます。

Hierarchy ビューで AR Session (EasyAR) を選択して右クリックし、メニュー EasyAR Sense > [ AR 機能 ] > ** から、その機能に適した frame source / frame filter コンポーネントを追加できます。

コードでは ARSessionFactory.AddFrameSource<Source>(GameObject, bool) で frame source コンポーネントを追加したり、ARSessionFactory.AddFrameFilter<Filter>(GameObject, ARSessionFactory.Resources) で frame filter コンポーネントを追加したりできます。

たとえば、EasyAR Sense > Image Tracking > Frame Filter : Image Tracker で、選択中の session に新しい image tracker を追加できます。

alt text

対応するコードは次のとおりです。

ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
注意

コンポーネントの追加は assemble 前に完了している必要があります。session が assemble を開始し、assemble 完了後にコンポーネントを追加・削除すると、session は Broken 状態になり、動作しなくなります。

SparseSpatialMapBuilderFrameFilterDenseSpatialMapBuilderFrameFilter を追加する場合は、resource パラメータも渡す必要があります。たとえば、次のコードは sparse spatial mapping 用の SparseSpatialMapBuilderFrameFilter を作成し、point cloud material を指定します。

ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, new ARSessionFactory.Resources { SparseSpatialMapPointCloudMaterial = PointCloudMaterial })

スクリプトが editor でのみ実行される場合は、editor の default resource も使えます。

ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, ARSessionFactory.Resources.EditorDefault());

frame filter を作成した後は、ARSessionFactory.SetupFrameFilters(List<GameObject>, ARSessionFactory.ARSessionPreset) を使って preset に応じて frame filter のパラメータを調整できます。

たとえば、次のコードは session に新しい image tracker を追加し、ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion の preset パラメータで設定します。

var filter = ARSessionFactory.AddFrameFilter<ImageTrackerFrameFilter>(session);
ARSessionFactory.SetupFrameFilters(new() { filter }, ARSessionFactory.ARSessionPreset.ImageTrackingMotionFusion);

メニューから作成する場合は preset に応じたパラメータ調整はできないため、作成後に各コンポーネントの説明に従って設定してください。

コンポーネントを削除する

session からコンポーネントを削除するには、Hierarchy ビューで対象コンポーネントを選択して Delete を押すか、スクリプトで対応するオブジェクトを破棄 (Destroy) します。

注記

コンポーネントの GameObjectSetActive(false) で無効化することは、削除と同じ効果です。

たとえば、session から image tracker を削除するには、Image Tracker を選択して Delete を押します。

alt text

注意

コンポーネントの削除も assemble 前に完了している必要があります。session が assemble を開始し、assemble 完了後にコンポーネントを追加・削除すると、session は Broken 状態になり、動作しなくなります。

コンポーネント順序の影響

session の frame filter 子ノードの並び順は、session の実行には影響しません。

一方、frame source 子ノードの並び順は、assemble 時の frame source 選択順に影響します。transform 順 に並んだ最初の利用可能な frame source だけが、session の実際の frame source として選ばれます。

注記

frame source ノードの順序が有効なのは assemble 前に変更した場合だけです。assemble 後に順序を変えても実行結果には影響しません。

[任意] 自由に session を作成する

デフォルト設定の session では要件を満たせない場合、必要に応じて自由に session を作成・設定することもできます。

メニュー EasyAR Sense > AR Session (Preset) > AR Session (Empty) で、frame source と frame filter を含まない空の session を作成できます。

コードでは ARSessionFactory.CreateSession() を使います。

ARSessionFactory.CreateSession();

その後、実際の要件に応じて適切な frame source と frame filter コンポーネントを追加してください。

たとえば、sparse spatial mapping と dense spatial mapping を含む session を作成したい場合は、次のコードを使えます。

var session = ARSessionFactory.CreateSession();

var group = new GameObject("Frame Source Group");
group.transform.SetParent(session.transform, false);

ARSessionFactory.AddFrameSource<XREALFrameSource>(session);
ARSessionFactory.AddFrameSource<AREngineFrameSource>(session);
ARSessionFactory.AddFrameSource<ARCoreFrameSource>(session);
ARSessionFactory.AddFrameSource<ARCoreARFoundationFrameSource>(session);
ARSessionFactory.AddFrameSource<ARKitFrameSource>(session);
ARSessionFactory.AddFrameSource<ARKitARFoundationFrameSource>(session);
ARSessionFactory.AddFrameSource<VisionOSARKitFrameSource>(session);
ARSessionFactory.AddFrameSource<MotionTrackerFrameSource>(session);

List<GameObject> filters = new();
filters.Add(ARSessionFactory.AddFrameFilter<SparseSpatialMapBuilderFrameFilter>(session, resources));
filters.Add(ARSessionFactory.AddFrameFilter<DenseSpatialMapBuilderFrameFilter>(session, resources));

ARSessionFactory.SetupFrameFilters(filters, ARSessionFactory.ARSessionPreset.SparseSpatialMapBuilder);
ARSessionFactory.SetupFrameFilters(filters, ARSessionFactory.ARSessionPreset.DenseSpatialMapBuilder);

すると、次のような session 構造が作成されます。

alt text

次のステップ

実行制御

コンポーネントと結果へのアクセス

コンポーネントリファレンス

  • ARSession コンポーネントリファレンス