ハンドコーチ - MRTK2

Hand Coach Menu

ハンド コーチは、システムがユーザーの手を検出しない場合に、3D モデル化された手をトリガーします。 この機能は、ジェスチャが学習されていないときにユーザーをガイドするのに役立つ「教育」コンポーネントです。 ユーザーが指定したジェスチャを一期間実行していない場合、手は遅延でループします。 ハンド コーチは、ボタンの押下やホログラムの選択を表す場合に使用できます。

現在の対話式操作モデルは、スクロール、遠くの選択、近タップなど、さまざまなジェスチャ コントロールを表します。 既存の手のジェスチャの完全な一覧を次に示します。

  • [近くの選択] の例 - ボタンまたは近くの対話可能オブジェクトに使用
  • [遠くを選択] の例 - 遠く離れたオブジェクトに使用
  • [移動] – 空間のホログラムを移動するために使用
  • [回転] – ホログラムまたはオブジェクトを回転する方法を示すために使用
  • [スケール] – ホログラムを大きくまたは小さく操作する方法を示すために使用
  • [ハンド フリップ] – UI スタート パネルまたはハンド メニューを起動するために使用
  • [手の上] – ソフトウェアのインストール後、最初の起動時に発生するユーザーエクスペリエンスのモーメントに対して使用します。 もう 1 つの提案は、UI スタートパネルを表示することです
  • [スクロール] – リストまたは長いドキュメントをスクロールするために使用

シーンの例

例は、次のHandCoachExampleシーンにあります。MixedRealityToolkit.Examples/ Experimental / HandCoach / Scenes

ハンド 3D 資産

アセットは次の場所にあります。 MixedRealityToolkit.SDK/Experimental/HandCoach

品質

スキン メッシュにゆがみがある場合は、プロジェクトで適切な量のジョイントが使用されていることを確認する必要があります。 Unity の [編集] > [プロジェクト設定] > [品質] > [その他] > [重みのブレンド] に移動します。 スムーズなジョイントが表示されるように「4 bones」が選択されていることを確認します。 Project Setting

スクリプト

対話式操作のヒント

InteractionHint.csスクリプトは、ハンドリグのアニメーションとフェードをトリガーするためのラッパー機能を提供します。

対話式操作のヒントを設定する方法

インタラクションヒントを設定するには、提供されているプレハブ「StaticHandCoachRoot_L.prefab」および「StaticHandCoachRoot_R.prefab」を使用することをお勧めします。 このプレハブには、対話式操作のヒント スクリプトとハンドリグ、および提供されたヒントアニメーションが意図したとおりに機能することを保証するための適切な階層が含まれています。 それ以外の場合は、アニメーターを使用して、ハンドリグから 1 つ上の親レベルの gameObject にスクリプトを置く必要があります。

インスペクタープロパティ

  • HideIfHandTracked このブール値は、ユーザーの手が追跡されているときに、手の追跡状態を使用してビジュアルを非表示にするかどうかを指定します。 これがfalseに設定されている場合、ヒントを非表示にするかどうかを決定するために、スクリプトプロパティ「customShouldHideVisuals」のみが使用されます。

  • MinDelay このプロパティは、ビジュアルを表示する場合の最小遅延を指定します。 既定では、ユーザーの手が追跡されていない場合、この数秒後に手のビジュアルが表示されます。

  • MaxDelay このプロパティは、ビジュアルを表示する場合の最大遅延を指定します。 既定では、ユーザーの手が追跡されている場合でも、この数秒後に手のビジュアルが表示されます。

  • UseMaxTimer このブール値が false に設定されている場合、最大タイマーが無効になり、ユーザーの手が見えない場合にのみ手のヒントが表示されるようになります。または、カスタム条件がfalseを返します。

  • 繰り返しこのプロパティは、最小または最大タイマーを経過したときヒント アニメーションが再生される回数を制御します。 その後、ヒントは非表示になり、再び遅延を待ちます。

  • AutoActivate このブール値が true に設定されている場合、スクリプトの GameObject が階層でアクティブであり、スクリプトが有効になっていると、ヒントはタイマーロジックを自動的に実行します。 これは、コードを介してヒントの表示と非表示を手動で制御する場合にのみfalseに設定する必要があります。

  • AnimationState ヒントがアクティブなときに再生するアニメーション状態の名前。 これは、StartHintLoop () 関数が呼び出される前 (AutoActivateがチェックされている場合は OnEnable中) に設定する必要があります。

スクリプトによる 対話式操作のヒントのコントロール

  • StartHintLoop この関数は、AutoActivate フラグが true に設定されている場合に OnEnable を開始する表示/非表示ループを開始します。
  • StopHintLoop この関数は、現在再生されていない場合にフェードアウト アニメーション状態を呼び出し、表示/非表示ループを非アクティブにして、階層内でハンドリグを非アクティブに設定します。
  • AnimationState この文字列は、ループ中に再生されるアニメーション状態を決定します。 この文字列を変更して、再生する状態を変更できますが、StopHintLoop を呼び出した後に変更する必要があり、状態を変更した後に StartHintLoop を再度呼び出す必要があります。
  • CustomShouldHideVisuals これは独自の関数で設定できます。これは、手のビジュアルを非表示にする場合に true を返す必要があります (MinMaxTimer、特に max パラメーターに注意してください)。

