見出し画像

AR Foundationのサンプル

以下の記事が面白かったので、ざっくり訳してみました。

AR Foundation Samples

1. AR Foundationのサンプル

「AR Foundation 3.0」のサンプルです。
このサンプルは、次の5つのUnityパッケージに依存しています。

ARSubsystems
ARCore XR Plugin
ARKit XR Pligin
ARKit Face Tracking
ARFoundation

「ARSubsystems」はインターフェースを定義し、プラットフォーム固有の実装は「ARCore」「ARKit」パッケージに含まれています。「ARFoundation」は、「ARSubsystems」が提供するARデータを「Unity GameObjects」「MonoBehavours」に変換します。
Unity 2019.2以降と互換性があります。

2. ARKit Face Trackingが別のパッケージになっているのはなぜか?

プライバシー上の理由から、「ARKit Face Tracking」を使用するには、App Storeでアプリを公開するために追加の検証が必要です。アプリケーションバイナリに特定の顔追跡関連シンボルが含まれている場合、アプリは検証に失敗する可能性があります。そのため、この機能は明示的に含める必要がある個別のパッケージとして提供しています。

3. ARKit 3サポート

「ARKit XR Plugin」「ARKit Face Tacking」パッケージは、「ARKit 2」「ARKit 3」の両方を同時にサポートします。個別のライブラリを提供し、ビルド設定で選択したXcodeのバージョンに基づいて適切なライブラリを選択します。これにより、どのパッケージバージョンがどのXcodeバージョンと互換性があるかについての混乱が解消されます。

「ARKit 3」の機能には、「Xcode 11」と「iOS / iPadOS 13」が必要です。

4. AR Foundationのインストール手順

(1) Unity 2019.2以降の最新バージョンをダウンロード。
(2) Unityを開き、「arfoundation-samples」リポジトリのルートにプロジェクトをロード。
(3) 選択したサンプルシーンを開く。
(4) 使用方法や詳細については、「AR Foundation」のドキュメントを参照。

5. サンプル

◎ SimpleAR
これは、ポイントクラウドの視覚化と平面の検出を可能にする優れた開始サンプルです。画面には、「ARSession」を一時停止、再開、リセット、およびリロードできるボタンがあります。

平面が検出されたら、検出された平面をタップして立方体を配置できます。
これは「ARRaycastManager」を使用して、平面に対してレイキャストを実行します。

・Pause : 「ARSession」を一時停止します。これは、デバイスの追跡と追跡可能な検出(プレーン検出など)が一時的に一時停止されることを意味します。一時停止中、「ARSession」はCPUリソースを消費しません。
・Resume : 一時停止したARSessionを再開します。デバイスは再ローカライズを試み、追跡が再確立されると、以前に検出されたオブジェクトが移動する可能性があります。
・Reset : 検出されたすべての追跡可能オブジェクトをクリアし、新しい「ARSession」を開始します。
・Reload : 「ARSession」を完全に破棄し、再インスタンス化します。これは、シーンの切り替え中に発生する可能性のある動作をシミュレートします。

◎ Check Support
ARサポートの確認を示し、結果を画面に記録します。関連するスクリプトは「SupportChecker.cs」です。

◎ LightEstimation
カメラフレームからの光推定情報を示します。画面に「明るさ」「色温度」「色補正」の値が表示されます。ほとんどのデバイスはこれらのサブセットのみをサポートしているため、一部は「使用不可」と表示されます。関連するスクリプトは、「Directional Light」GameObjectにあります。

◎ ReferencePoints
​​レイキャストのヒット結果として参照ポイントを作成する方法を示します。[Clear Reference Points]ボタンは、作成されたすべての参照ポイントを削除します。「ReferencePointCreator.cs」を参照してください。

