ハンド メニュー

ハンド メニュー UX の例

メニューを使用すると、ユーザーは頻繁に使用される関数のための直接の UI をすぐに表示できます。 他のオブジェクトとの対話中に誤アクティブ化が行われないようにするには、[フラットハンドを必要とする] や [宝石のライセンス認証を使用する] などのオプションを手にします。 不要なアクティブ化を防ぐために、これらのオプションを使用することをお勧めします。

ハンドメニューの例

例を紹介します。 unity シーンは MRTK/Examples/Demos/HandTracking/Scenes フォルダーの下にあります。 実行中の場合、シーンは現在選択されているメニューの種類のみをアクティブ化します。
HandMenu_ExampleScene

これらの手の形のメニューは [フォルダー] の下に prefabs MRTK/Examples/Demos/HandTracking/Prefabs ます。

HandMenu_Small_HideOnHandDrop と HandMenu_Medium_HideOnHandDrop

次の2つの例では、MenuContent オブジェクトをアクティブ化および非アクティブ化して、 OnFirstHandDetected () イベントと OnLastHandLost () イベントのメニューを表示および非表示にします。
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

より長い対話時間を必要とする複雑なメニューの場合は、メニューを世界中にロックすることをお勧めします。 この例では、 OnFirstHandDetected () イベントと OnLastHandLost () イベントで menucontent をアクティブ化および非アクティブ化するだけでなく、メニューを取得し、そのメニューをプルすることができます。
HandMenu_ExampleScene 3

Backplate ManipulationHandler を使用すると、grabbable と移動が可能になります。 操作が開始 されたイベントでは、 UpdateSolvers はメニューをロックするために非アクティブになります。 また、タスクの終了時にユーザーがメニューを閉じることができる [ 閉じる] ボタン が表示されます。 操作が終了したイベント につい ては、HandConstraintPalmUp を呼び出して、ユーザーが palm を立ち上げて表示することによって、メニューを手に戻すことができるようにします
HandMenu_ExampleScene 4

[閉じる] ボタンをクリックすると、 UpdateSolvers が再アクティブ化され、 menucontent が非表示になります。
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

この例は HandMenu_Large_WorldLock_On_GrabAndPull に似ています。 唯一の違いは、メニューが手の形で自動的にロックされることです。 これを行うには、 OnLastHandLost () イベントで menucontent を非表示にします。 グラブ & プル動作は HandMenu_Large_WorldLock_On_GrabAndPull 例と同じです。

スクリプト

HandConstraint の動作では、手に制約されるコンテンツ (ハンド UI、メニューなど) で追跡対象のオブジェクトを安全な領域に制約するソルバーが提供されます。 安全な領域は、手と交差しない領域と見なされます。 手のひらがユーザーの方を向いているときに、ソルバーの追跡対象のオブジェクトをアクティブ化する一般的な動作を示すために、HandConstraintPalmUp と呼ばれる HandConstraint の派生クラスも含まれています。

追加のドキュメントについては、各プロパティに使用できるツールヒントを参照してください HandConstraint 。 いくつかのプロパティについては、以下で詳しく説明します。

HandMenu_ExampleScene Palm up
  • セーフゾーン: セーフゾーンは、どこでコンテンツを制限するかを指定します。 コンテンツを Ulnar 側に配置して、手作業との重複を回避し、相互作用品質を向上させることをお勧めします。 セーフゾーンは、カメラのビューに直交する平面に投影されたハンドの向きを撮影して、周囲の境界ボックスに raycasting することによって計算されます。 セーフゾーンは、と連動するように定義されてい IMixedRealityHand ますが、他の種類のコントローラーでも動作します。 各セーフゾーンがさまざまな種類のコントローラーでどのように表されているかを調べることをお勧めします。

  • カメラに接続するまで手 を入れますこれがアクティブになっている場合、ソルバーは、メニューが宝石に十分に沿っているまで、手動による回転に従います。 これは、HandConstraintSolver の SolverRotationBehavior を、GazeAlignment 角度がソルバーによって異なるように、ルック Attrackedobject から Look Atmainカメラに変更することで機能します。

HandMenu Safe Zones
  • アクティベーションイベント: 現在、 HandConstraint 4 つのアクティブ化イベントがトリガーされます。 これらのイベントは、さまざまな組み合わせで使用して固有の HandConstraint 動作を作成でき MRTK/Examples/Demos/HandTracking/Scenes/ ます。これらの動作の例については、「コード例」のシーンの例を参照してください。

    • Onworkplace activate: IsHandActive メソッドを手動で満たしたときにトリガーします。
    • Onworkplace deactivate: IsHandActive メソッドが満たされなくなったときにトリガーします。
    • OnFirstHandDetected: ハンドトラッキングの状態が、表示されていない状態に変化したときに発生します。
    • OnLastHandLost: ハンドトラッキングの状態が、ビューの少なくとも1つの場所から実際の表示に変化したときに発生します。
  • ソルバーのアクティブ化/非アクティブ化のロジック: 現在、ロジックのアクティブ化と非アクティブ化の推奨事項 HandConstraintPalmUp は、オブジェクトを無効/有効にするのではなく、UpdateSolver 値を使用することによって行います。 この例では、アタッチされたメニューの [参照] イベントの後にトリガーされるエディターベースのフックを使用して、サンプルシーンに表示されます。

    • ハンド制約ロジックの停止: ハンド制約オブジェクトを停止するように設定しようとしたとき (アクティベーション/非アクティブ化ロジックを実行していない場合)、HandConstraintPalmUp を無効にするのではなく、UpdateSolver を False に設定します。
      • (または、宝石による) 再アタッチロジックを有効にする場合は、その後に HandConstraintPalmUp () 関数を呼び出します。 これにより、"IsValidController" 条件が満たされているかどうかを引き続きチェックし、その後 (またはオブジェクトが無効になっている場合) に UpdateSolver を True に設定するコルーチンがトリガーされます。
    • ハンド制約ロジックを開始 する: 手動による制約付きオブジェクトを、(ライセンス認証条件を満たしているかどうかに基づいて) もう一度開始するように設定しようとした場合は、UpdateSolver を true に設定します。
  • アタッチロジック: 現在、は、 HandConstraintPalmUp UpdateSolver が True であるかどうかに関係なく、ターゲットオブジェクトを追跡ポイントに自動的に再アタッチできます。 これは、HandConstraintPalmUp の StartWorldLockReattachCheckCoroutine () 関数を呼び出すことによって行われます (この場合は、実際には、UpdateSolver が False に設定されます)。

こちらもご覧ください