MRが楽しい

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

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

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

MRTKv2のGuidesドキュメント

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

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

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

ポインター

デフォルトのポインタークラス

以下のクラスは、すぐに使用できるMRTKポインターです。
上記で概説したデフォルトのMRTKポインタープロファイルで利用可能で定義されています、
Assets/MixedRealityToolkit.SDK/Features/UX/Prefabs/Pointers で提供される各ポインタープレハブには添付されたポインターコンポーネントの1つが含まれています。
f:id:bluebirdofoz:20200314215536j:plain

Far pointers

LinePointer

ベースポインタークラスである LinePointer は入力のソース(つまりコントローラー)からポインター方向に線を引きます。
この方向に単一の Raycast をサポートします。
主に一般的な機能を提供するこのクラスの代わりに、ShellHandRayPointer やテレポートポインターなどの子クラスがインスタンス化されて利用されます。
(テレポーテーションが終了する場所を示す線も描画します)

Oculus、Vive、Windows Mixed Reality などのモーションコントローラーの場合、回転はコントローラーの回転と一致します。
HoloLens 2 の関節付き手のような他のコントローラーの場合、回転はシステムが提供する手のポインティングポーズと一致します。
f:id:bluebirdofoz:20200314215606j:plain
microsoft.github.io

CurvePointer

CurvePointer は曲線に沿ったマルチステップレイキャストを可能にすることにより、LinePointer クラスを拡張します。
この基本ポインタークラスはラインが常に放物線に曲がる Teleport pointers などの曲線インスタンスに役立ちます。
microsoft.github.io

ShellHandRayPointer

LinePointer から拡張された ShellHandRayPointer の実装はMRTKポインタープロファイルのデフォルトとして使用されます。
DefaultControllerPointer プレハブは ShellHandRayPointer クラスを実装します。
microsoft.github.io

GGVPointer

GGVPointerは Gaze/Gesture/Voice(GGV)ポインターとも呼ばれます。
主に、視線とエアタップ、または、視線と音声認識インタラクションを介して、HoloLens 1 スタイルのルックアンドタップインタラクションを強化します。
GGVPointer の位置と方向は、頭の位置と回転によって決まります。
microsoft.github.io

TouchPointer

TouchPointer は Unity Touch 入力(つまり、タッチスクリーン)の操作を担当します。
これらは「遠くの相互作用」に分類されます。
スクリーンに触れる行為はカメラからシーン内の遠い場所に Raycast を投げかけるからです。
microsoft.github.io

MousePointer

MousePointer は遠隔操作のために画面をワールドレイキャストにパワーアップします。
ただしタッチの代わりにマウスを利用します。
f:id:bluebirdofoz:20200314215709j:plain

マウスサポートはMRTKではデフォルトでは使用できません。
MouseDeviceManager タイプの新しい Input Data Provider をMRTK入力プロファイルに追加し、MixedRealityMouseInputProfile を Data Provider に割り当てることで有効にできます。
microsoft.github.io

Near pointers

PokePointer

PokePointer は「タッチ可能な近接操作」をサポートするゲームオブジェクトとやり取りするために使用されます。
タッチ可能なゲームオブジェクトとは NearInteractionTouchableスクリプトが添付された GameObject です。
UnityUI の場合、このポインターは NearInteractionTouchableUnityUIs を探します。
PokePointer は SphereCast を使用して、最も近いタッチ可能な要素を決定し、押し可能なボタンなどを駆動するために使用されます。

NearInteractionTouchable コンポーネントを使用して GameObject を構成する場合 localForward パラメーターを設定して、ボタンまたはタッチ可能にする必要があるオブジェクトの前面を指すようにしてください。
また、タッチ可能の境界がタッチ可能オブジェクトのバウンドと一致することを確認してください。

PokePointer の便利なプロパティを以下に示します。

・TouchableDistance
タッチ可能な表面が相互作用できる最大距離。

・Visuals
指先を視覚的にレンダリングするために使用されるゲームオブジェクト(デフォルトでは指のリング)。

・Line
指先からアクティブな入力面に描画するオプションの線。

・Poke Layer Masks
ポインターが相互作用する可能性のある GameObject と、試行する相互作用の順序を決定する LayerMask の優先順位付き配列。
GameObject には PokePointer と対話するために NearInteractionTouchable コンポーネントも必要であることに注意してください。
f:id:bluebirdofoz:20200314215755j:plain
microsoft.github.io

SpherePointer

SpherePointer は UnityEngine.Physics.OverlapSphere を使用して、相互作用のための最も近い NearInteractionGrabbable オブジェクトを識別します。
これは ManipulationHandler のようなグラブ可能な入力に役立ちます。
PokePointer/NearInteractionTouchable 機能ペアと同様に SpherePointer と相互作用するにはゲームオブジェクトに NearInteractionGrabbable スクリプトであるコンポーネントが含まれている必要があります。
f:id:bluebirdofoz:20200314215906j:plain

SpherePointer の便利なプロパティを以下に示します。

Sphere Cast Radius
グラブ可能なオブジェクトの照会に使用される球の半径。

・Grab Layer Masks
ポインターが相互作用する可能性のある GameObject と、試行する相互作用の順序を決定する LayerMask の優先順位付き配列。
GameObject は SpherePointer と対話するために NearInteractionGrabbable も持っている必要があることに注意してください。

Spatial Awareness レイヤーは MRTK が提供するデフォルトの GrabPointer プレハブでは無効になっています。
これは空間メッシュで球面オーバーラップクエリを実行することによるパフォーマンスへの影響を軽減するために行われます。
これを有効にするには GrabPointer プレハブを変更します。

・Ignore Colliders Not in FOV
ポインタの近くにある可能性があるが、実際には視覚的な FOV にはないコライダーを無視するかどうか。
これにより、偶発的なグラブを防ぐことができます。
つかむことができるが近くに見えない場合に HandRay をオンにすることができます。

視覚 FOV はパフォーマンス上の理由から、一般的な錐台のコーンを介して定義されます。
この円錐は、カメラの錐台と同じ中心に配置され、半径はディスプレイの高さの半分(または垂直FOV)に等しくなります。
f:id:bluebirdofoz:20200314215849j:plain
microsoft.github.io

Teleport pointers

TeleportPointer

TeleportPointer はユーザーを移動するためにアクションが実行されるとテレポート要求を出します。
microsoft.github.io

ParabolicTeleportPointer

ParabolicTeleportPointer はユーザーを移動するために放物線のレイキャストでアクションが実行されるとテレポート要求を発生させます。
f:id:bluebirdofoz:20200314215935j:plain
microsoft.github.io