本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。
MRTKv2のGuidesドキュメント
以下のドキュメントを読み進めていきます。
microsoft.github.io
以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io
本記事では以下のページを読み進めます。
microsoft.github.io
Input System (入力システム)
入力システムは、MRTK が提供する機能の中でもっとも大きいのシステムの1つです。
ツールキット内の多くのものがその上に構築されます。(ポインター、フォーカス、プレハブなど)
入力システムはプラットフォーム間での掴みや回転などの自然なインタラクションを可能にします。
入力システムにはいくつかの独自に定義された用語があります。
データプロバイダー
Input Profile の入力設定にはデータプロバイダーと呼ばれるエンティティへの参照があります。
データプロバイダーはデバイスマネージャーとも呼ばれます。
特定のシステムとのインターフェイスとなって MRTK の入力システムを拡張することを目的とします。
プロバイダーの例として、Windows Mixed Reality プロバイダーがあります。
その役割は Windows Mixed Reality APIと通信し、それらのAPIからのデータを MRTK の入力に変換することです。
その他、OpenVR API の Unity の抽象クラスと通信する OpenVR プロバイダーなどがあります。
コントローラー
物理コントローラーの表現を行います。
例えば、6DoFコントローラー、HoloLens1スタイルのゲーズジェスチャー、関節のある手、リープモーションコントローラーなどです。
コントローラーはデバイスマネージャによって生成されます。
例えば、WMR デバイスマネージャは関節のある手の存在を確認すると、コントローラを生成して管理します。
ポインター
コントローラーはポインターを使用してゲームオブジェクトとやり取りします。
例えば、Near Interaction ポインターは手(コントローラー)が「Near Interaction」をサポートしているオブジェクトに近づいたことを検出します。
その他、teleportation または far ポインター(シェルハンドレイポインター)などのポインターがあります。
これらはユーザーの腕の長さよりも遠いコンテンツを操作するため、遠距離のレイキャストを使用します。
ポインタはデバイスマネージャーによって作成され、入力ソースに設定されます。
コントローラのすべてのポインターを取得するには以下のコードを利用します。
controller.InputSource.Pointers
コントローラーには同時に、複数の異なるポインターを関連付けることができる点に注意してください。
混乱の原因とならないように、どのポインターをアクティブにするかを制御するポインターメディエーターがあります
例えば、メディエーターは「Near Interaction」が検出された場合、「Far Interaction」のポインターを無効にします。
フォーカス
ポインターイベントは、フォーカスによってオブジェクトに送信されます。
フォーカスのアタリ判定はポインターの種類によって異なります。
例えば「hand ray」ポインターは「RayCast」を使用し、「poke」ポインターは「SphereCast」を使用します。
オブジェクトはフォーカスを受け取るために IMixedRealityFocusHandler を実装する必要があります。
オブジェクトをグローバルに登録して、フィルター処理されていないポインターイベントを受け取ることは可能です。
しかし、この方法は推奨されません。
どのオブジェクトがフォーカスされているかを更新するコンポーネントは「FocusProvider」です
カーソル
ポインターと関連付けられたエンティティで、ポインターインタラクションの周りに視覚効果を追加します。
例えば、FingerCursor は指の周りにリングをレンダリングし、「near interactable」オブジェクトに指を近づけるとリングを回転させます。
ポインターは1つのカーソルに関連付けることができます。
インタラクションとマニピュレーション
オブジェクトは「interaction」または「manipulation」スクリプトでタグ付けできます。
これは Interactable または NearInteractionGrabbable / ManipulationHandler などを介します。
例えば、NearInteractionGrabbable および NearInteractionTouchable を使用すると、特定のポインター(特に「near interaction」ポインターなど)で、どのオブジェクトにフォーカスできるかを知ることができます。
Interactable および ManipulationHandler はポインターイベントを受け取ってUIビジュアルを変更したり、ゲームオブジェクトを移動/回転/拡縮したりするコンポーネントの一例です。
全体像
図内の翻訳
・Interactable
Interactableは、フォーカスの開始/終了などの入力イベントをリッスンするUXコンポーネントです。
開始/終了を受け取り、これらのイベント(Interactable.cs)に応じて視覚状態を更新します
・Cursor
ポインターと関連付けられたエンティティで、ポインターインタラクションの周りに視覚効果を追加します。
・Focus
ポインターのイベントはフォーカス中のオブジェクトに関連付けられます。
・Pointer
データプロバイダー(デバイスマネージャー)は特定の方法で他のゲームオブジェクトと対話するためのポインターを作成します。
複数のポインターが存在する可能性があります。
ポインターメディエーターは各ポインターの状態に基づいて、アクティブにするポインターを決定します。
例えば、メディエーターは「Near」ポインター(PokePointer/GrabPointerなど)がアクティブになると、指定されたコントローラー上の「Far Interaction」ポインターを無効にします。
全ての PokePointer をオフにする、または GGVPointer 以外の全てをオフにするなど、変わった処理を行うカスタムメディエーターを作成できます。
ポインターにはコントローラーへの参照があります。
以下のコードでコントローラーのポインターを取得できます。
controller.InputSource.Pointers
・Controller
コントローラはデータプロバイダー(デバイスマネージャー)によって生成されます。
例えば、WMR デバイスマネージャは関節のある手の存在を確認すると、コントローラを生成して管理します。
・Device Manager(Data Provide)
入力データプロバイダーとも呼ばれます。
これらのエンティティはコントローラを検出、作成、および管理する責任があります。