MRが楽しい

MRやVRについて学習したことを書き残す

MRTK v2のドキュメントを少しずつ読み解くカメラ設定プロバイダーの作成

本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。

MRTKv2のGuidesドキュメント

以下のドキュメントを読み進めていきます。
microsoft.github.io

以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io

本記事では以下のページを読み進めます。
microsoft.github.io
f:id:bluebirdofoz:20200209220720j:plain

カメラ設定プロバイダーの作成

カメラシステムはプラットフォーム固有のカメラ構成をサポートするための拡張可能なシステムです。
新しいサポートを追加するには、カスタム設定プロバイダーが必要になる場合があります。

この例で使用されるソースコードは MixedRealityToolkit.Staging/UnityARフォルダーにあります。(MRTK 2.2.0現在)
Microsoft.MixedReality.Toolkit.Unity.Providers.UnityAR パッケージをインポートして確認できます。
f:id:bluebirdofoz:20200209220737j:plain

名前空間とフォルダー構造

データプロバイダーは、次の2つの方法のいずれかで配布できます。

サードパーティのアドオン
Microsoft Mixed Reality Toolkitの一部

新しいデータプロバイダーのMRTKへの提出の承認プロセスはケース毎に異なり、提案時に通知されます。
新しい機能要求の issue を作成することにより、提案できます。
github.com

サードパーティのアドオン

名前空間

データプロバイダーには名前の衝突を緩和するための名前空間が必要です。
名前空間には次のコンポーネントを含めることをお勧めします。

・アドオンを作成する会社名
・機能エリア

例えば、Contoso 社が作成したカメラ設定プロバイダーは、「Contoso.MixedReality.Toolkit.Camera」です。

フォルダー構造

次の図に示すようにデータプロバイダーのソースコードを配置することをお勧めします。
f:id:bluebirdofoz:20200209220811j:plain

ContosoCamera フォルダーにデータプロバイダーの実装が含まれている場合、Editor フォルダーにはインスペクターが含まれます。
(およびその他のUnityエディター固有のコード)
Profile フォルダーには、1つ以上の作成済みのプロファイルオブジェクトが含まれています。

MRTKサブミッション

名前空間

カメラ設定プロバイダーを Mixed Reality Toolkit リポジトリに追加する場合、名前空間Microsoft.MixedReality.Toolkitで始まる必要があります。
(例:Microsoft.MixedReality.Toolkit.CameraSystem)

フォルダー構造

全てのコードは MixedRealityToolkit.Providers(例:MixedRealityToolkit.Providers/UnityAR)の下のフォルダーに配置する必要があります。

カメラ設定オブジェクトを定義する

カメラ設定プロバイダーを作成する最初のステップはアプリケーションに提供するデータのタイプ(例:メッシュまたはプレーン)を決定することです。
全ての空間データオブジェクトは、IMixedRealityCameraSettingsProvider インターフェイスを実装する必要があります。

設定プロバイダーを実装する

インターフェイスおよび/または基本クラスの継承を指定する

すべてのカメラ設定プロバイダーは IMixedRealityCameraSettingsProvider インターフェイスを実装する必要があります。
IMixedRealityCameraSettingsProvider インターフェイスはカメラシステムに必要な最小限の機能を指定します。
MRTK には必要な機能のデフォルトの実装を提供する BaseCameraSettingsProvider クラスが含まれています。

namespace namespace Microsoft.MixedReality.Toolkit.Experimental.UnityAR
{
    public class UnityARCameraSettings : BaseCameraSettingsProvider
    { }
}

f:id:bluebirdofoz:20200209220833j:plain

MixedRealityDataProvider属性を適用します

カメラ設定プロバイダーを作成する上で重要な手順は MixedRealityDataProvider クラスに属性を適用することです。
この手順により、カメラシステムのプロファイルで選択された場合、名前、フォルダーパスなどと同様に、データプロバイダーのデフォルトのプロファイルとプラットフォームを設定できます。

[MixedRealityDataProvider(
    typeof(IMixedRealityCameraSystem),
    SupportedPlatforms.Android | SupportedPlatforms.IOS,
    "Unity AR Foundation Camera Settings",
    "UnityAR/Profiles/DefaultUnityARCameraSettingsProfile.asset",
    "MixedRealityToolkit.Providers")]
public class UnityARCameraSettings : BaseCameraSettingsProvider
{ }

IMixedRealityDataProviderメソッドを実装する

クラスが定義されたら、次のステップは IMixedRealityDataProvider インターフェースの実装を行います。

データプロバイダーによって実装されるメソッドは次のとおりです。
・Destroy()
・Disable()
・Enable()
・Initialize()
・Reset()
・Update()

BaseDataProviderクラスは IMixedRealityDataProvider を介して BaseService クラスのための実装の型を提供します。
これらのメソッドの実装内容は一般にデータプロバイダー固有です。

全ての設定プロバイダーがこれら全てのメソッドの実装を必要とするわけではありません。
しかし最小限、Destroy() と Initialize() を実装することをお勧めします。

データプロバイダーロジックを実装する

次の手順では IMixedRealityCameraSettingsProvider を実装して設定プロバイダーのロジックを追加します。
データプロバイダーのこの部分は通常、カメラ構成固有です。

