MRが楽しい

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

MRTK v2のドキュメントを少しずつ読み解く ポインター その3

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

MRTKv2のGuidesドキュメント

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

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

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

Mixed Realityプラットフォームのポインターサポート

次の表に、MRTKの一般的なプラットフォームで通常使用されるポインタータイプの詳細を示します。

これらのプラットフォームに異なるポインタータイプを追加することは可能です。
例えば VR に PokePointer または SpherePointer を追加することもできます。
さらに、ゲームパッド付きのVRバイスは GGVPoiinter を使用できます。

OpenVRWindows Mixed
Reality
HoloLens 1HoloLens 2
ShellHandRayPointer有効有効有効
TeleportPointer有効有効
ShellHandRayPointer有効
ShellHandRayPointer有効

コードを介したポインター相互作用

ポインターイベントインターフェイス

次のインターフェイスの1つ以上を実装し Collider で GameObject に割り当てられた MonoBehaviours は関連付けられたインターフェイスで定義されたポインターインタラクションイベントを受け取ります。

イベント説明ハンドラクラス
フォーカス変更前/
フォーカス変更後
ゲームオブジェクトがフォーカスを失ったか、ポインターがフォーカスを変更することの両方で発生します。 IMixedRealityFocusChangedHandler
フォーカス入力/終了 最初のポインターが当たったときのフォーカスを取得したゲームオブジェクトか
最後のポインターが離れたときのフォーカスを失ったゲームオブジェクトで発生します
IMixedRealityFocusHandler
ポインターの上下/ドラッグ/クリック ポインターの押下、ドラッグ、リリースを報告するために発生します。 IMixedRealityPointerHandler
タッチ開始/更新/完了 タッチアクティビティを報告するために、PokePointer などのタッチ対応ポインターによって発生します。 IMixedRealityTouchHandler


IMixedRealityFocusChangedHandler および IMixedRealityFocusHandler はそれらが発生するオブジェクトで処理する必要があります。
フォーカスイベントをグローバルに受信することは可能ですが、他の入力イベントとは異なり、グローバルイベントハンドラーはフォーカスに基づくイベントの受信をブロックしません。
イベントは、グローバルハンドラーと対応するフォーカスのあるオブジェクトの両方によって受信されます。

アクションのポインター入力イベント

ポインタ入力イベントは通常の入力イベントと同様の方法でMRTK入力システムによって認識および処理されます。
通常の入力イベントとの違いは、ポインター入力イベントは入力イベントを発生させたポインターとグローバル入力ハンドラーによってフォーカスされている GameObject によってのみ処理されることです。
通常の入力イベントは全てのアクティブなポインターに対してフォーカスされている GameObjects によって処理されます。

1.MRTK入力システムは、入力イベントが発生したことを認識します。

2.MRTK入力システムは、登録されているすべてのグローバル入力ハンドラーへの入力イベントに関連するインターフェイス関数を起動します。

3.入力システムはイベントを発生させたポインターに対してフォーカスしている GameObject を決定します。

3-1.入力システムは Unity のイベントシステムを利用して、フォーカスされた GameObject 上の全ての一致するコンポーネントに関連するインターフェイス関数を起動します。

3-2.いずれかの時点で入力イベントが使用済みとしてマークされている場合、プロセスは終了し、それ以上の GameObject はコールバックを受け取りません。
例:IMixedRealityFocusHandler を実装するコンポーネントが検索され、GameObject がフォーカスを取得または失ったとき。
注意:現在の GameObject で目的のインターフェースに一致するコンポーネントが見つからない場合、Unity Event System はバブルアップして親 GameObject を検索します。

4.グローバル入力ハンドラーが登録されておらず、一致するコンポーネント/インターフェースを持つ GameObject が見つからない場合、入力システムは各フォールバック登録済み入力ハンドラーを呼び出します。

以下は、ポインタがフォーカスを取得または終了したとき、または、ポインタがオブジェクトを選択したときにアタッチされたレンダラーの色を変更するスクリプトの例です。

public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler, IMixedRealityPointerHandler
{
    private Color color_IdleState = Color.cyan;
    private Color color_OnHover = Color.white;
    private Color color_OnSelect = Color.blue;
    private Material material;

    private void Awake()
    {
        material = GetComponent<Renderer>().material;
    }

    void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
    {
        material.color = color_OnHover;
    }

    void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
    {
        material.color = color_IdleState;
    }

    void IMixedRealityPointerHandler.OnPointerUp(
         MixedRealityPointerEventData eventData)
    { }

    void IMixedRealityPointerHandler.OnPointerDown(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerDragged(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
    {
        material.color = color_OnSelect;
    }
}

f:id:bluebirdofoz:20200315112530j:plain