◎ Scale
ARシーンのコンテンツの見かけのスケールを調整する方法を示します。これは、コンテンツの代わりに「ARSessionOrigin」を移動、回転、およびスケーリングすることによりこれを行います。複雑なシーンは、作成後に移動できないことが多く(例:地形)、スケールは物理学、パーティクル効果、AIナビゲーションなどの他のシステムに悪影響を与える可能性があります。「ARSessionOrigin」のスケール機能は、検出された平面上の位置にコンテンツを「表示」し、たとえば、建物サイズのオブジェクトをテーブルトップミニチュアにスケールする場合に便利です。

このサンプルを使用するには、最初に平面が検出されるまでデバイスを動かしてから、平面をタップします。タッチポイントにコンテンツが表示されます。コンテンツを配置した後、画面上のスライダーを使用してその回転と拡大縮小を調整できます。コンテンツ自体は移動、回転、拡大縮小されないことに注意してください。

関連するスクリプトは「MakeAppearOnPlane.cs」です。

◎ CameraImage
CPUのカメラテクスチャを操作する方法を示しています。パススルーカメラのビデオフィードにはGPUのみのテクスチャが含まれ、CPUでそれらを操作する(たとえば、コンピュータービジョンアルゴリズム用)には、高価なGPU読み取りが必要になります。幸いなことに、「ARFoundation」は、さらに処理するためにCPU上のカメラ画像を取得するためのAPIを提供します。

関連するスクリプトは「TestCameraImage.cs」です。

CPUイメージの解像度は、カメラの構成に影響されます。現在の構成は、サポートされているカメラ構成のいずれかを選択できるドロップダウンボックス内の画面の左下に示されています。 「CameraConfigController.cs」は、カメラ構成の列挙と選択を示します。それは「CameraConfigs」GameObjectにあります。

◎ TogglePlaneDetection
平面検出のオンとオフを切り替える方法を示しています。オフの場合、GameObjectsを無効にすることにより、以前に検出されたすべてのプレーンも非表示にします。「PlaneDetectionController.cs」を参照してください。

◎ PlaneClassification
平面の分類を照会する方法を示しています。一部のデバイスは、平面を「ドア(door)」「座席(seat)」「窓(window)」「床(floor)」などのカテゴリに分類しようとします。このシーンは、「ARPlaneManager」を使用した平面検出を有効にし、平面の分類を表示するコンポーネントを含むプレハブを使用します。分類できない場合は「なし(none)」を使用します。

◎ FeatheredPlanes
平面検出時に、「AIRPlane」の見栄えの良いプレハブを使用しています。正確に定義されたとおりに描画されるのではなく、平面はエッジに向かってフェードアウトします。

◎ PlaneOcclusion
平面検出時に、平面のマテリアルにオクルージョンシェーダーを使用します。これにより、平面は見えなくなりますが、平面の背後の仮想オブジェクトはカリングされます。これにより、オブジェクトをテーブルに配置するときなどに、さらにリアルなレベルが実現します。

平面が検出されるまでデバイスを動かし(エッジがまだ描画されている)、平面をタップしてコンテンツを配置/移動します。

◎ UX
ARアプリケーションを介して新しいユーザーをガイドするときに役立ついくつかのUIを示しています。スクリプト「UIManager.cs」を使用して、イベント(検出されるプレーンなど)に基づいてさまざまなUIアニメーションをトリガーします。

ここで示す機能は、概念的には「ARKitCoachingOverlay」サンプルに似ています。

◎ EnvironmentProbes
環境プローブ、実際の環境から3Dテクスチャを生成し、シーン内の反射プローブに適用しようとする機能を示します。シーンには、完全に黒で始まるいくつかの球体が含まれていますが、可能な場合は実際の環境を反映する光沢のある球体に変わります。

◎ ARWorldMap
「ARWorldMap」は、スキャンされた領域を保存できるARKit固有の機能です。ARKitは、オプションで、保存された世界地図に後で再ローカライズできます。これを使用して、複数のデバイスを共通のスペースに同期したり、博物館の展示やその他の特別な設置など、場所に固有のキュレーションエクスペリエンスを得ることができます。「ARWorldMap」の詳細については、こちらを参照してください。

