MRが楽しい

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

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

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

MRTKv2のGuidesドキュメント

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

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

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

クエリポインター

以下の例は利用可能な入力ソース(コントローラーと入力)をループして、どのポインターがアタッチされているかを検出します。
これにより、現在アクティブな全てのポインターを収集することができます。

var pointers = new HashSet<IMixedRealityPointer>();

// Find all valid pointers
// 全ての有効なポインターを見つける
foreach (var inputSource in CoreServices.InputSystem.DetectedInputSources)
{
    foreach (var pointer in inputSource.Pointers)
    {
        if (pointer.IsInteractionEnabled && !pointers.Contains(pointer))
        {
            pointers.Add(pointer);
        }
    }
}

f:id:bluebirdofoz:20200316095051j:plain

プライマリポインター

開発者は FocusProviders PrimaryPointerChanged イベントにサブスクライブして、フォーカスされているプライマリポインターが変更されたときに通知を受けることができます。
これは、ユーザーが現在、視線、ハンドレイ、または別の入力ソースを介してシーンと対話しているかどうかを識別するのに非常に役立ちます。

private void OnEnable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.SubscribeToPrimaryPointerChanged(OnPrimaryPointerChanged, true);
}

private void OnPrimaryPointerChanged(IMixedRealityPointer oldPointer, IMixedRealityPointer newPointer)
{
    // ...
}

private void OnDisable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.UnsubscribeFromPrimaryPointerChanged(OnPrimaryPointerChanged);

    // This flushes out the current primary pointer
    // これにより、現在のプライマリポインターが更新されます
    OnPrimaryPointerChanged(null, null);
}

f:id:bluebirdofoz:20200316095102j:plain

PrimaryPointerExample シーンはイベントに PrimaryPointerChangedHandler を使用して、新しいプライマリポインターに応答する方法を示します。
f:id:bluebirdofoz:20200316095115j:plain

ポインター結果

ポインターの Result プロパティにはフォーカスのあるオブジェクトを決定するシーンクエリの現在の結果が含まれています。
モーションコントローラー、視線入力、ハンドレイ用にデフォルトで作成されるレイキャストポインターの場合、レイキャストヒットの位置と法線が含まれます。

void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
{
    var result = eventData.Pointer.Result;
    var spawnPosition = result.Details.Point;
    var spawnRotation = Quaternion.LookRotation(result.Details.Normal);
    Instantiate(MyPrefab, spawnPosition, spawnRotation);
}

f:id:bluebirdofoz:20200316095126j:plain

PointerResultExample シーンはポインター Result を使用して、ヒット位置にオブジェクトをスポーンする方法を示しています。
f:id:bluebirdofoz:20200316095135j:plain

ポインターを無効にする

ポインターを有効または無効にするには(例えば、ハンドレイを無効にする)、PointerUtils を使用して特定のポインタータイプの PointerBehavior を設定します。

// Disable the hand rays
// 手の光線を無効にする
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Disable hand rays for the right hand only
// 右手のみ手の光線を無効する
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

// Disable the gaze pointer
// 注視ポインタを無効にする
PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOff);

// Set the behavior to match HoloLens 1
// HoloLens 1に一致するように動作を設定します
// Note, if on HoloLens 2, you must configure your pointer profile to make the GGV pointer show up for articulated hands.
// HoloLens 2でGGVポインターが関節付きの手に表示されるようにポインタープロファイルを構成する必要があることに注意してください。

public void SetHoloLens1()
{
    PointerUtils.SetHandPokePointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetHandGrabPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGazePointerBehavior(PointerBehavior.Default);
}

f:id:bluebirdofoz:20200316095144j:plain

その他の例については、PointerUtils および TurnPointersOnOff を参照してください。

エディターを介したポインターの相互作用

IMixedRealityPointerHandler によって処理されるポインターイベントの場合、MRTK は PointerHandler コンポーネントの形式でさらに便利になり、Unity イベントを介してポインターイベントを直接処理できます。
f:id:bluebirdofoz:20200316095156j:plain

ポインター範囲

Far Pointer にはシーン内の他のオブジェクトとレイキャストおよび相互作用する距離を制限する設定があります。
デフォルトでは、この値は10メートルに設定されています。
この値は HoloLens シェルの動作と一貫性を保つために選択されています。

これは DefaultControllerPointer プレハブの ShellHandRayPointer コンポーネントのフィールドを更新することで変更できます。

Pointer Extent

ポインターが相互作用する最大距離を制御します。

Default Pointer Extent

ポインターが何かと相互作用していないときにレンダリングされるポインター光線の長さを制御します。