MRが楽しい

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

MRTK v2のドキュメントを少しずつ読み解く 入力(Input System)の概要

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

MRTKv2のGuidesドキュメント

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

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

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

入力の概要

MRTKの入力システム(Input System)では以下のことができます。

・入力イベントを介して、6DOFコントローラー、関節のある手、音声など、様々な入力ソースを利用します。
・Select や Menu などの抽象アクションを定義し、それらを別々の入力に関連付けます。
・コントローラーに接続されたポインターをセットアップし、フォーカスおよびポインターイベントを通してUIコンポーネントを操作します。
f:id:bluebirdofoz:20200213001428j:plain

入力データプロバイダー(デバイスマネージャー)

入力は入力データプロバイダー(デバイスマネージャー)によって生成されます。
各プロバイダーは、特定の入力ソースに対応しています。
Open VRWindows Mixed Reality(WMR)、Unity Joystick、Windows Speechなどです。
プロバイダーは Mixed Reality Toolkit コンポーネントの登録済みサービスプロバイダープロファイルを介してプロジェクトに追加されます。
これは対応する入力ソースが利用可能になると入力イベントを自動的に生成します
(例えばWMRコントローラーが検出されたとき、またはゲームパッドが接続されたとき)
f:id:bluebirdofoz:20200213002034j:plain

入力アクション(Input Actions)

入力アクションは特定の入力ソースからの入力を抽象化したものです。
入力を生成するデバイスからアプリケーションロジックを分離するのに役立ちます。

例えば、Select アクションを定義して以下の入力にマッピングすると便利です。
・マウスの左ボタン
ゲームパッドのボタン
・6DOFコントローラーのトリガー

その後、アプリケーションロジックは入力アクションイベントを受け取ることができます。
入力アクションイベントを生成する様々な入力をすべて意識する必要はありません。

入力アクションは Mixed Reality Toolkit コンポーネントの入力システム(Input System)プロファイル内にある入力アクション(Input Actions)プロファイルで定義されます。
f:id:bluebirdofoz:20200213001454j:plain

コントローラー(Controllers)

コントローラー(Controllers)は入力デバイスが検出されたとき、入力プロバイダーによって作成されます。
また、入力デバイスがロストまたは切断された場合は破棄されます。

例えば、WMR入力プロバイダーは6つのDOFデバイス用のWMRコントローラーと関節のある手用のハンドコントローラーを作成します。

コントローラー入力は、入力システム(Input System)プロファイル内にあるコントローラーマッピング(Controller Mapping)プロファイルを介して入力アクションにマップできます。
コントローラーによって発生した入力イベントには、関連する入力アクションが含まれます。
f:id:bluebirdofoz:20200213001504j:plain

ポインター(Pointers)

コントローラーにはポインターをアタッチできます。
シーンにクエリを実行してフォーカスのあるゲームオブジェクトを特定し、そのオブジェクトでポインターイベントを発生させます。例えば、ラインポインターはコントローラー姿勢を使用してレイキャストを実行し、レイの原点と方向を計算します。

各コントローラー用に作成されたポインターは、入力システム(Input System)プロファイルの下のポインター(Pointer)プロファイルで設定されます。
f:id:bluebirdofoz:20200213001513j:plain

イベントフロー

f:id:bluebirdofoz:20200213001525j:plain
UIコンポーネントで入力イベントを直接処理することもできます。
しかし、実装をデバイスに依存しないようにするために、ポインターイベントを使用することをお勧めします。

また、MRTKは、デバイスに依存しない方法で入力状態を直接照会する便利なメソッドをいくつか提供しています。
詳細については、MRTKの入力状態へのアクセスを参照してください。
microsoft.github.io

MRTKの入力状態へのアクセス

入力ソースに接続されたコントローラーを反復処理することで、MRTKの全ての入力の状態を直接照会することができます。
MRTKは目/手/頭/モーションコントローラーの位置と回転にアクセスするための方法も提供します。

コントローラーの反復処理と InputRayUtils クラスの使用の両方で入力をクエリする例については InputDataExample シーンを参照してください。
f:id:bluebirdofoz:20200213001547j:plain

例:頭/手/目を回転させる

MRTKのInputRayUtilsクラスは、ハンドレイ/ヘッドレイ/視線/モーションコントローラーレイにアクセスするためのメソッドを提供します。

// Get the head ray
var headRay = InputRayUtils.GetHeadGazeRay();

// Get the right hand ray
Ray rightHandRay;
if(InputRayUtils.TryGetHandRay(Handedness.Right, out rightHandRay))
{
    // Right hand ray is available
}
else
{
    // Right hand ray is not available
}

f:id:bluebirdofoz:20200213001600j:plain

例:シーンでアクティブなすべての6DOFコントローラーの回転

foreach(var controller in CoreServices.InputSystem.DetectedControllers)
{
    // Interactions for a controller is the list of inputs that this controller exposes
    foreach(MixedRealityInteractionMapping inputMapping in controller.Interactions)
    {
        // 6DOF controllers support the "SpatialPointer" type (pointing direction)
        // or "GripPointer" type (direction of the 6DOF controller)
        if (inputMapping.InputType == DeviceInputType.SpatialPointer)
        {
            Debug.Log("spatial pointer PositionData: " + inputMapping.PositionData);
            Debug.Log("spatial pointer RotationData: " + inputMapping.RotationData);
        }

        if (inputMapping.InputType == DeviceInputType.SpatialGrip)
        {
            Debug.Log("spatial grip PositionData: " + inputMapping.PositionData);
            Debug.Log("spatial grip RotationData: " + inputMapping.RotationData);
        }
    }
}

f:id:bluebirdofoz:20200213001613j:plain