「ARWorldMap」には、参照ポイントや平面など、ほとんどの種類の追跡可能オブジェクトが保存されます。「ARWorldMapController.cs」は、このサンプルのほとんどのロジックを実行します。

このサンプルには「iOS 12」が必要です。

◎ ARCollaborationData
「ARWorldMap」と同様に、「共同セッション」は、複数のデバイスがセッション情報をリアルタイムで共有できるようにするARKit固有の機能です。各デバイスは定期的に「ARCollaborationData」を生成し、「共同セッション」で他のすべてのデバイスに送信する必要があります。ARKitは、各参加者のポーズとすべての参照ポイントを共有します。検出された平面など、他の種類の追跡可能オブジェクトは共有されません。

「CollaborativeSession.cs」を参照してください。コラボレーションデータには、「クリティカル(Critical)」と「オプション(Optional)」の2種類があることに注意してください。「クリティカル」データは定期的に利用可能であり、他のすべてのデバイスに確実に送信する必要があります。「オプションの」データはほぼすべてのフレームで利用でき、信頼性の低い方法で送信される場合があります。「オプション」としてマークされたデータには、デバイスの位置に関するデータが含まれます。そのため、非常に頻繁に(つまり、すべてのフレームで)生成されます。

「共同セッション」に対するARKitのサポートには、ネットワーキングは含まれません。接続を管理し、共同セッションの他の参加者にデータを送信するのは開発者の責任です。このサンプルでは、「​​AppleのMultipeerConnectivity Framework」を使用しました。実装はこちらにあります。

画面をタップして、基準点を作成できます。タップによってポイントクラウド内のポイントにヒットするレイキャストが発生すると、参照ポイントが作成されます。

このサンプルには「iOS 13」が必要です。

◎ ARKitCoachingOverlay
「ARKitCoachingOverlay」はARKit固有の機能であり、水平面を見つけるなどの「目標」を達成するために特定のアクションを実行するようユーザーをガイドする便利なUIをオーバーレイ表示します。

「ARKitCoachingOverlay」は、自動または手動でアクティブ化でき、目標を設定できます。このサンプルでは、目標を「Any plane」に設定し、それが自動的にアクティブになるようにしました。これにより、平面が見つかるまで特別なUIが画面に表示されます。手動で有効にするボタンもあります。

サンプルには、「ARKitCoachingOverlay」の設定を定義するMonoBehaviorが含まれています。「ARKitCoachingOverlay.cs」を参照してください。

このサンプルには「iOS 13」が必要です。

◎ ImageTracking
画像追跡を示します。画像追跡はARCoreおよびARKitでサポートされています。画像追跡を有効にするには、最初に「XRReferenceImageLibrary」を作成する必要があります。これは、環境内で検索する一連の画像です。
作成手順については、ここをクリックしてください。

実行時に、ARFoundationは検出された各参照画像に対してARTrackedImageを生成します。 このサンプルでは、TrackedImageInfoManager.csスクリプトを使用して、検出された画像の上に元の画像をメタデータとともにオーバーレイします。

ARCoreまたはARKit対応デバイスでサンプルを実行し、Assets / Scenes / ImageTracking / Imagesのいずれかの画像にデバイスを向けます。 それらはコンピューターのモニターに表示できます。 それらを印刷する必要はありません。

◎ ObjectTracking
「ImageTracking」と同様に、このサンプルは「XRReferenceObjectLibrary」の一連の参照オブジェクトから3Dオブジェクトを検出します。作成手順については、こちらを参照してください。このサンプルを使用するには、デバイスが認識できる物理オブジェクトが必要です。

このサンプルには「iOS 12」が必要です。

◎ Face Tracking
さまざまな顔追跡機能を示すサンプルがいくつかあります。ARCore固有のものとARKit固有のものがあります。

・FacePose
最も単純な顔追跡サンプルで、検出された顔のポーズで軸を描画します。このサンプルでは、フロントカメラを使用しています。

