MRが楽しい

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

MRTK v2のドキュメントを少しずつ読み解く MRTKでNearInteractionを追加する方法 その1

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

MRTKv2のGuidesドキュメント

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

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

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

MRTKでNearInteractionを追加する方法

NearInteraction はタッチとグラブの形で提供されます。
タッチイベントとグラブイベントはそれぞれ PokePointer と SpherePointer によってポインターイベントとして発生します。

特定の GameObject でタッチイベントをリッスンしたり、入力イベントを取得するには3つの重要な手順が必要です。

1.関連するポインターがメインのMRTK構成プロファイルに登録されていることを確認してください。
2.目的の GameObject に適切なグラブまたはタッチスクリプトコンポーネントとコライダーがあることを確認します。
3.グラブまたはタッチイベントをリッスンするために、目的の GameObject に接続されたスクリプトに入力ハンドラーインターフェイスを実装します。

グラブインタラクションを追加する

1.プロファイルの設定

SpherePointer が Pointer プロファイルに登録されていることを確認してください。

デフォルトの MRTK プロファイルとデフォルトの HoloLens2 プロファイルには SpherePointer が含まれています。
SpherePointer が作成されていることを確認するにはMRTKの構成プロファイルを選択し、[Input] > [Pointers] > [Pointer Options]に移動します。
MRTK.SDK/Features/UX/Prefabs/Pointers/の配下の GrabPointer プレハブが、[Controllered Type]を[Articulated Hand]に設定した状態で追加されていることを確認します。
または SpherePointer クラスを実装しているカスタムプレハブを利用できます。
f:id:bluebirdofoz:20200310035755j:plain

2.NearInteractionGrabbableの設定

掴むべき GameObject に NearInteractionGrabbable とコライダーを追加します。
GameObject のレイヤーがグラブ可能なレイヤー上にあることを確認してください。
デフォルトでは Spatial Awareness および Ignore Raycasts を除くすべてのレイヤーはグラブ可能です。
GrabPointer プレハブのグラブレイヤーマスクを調べると、どのレイヤーがグラブ可能かを確認できます。
f:id:bluebirdofoz:20200310035805j:plain

3.IMixedRealityPointerHandlerの設定

GameObject またはその親で IMixedRealityPointerHandler インターフェイスを実装するスクリプトコンポーネントを追加します。
NearInteractionGrabbable を持つオブジェクトの親もポインターイベントを受け取ることができます。

グラブコードの例

以下はイベントがタッチまたはグラブの場合にログ出力するスクリプトです。
関連する IMixedRealityPointerHandler インターフェイス関数では MixedRealityPointerEventData を介してそのイベントをトリガーするポインターのタイプを見ることができます。
ポインターが SpherePointer の場合、相互作用はグラブです。

public class PrintPointerEvents : MonoBehaviour, IMixedRealityPointerHandler
{
    public void OnPointerDown(MixedRealityPointerEventData eventData)
    {
        if (eventData.Pointer is SpherePointer)
        {
            Debug.Log($"Grab start from {eventData.Pointer.PointerName}");
        }
        if (eventData.Pointer is PokePointer)
        {
            Debug.Log($"Touch start from {eventData.Pointer.PointerName}");
        }
    }

    public void OnPointerClicked(MixedRealityPointerEventData eventData) {}
    public void OnPointerDragged(MixedRealityPointerEventData eventData) {}
    public void OnPointerUp(MixedRealityPointerEventData eventData) {}
}

f:id:bluebirdofoz:20200310035824j:plain