本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。
MRTKv2のGuidesドキュメント
以下のドキュメントを読み進めていきます。
microsoft.github.io
以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io
本記事では以下のページを読み進めます。
microsoft.github.io
コアシステム
入力システムの中心にあるのは MixedRealityInputSystem です。
これは MRTK に関連する全ての入力関連機能の、初期化と操作を担当するサービスです。
このサービスの役割は以下の通りです。
・Input system profile(入力システムプロファイル)の読み取り
・様々なデバイスマネージャー(OpenVR/ Windows Mixed Reality/ Unity Touchなど)を起動します。
インスタンス化されるデバイスマネージャーのセットは Input system profile(入力システムプロファイル)によって構成されます。
・GazeProviderのインスタンス化。これは HoloLens2 の視線情報に加えて、HoloLens1 の視線情報を提供する役割を担うコンポーネントです。
・FocusProviderのインスタンス化。これはフォーカス中のオブジェクトを決定するコンポーネントです。
ポインターとフォーカスのセクションで詳しく説明します。
・全ての入力イベントに登録ポイントを提供します(グローバルリスナーのように)。
・入力イベントにイベントディスパッチ機能を提供します。
注意
本セクションは用語のセクションを読んでおり、基本的な理解を持っていることを前提としています 。
入力イベント
入力イベントは通常、2つの異なるチャネルで発生します。
フォーカスのあるオブジェクト
イベントはフォーカス中のGameObjectに直接送信できます。
例えば、オブジェクトには IMixedRealityTouchHandler を実装するスクリプトが含まれている場合があります。
このオブジェクトは近づけた手でフォーカスされるとタッチイベントを取得します。
これらのタイプのイベントはイベントを処理できる GameObject が見つかるまで GameObject 階層を「上」に進みます。
これは DispatchEventToObjectFocusedByPointer の ExecuteHierarchy を使用して行われます。
グローバルリスナー
イベントはグローバルリスナーに送信できます。
入力システムの IMixedRealityEventSystem インターフェイスを使用して、全ての入力イベントを登録できます。
グローバルイベントの登録には Register Handler メソッドを使用することをお勧めします。
Register 関数により、リスナーは特定の入力イベントだけではなく、全ての入力イベントの通知を受け取るようになります。
受け取るイベントタイプはイベントインターフェイスによって定義されます。
fallback listeners はシーン内の他の場所で処理されなかった全ての入力イベントを受け取ります。
このため、別のタイプのグローバルリスナーであることに注意してください。
microsoft.github.io
イベント発信の順序
一般的に、イベントは次の方法でリスナーに送信されます。
以下の手順のいずれかでイベントを処理済みとしてマークすると、イベントディスパッチプロセスが停止します。
1.イベントはグローバルリスナーに送信されます。
2.イベントは、フォーカスされたオブジェクトのモーダルダイアログに送信されます。
3.イベントはフォーカスされたオブジェクトに送信されます。
4.イベントはフォールバックリスナーに送信されます。
デバイスマネージャー/データプロバイダー
これらのエンティティは低レベルAPI(Windows Mixed Reality API、OpenVR APIなど)とのインターフェースを提供します。
そして、これらのシステムからのデータを MRTK の高レベルの入力抽象に適合するものへと変換します。
デバイスマネージャー/データプロバイダーはコントローラを検出、作成、管理します。
デバイスマネージャの基本的なフローには以下のものが含まれます。
1.デバイスマネージャは入力システムサービスによってインスタンス化されます。
2.デバイスマネージャーは基盤システムの登録を行います。(例えば、Windows Mixed Realityデバイスマネージャーはジェスチャイベントと対話イベントを登録します)
3.基盤システムから検出するコントローラーを作成します。(例えば、プロバイダーは関節のある手の存在を検出できます)
4.Update() ループで UpdateController() を呼び出して、基盤システムの状態をポーリングし、コントローラーの表現を更新します。