・FaceMesh
検出された顔を表すメッシュをインスタンス化し、更新します。デバイスのサポートに関する情報(たとえば、同時に追跡できる顔の数)が画面に表示されます。

このサンプルでは、フロントカメラを使用しています。

・ARKitFaceBlendShapes
「BlendShape」は、ARKit固有の機能であり、0.1のスケールでさまざまな顔の特徴に関する情報を提供します。たとえば、「wink」や「frown」などです。このサンプルでは、「BlendShape」を使用して、検出された顔の上に表示される漫画の顔をパペットします。「ARKitBlendShapeVisualizer.cs」を参照してください。

このサンプルでは、フロントカメラを使用しています。

・ARCoreFaceRegions
「FaceRegion」は、検出された顔の特定の領域、たとえば左眉毛のポーズ情報を提供するARCore固有の機能です。この例では、各顔領域に軸が描かれています。「ARCoreFaceRegionManager.cs」を参照してください。

このサンプルでは、フロントカメラを使用しています。

・EyeLasers, EyePoses, FixationPoint
目と注視点の追跡を示しています。アイトラッキングは、検出された顔の各目のポーズ(位置と回転)を生成し、「注視点」は顔が見ている(つまり注視されている)ポイントです。EyeLasersは、目のポーズを使用して、検出された顔から放射されるレーザービームを描画します。

このサンプルでは、フロントカメラを使用し、「TrueDepthカメラ」を備えたiOSデバイスが必要です。

・RearCameraWithFrontCameraFaceMesh
「iOS 13」は、バックカメラがアクティブなときに顔追跡のサポートを追加します。このサンプルには、現在追跡されている顔の数以外の多くは表示されません。ARFoundationでこのモードを有効にするには、「ARFaceManager」と、バックカメラを必要とする少なくとも1つの他のマネージャーの両方を有効にする必要があります。このサンプルにより、「ARFaceManager」と「ARPlaneManager」の両方でこれを実現できます。

この機能には、「TrueDepthカメラ」と「iOS 13」を実行する「A12 bionic chip」を搭載したデバイスが必要です。

◎ HumanBodyTracking2D
2D空間のボディトラッキングを示しています。人が検出されると、2Dスケルトンが生成されます。「ScreenSpaceJointVisualizer.cs」を参照してください。

このサンプルには、「iOS 13」を実行する「A12 bionic chip」を搭載したデバイスが必要です。

◎ HumanBodyTracking3D
3D空間のボディトラッキングを示しています。人が検出されると、3Dスケルトンが生成されます。「HumanBodyTracker.cs」を参照してください。

このサンプルには、「iOS 13」を実行する「A12 bionic chip」を搭載したデバイスが必要です。

◎ HumanSegmentationImages
検出された人物のステンシルおよび深度テクスチャを生成できる「人物のオクルージョン」を示します。このサンプルは非常に原始的で、単純に生のテクスチャを画面に表示します。現在、より良いサンプルに取り組んでいます。

このサンプルには、「iOS 13」を実行する「A12 bionic chip」を搭載したデバイスが必要です。

◎ AllPointCloudPoints
「AR Default Point Cloud」プレハブのように現在のフレームの特徴点だけでなく、すべての特徴点を経時的に表示します。これは、辞書にすべての特徴点を格納する「ARPointCloudParticleVisualzier」コンポーネントのわずかに変更されたバージョンを使用することによりこれを行います。各特徴点には一意の識別子があるため、保存されている点を検索し、既に存在する場合は辞書内の位置を更新できます。これは、ポイントクラウドポイントのマップ全体を必要とするカスタムソリューション、たとえば、カスタムメッシュ再構築手法の開始点として役立ちます。

このサンプルには2つのUIコンポーネントがあります。
・左下のボタン : 「すべて」のポイントと「現在のフレーム」のポイントだけを視覚化することができます。
・右上のテキスト : 各ポイントクラウド内のポイント数を表示します(ARCoreとARKitには1つしかありません)。


この記事が気に入ったらサポートをしてみませんか?