プロファイルとインスペクターを作成する

Mixed Reality Toolkit ではプロファイルを使用してデータプロバイダーを構成します。

プロファイルを定義する

プロファイルの内容には、開発者が選択可能な構成オプションを設定する必要があります。
インターフェイスで定義されたユーザー設定可能なプロパティもプロファイルに含める必要があります。

using UnityEngine.SpatialTracking;

namespace namespace Microsoft.MixedReality.Toolkit.Experimental.UnityAR
{
    [CreateAssetMenu(
        menuName = "Mixed Reality Toolkit/Profiles/Unity AR Camera Settings Profile",
        fileName = "UnityARCameraSettingsProfile",
        order = 100)]
    public class UnityARCameraSettingsProfile : BaseCameraSettingsProfile
    {
        [SerializeField]
        [Tooltip("The portion of the device (ex: color camera) from which to read the pose.")]
        private ArTrackedPose poseSource = TrackedPoseDriver.TrackedPose.ColorCamera;

        /// <summary>
        /// The portion of the device (ex: color camera) from which to read the pose.
        /// 姿勢を読み取るデバイスの部分(例:カラーカメラ)
        /// </summary>
        public ArTrackedPose PoseSource => poseSource;

        [SerializeField]
        [Tooltip("The type of tracking (position and/or rotation) to apply.")]
        private ArTrackingType trackingType = TrackedPoseDriver.TrackingType.RotationAndPosition;

        /// <summary>
        /// The type of tracking (position and/or rotation) to apply.
        /// 適用する追跡のタイプ(位置および/または回転)
        /// </summary>
        public ArTrackingType TrackingType => trackingType;

        [SerializeField]
        [Tooltip("Specifies when (during Update and/or just before rendering) to update the tracking of the pose.")]
        private ArUpdateType updateType = TrackedPoseDriver.UpdateType.UpdateAndBeforeRender;

        /// <summary>
        /// Specifies when (during Update and/or just before rendering) to update the tracking of the pose.
        /// 姿勢の追跡を更新するタイミング(更新中および/またはレンダリング直前)を指定します
        /// </summary>
        public ArUpdateType UpdateType => updateType;
    }
}

f:id:bluebirdofoz:20200209220904j:plain

この CreateAssetMenu 属性をプロファイルクラスに適用すると、ユーザが Create -> Assets -> Mixed Reality Toolkit -> Profiles メニューを使用してプロファイルインスタンスを作成できるようになります。
f:id:bluebirdofoz:20200209220918j:plain

インスペクターを実装する

プロファイルインスペクターはプロファイルコンテンツを構成および表示するためのユーザーインターフェイスです。
各プロファイルインスペクターは BaseMixedRealityToolkitConfigurationProfileInspector クラスを拡張します。

[CustomEditor]属性はインスペクターが適用されるアセットのタイプを Unity に通知します。

namespace namespace Microsoft.MixedReality.Toolkit.Experimental.UnityAR
{
    [CustomEditor(typeof(UnityARCameraSettingsProfile))]
    public class UnityARCameraSettingsProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
    { }
}

f:id:bluebirdofoz:20200209220931j:plain

アセンブリ定義を作成します

Mixed Reality Toolkit はアセンブリ定義(.asmdef)ファイルを使用してコンポーネント間の依存関係を指定することで、Unity がコンパイル時間を短縮するのを支援します。
全てのデータプロバイダーとそのエディターコンポーネント用にアセンブリ定義ファイルを作成することをお勧めします。

例として、UnityAR データプロバイダー用の2つの.asmdefファイルを取り上げます。

最初のアセンブリ定義はデータプロバイダー用です。この例では UnityAR フォルダーに配置されています。
このアセンブリ定義では Microsoft.MixedReality.Toolkit および依存するその他のアセンブリへの依存関係を指定しています。
f:id:bluebirdofoz:20200209220946j:plain

Editor のアセンブリ定義はプロファイルインスペクターとエディター固有のコードを指定します。
このファイルはエディターコードの同フォルダーに配置する必要があります。
この例では Editor フォルダーに配置されています。
このアセンブリ定義には次の参照が含まれます。
Microsoft.MixedReality.Toolkit
Microsoft.MixedReality.Toolkit.Editor.Inspectors
Microsoft.MixedReality.Toolkit.Editor.Utilities
Microsoft.MixedReality.Toolkit.Providers.UnityAR
f:id:bluebirdofoz:20200209221007j:plain

データプロバイダーを登録する

作成したデータプロバイダーをカメラシステムに登録して、アプリケーションで使用できます。
f:id:bluebirdofoz:20200209221018j:plain

パッケージングと配布

サードパーティコンポーネントとして配布されるデータプロバイダーは、パッケージ化と配布の方法を開発者が選択できます。
おそらく最も一般的なソリューションは .unitypackage を生成して Unity Asset Storeを 介して配布することです。

データプロバイダーが Microsoft Mixed Reality Toolkit パッケージの一部として受け入れられた場合、Microsoft MRTKチームはそれをMRTKオファリングの一部としてパッケージ化して配布します。