本日は MRTKv2 の調査枠です。
MRTKv2 の Guides ドキュメントを少しずつ読み進めていきます。
MRTKv2のGuidesドキュメント
以下のドキュメントを読み進めていきます。
microsoft.github.io
以下のページでは有志による本ドキュメントの日本語翻訳が行われています。
投稿時点でこちらで未翻訳、または著者が興味のある部分について記事にしていきます。
hololabinc.github.io
本記事では以下のページを読み進めます。
microsoft.github.io
クエリポインター
以下の例は利用可能な入力ソース(コントローラーと入力)をループして、どのポインターがアタッチされているかを検出します。
これにより、現在アクティブな全てのポインターを収集することができます。
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); } } }
プライマリポインター
開発者は 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); }
PrimaryPointerExample シーンはイベントに PrimaryPointerChangedHandler を使用して、新しいプライマリポインターに応答する方法を示します。
ポインター結果
ポインターの 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);
}
PointerResultExample シーンはポインター Result を使用して、ヒット位置にオブジェクトをスポーンする方法を示しています。
ポインターを無効にする
ポインターを有効または無効にするには(例えば、ハンドレイを無効にする)、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); }
その他の例については、PointerUtils および TurnPointersOnOff を参照してください。
エディターを介したポインターの相互作用
IMixedRealityPointerHandler によって処理されるポインターイベントの場合、MRTK は PointerHandler コンポーネントの形式でさらに便利になり、Unity イベントを介してポインターイベントを直接処理できます。