カスタム アニメーションに関する考慮事項

フェードは既定で 0.5 秒に設定されているため、リグで使用するために作成されたカスタム アニメーションは、意味ある情報を伝えるために最低でも 1.5 秒にする必要がある

提供されている既定のフェードインとフェードアウト状態である Fade_In および Fade_Out は、2 番目のキーフレームのタイムスタンプを変更してフェードの長さを設定することで調整できます。

アニメーターとスクリプトは、セットアップができるだけ簡単になるように設定されています。 新しいアニメーション状態を追加するには、fbx をインポートし、アニメーション名が別の名前で設定されていることを確認して、そのアニメーションをアニメーターにドラッグします。

MoveToTarget

MoveToTarget.cs スクリプトは、時間の経過とともにハンド ヒントを追跡位置からターゲット位置に移動する機能を提供します。

MoveToTarget の設定方法

提供されているプレハブ「MovingHandCoachRoot_L.prefab」および「MovingHandCoachRoot_R.prefab」には、階層に MoveToTarget が含まれています。 このスクリプトを独自のセットアップで使用する場合は、リグのアニメーターを含むルートゲーム オブジェクトに置く必要があります。

インスペクタープロパティ

  • TrackingObject リグがモーションを開始する前に、リグが従うオブジェクトでこれを設定します。 空の GameObject を作成し、それを特定の位置に移動して、追跡を正確に特定できるようにすることをお勧めします。
  • TargetObject これをリグのモーション中に移動するオブジェクトで設定します。 空の GameObject を作成し、それを特定の位置に移動して、追跡を正確に特定できるようにすることをお勧めします。
  • RootObject 相対位置を正しく計算できるように、これをトラッキング オブジェクトとターゲット オブジェクト間の共有親に設定します。 含まれているプレハブの階層にはトラッキングオブジェクトとターゲットオブジェクトの両方がありますが、ターゲットオブジェクトをプレハブの外部の gameObject として設定し、ルートオブジェクトを共有の親に変更できます。
  • 継続期間 TTrackingObject から TargetObject への移動にかかる秒数 (秒単位)。
  • TargetOffset GameObject を正しいターゲット位置に到達させるための調整可能なオフセット。 これは、アニメーション中にアニメーション中に位置オフセットが含まれている場合に便利です。
  • AnimationCurve これは既定では線形曲線に設定されていますが、モーションパスを開始および停止するときに、曲線を変更してイーズ イン/イーズ アウトを行うことができます。

スクリプトによる MoveToTarget のコントロール

カスタムスクリプトで、ハンドリグを TrackingObject に追従させたいときに Follow () を呼び出し、ハンドリグに TargetObject へのモーションを開始させたいときに MoveToTargetPosition () を呼び出します。

アニメーションによる MoveToTarget のコントロール

移動する必要があるアニメーションで、2 つのイベントを設定します。1 つは Follow () の呼び出し、もう 1 つは MoveToTargetPosition () の呼び出しです。 フォローは、ハンド リグが TrackingObject に追従するため、最初のキーフレームに設定する必要があります。 MoveToTargetPosition は、リグがターゲットへの移動を開始するキーフレームに設定する必要があります。 これは、提供されているプレハブでスクリプト機能がどのように使用されるかを示しています。

RotateAroundPoint

RotateAroundPoint.cs スクリプトは、時間の経過とともにピボット ポイントを中心にハンド ヒントを回転させる機能を提供します。

RotateAroundPoint の設定方法

提供されているプレハブ「RotatingHandCoachRoot_L.prefab」および「RotatingHandCoachRoot_R.prefab」には、階層にRotateAroundPointが含まれています。 このスクリプトを独自のセットアップで使用する場合は、リグのアニメーターを含むルートゲーム オブジェクトに置く必要があります。

インスペクタープロパティ

  • CenteredParent リグを回転させる親オブジェクトでこれを設定します。
  • InverseParent これを親に設定すると、手の方向を同じに保つために逆回転が centeredParent になります。 通常、これは InteractionHint スクリプトが含まれる親オブジェクトになります。
  • PivotPosition これを、ヒントに動きを開始させたいポイントに設定します。
  • 継続期間 CenteredParent の周囲を回転するのにかかる所要時間 (秒) です。
  • AnimationCurve これは既定では線形曲線に設定されていますが、モーションパスを開始および停止するときに、曲線を変更してイーズ イン/イーズ アウトを行うことができます。
  • RotationVector 各軸に沿って回転する角度。

スクリプトによるRotateAroundPointのコントロール

カスタムスクリプトで、ハンドリグが CenteredParent を中心に回転を開始するようにするには、 RotateToTarget () を呼び出します。 位置を元の PivotPosition にリセットする場合は、 ResetAndDeterminePivot () を呼び出します。

アニメーションによるRotateAroundPointのコントロール

移動する必要があるアニメーションで、2 つのイベントを設定します。1 つは ResetAndDeterminePivot () への呼び出しで、もう 1 つは RotateToTarget () への呼び出しです。 ResetAndDeterminePivot は、ハンドリグが PivotPosition にリセットされるため、最初のキーフレームに設定する必要があります。 RotateToTarget は、リグが CenteredParent を中心にした回転を開始するキーフレームに設定する必要があります。 これは、提供されているプレハブでスクリプト機能がどのように使用されるかを示しています。