Unity AR開発メモ(AR Foundation)
最終更新日:2022年02月21日記事作成日:2022年02月21日
AR Foundationの簡単な使用方法と、iOS(ARKit)とAndroid(ARCode)それぞれで使用できる機能についてメモしています。書きかけです。
更新履歴
(2022年2月21日)とりあえずページ作成
AR Foundationについて
Unityの公式パッケージであるAR Foundationを使用すると、GoogleのARCoreやAppleのARKitを使用したARアプリを作成できます。
AR Foundationを使ってAndroidで最低限のARアプリをビルドする手順は以下のようになります。
- 3Dテンプレートで新規プロジェクトを作成
- Build SettingsでPlatformをAndroidに変更
- Window > Package Managerを開き、左上のPackagesをUnity RegistryにしてAR Foundationをインストール
- Project Settings > XR Plug-in ManagementでARCoreにチェックを入れる
- Hierarchyを右クリックしてXR > AR Sessionと、XR > XR OriginまたはXR > AR Session Originを配置、Main Cameraを削除
- 座標(0, 0, 1)あたりに適当なオブジェクトを配置
- Build And Runする(適宜エラーに対処)
- Project Settings > PlayerでAndroidのMinimum API Levelを27にする
- Auto Graphics APIのチェックをはずしてVulkanを削除する
また、サンプルプロジェクトとしてUnity公式のAR Foundation Samplesリポジトリに多数のサンプルが入っており、これをcloneしてAndroidおよびiPhoneでビルドして実行してみたり、開発するアプリのベースにするのが手っ取り早いです。
以下、ARCoreとARKitそれぞれで使用できる機能について、機能ごとにAR Foundation Samplesのサンプルを整理してみました。
AndroidとiOS両方で使用できる機能
平面検知
床や壁、テーブル等の平面を検知できます。Plane Detectionボタンのところに、平面を検知して表示をオン・オフするToggle Plane Detectionサンプル、ドットで平面を見栄え良く(?)表示するFeathered Planesサンプルが入っています。
また、検知した平面にオクルージョンシェーダーを使用してARオブジェクトを遮蔽するPlane Occlusionサンプルがあります。タップするとランダムでキューブを配置します。
特徴点の検知
SimpleARサンプルがポイントクラウドと平面検知のシンプルなサンプルになっています。タップするとARRaycastManagerでレイキャストして床にキューブが配置されます。
空間アンカー
Anchorsサンプルがタップで空間アンカーを作成するサンプルになっています。
2D画像トラッキング
あらかじめ作成・登録した画像や、実行時に追加した画像をいわゆるARマーカーとしてトラッキングできます。
BasicImageTrackingサンプルが画像トラッキングのサンプルで、検知したARTrackedImageに元画像をオーバーレイ表示します。
光源推定
ARオブジェクトに現実に近い光源を適用してなじませることができます。
Light Estimationボタンのところに、カメラ画像からシンプルなAmbient IntensityとAmbient Colorを推定するBasicLightEstimationサンプルと、光源の方向や色、ルーメン等(iOSのみ)を推定するHDRLightEstimationサンプルが入っています。
リフレクションプローブの取得
ARオブジェクトに現実に近い反射を適用することができます。
EnvironmentProbesサンプルでリフレクションプローブを取得しています。
深度イメージの取得
Depthボタンのところに、一部のAndroidデバイスとLiDAR搭載のiOSデバイスで深度イメージを取得するDepthImagesサンプルと、深度イメージを使用してARオブジェクトのオクルージョンを行うSimpleOcclusionサンプルがあります。
また、RGBや深度等のイメージを取得してCPUで処理できるようにするCpuImagesサンプルがあります。
ARサポートのチェック
Check Supportサンプルの要領でチェックできます。SupportChecker.csを参照。
XR Interaction Toolkitの使用
InteractionサンプルがXR Interaction Toolkitを使用したデモになっています。タップでキューブを生成して、さらにタップで選択、ドラッグを動かしたりできます。
iOS(ARKit)で使用できる機能
ARKitのガイドUI表示
ARKitCoachingOverlayサンプルで、ARKitの「iPhoneを動かしてください」といったメッセージを表示しています。
顔・表情トラッキング
顔の位置に座標軸を表示するFacePoseサンプル、顔メッシュを表示するFaceMeshサンプルがあります。
「パーフェクトシンク」として知られる顔のブレンドシェイプパラメーター多数が取得できます。ARKitFaceBlendShapesサンプルです。
視線方向を取得するEyeLasersサンプル、目の姿勢を取得するEyePosesサンプル、注視点を取得するFixationPointサンプルがあります。
ボディートラッキング
背面カメラを使用して2Dスクリーン空間でトラッキングするHumanBodyTracking2Dサンプルと、3Dワールド空間でトラッキングするHumanBodyTracking3Dサンプルがあります。A12 Bionic以上のデバイスが必要です。
ヒューマンセグメンテーション
CpuImagesサンプルでhuman stencil buffersを取得できるようです。
平面の分類
検知した平面を壁や床等に分類できます。PlaneClassificationサンプルです。
空間のメッシング
空間のメッシュを構築します。LiDARが必要です。メッシュを通常のオーバーレイ表示するNormalMeshesサンプル、メッシュの機能を分類するClassificationMeshesサンプル、構築したメッシュでオクルージョンを行うOcclusionMeshesサンプルがあります。
タップするとボールが飛び、メッシュに衝突して物理的に動きます。
ARWorldMap
空間のトラッキング情報をセーブして、同じデバイスや異なるデバイスで読み込んで位置合わせする(リローカライズする)ことができます。複数のデバイスで同じ位置にARオブジェクトを表示したり、美術館の展示などロケーションベースな体験を提供したりするのに使用します。AR World Mapサンプルと、AppleのARWorldMapを参照。
ARCollaborationData
複数のデバイスでリアルタイムにARセッションを共有できます。各デバイスは定期的にARCollaborationDataを他のすべてのデバイスに送信する必要があります。ARKitはそれぞれの参加者の姿勢と参照点を共有して、検知した平面等は共有しません。
低頻度でreliableに送る必要がある「Critical」メッセージと、高頻度でunreliableに送る「Optional」メッセージがあります。Optionalに端末の姿勢が含まれます。ネットワーク通信にはAppleのMultipeerConnectivity Frameworkを使用しており、Assets/Scripts/MultipeerにUnityの実装があるとのことです。
ARGeoAnchor
ARGeoAnchorはAR体験で参照できる緯度・経度・高度を用いたアンカーで、AR Foundationでまだサポートされていないものの、ネイティブコード(Objective-C)で利用しているARKitGeoAnchorsサンプルがあります。
3Dオブジェクトトラッキング
Object Trackingサンプルがあります。
Android(ARCore)で使用できる機能
顔・表情トラッキング
眉など顔の領域ごとの姿勢を取得できます。ARCoreFaceRegionsサンプルです。
Google Cloud Anchors API
プライバシーポリシー
ARCoreを使用しているアプリは下記ページの内容に従ってプライバシーポリシーを表示する必要があります。
以下φ(..)メモメモ中