Handtrainer – MRTK2

Hand Coach Menu

Handtrainer ist 3D-modellierte Hand, die ausgelöst wird, wenn das System die Hände des Benutzers nicht erkennt. Dies wird als "Lehrkomponente" implementiert, die dem Benutzer hilft, zu führen, wenn die Geste nicht gelehrt wurde. Wenn Benutzer die angegebene Geste für einen Zeitraum nicht ausgeführt haben, wird die Hand mit einer Verzögerung schleifen. Der Handbus könnte verwendet werden, um eine Schaltfläche zu drücken oder ein Hologramm aufzunehmen.

Das aktuelle Interaktionsmodell stellt eine Vielzahl von Gestensteuerelementen dar, z. B. Scrollen, weit auswählen und in der Nähe tippen. Nachfolgend finden Sie eine vollständige Liste der vorhandenen Hand-Coach-Beispiele:

  • In der Nähe von Tippen – Für Schaltflächen verwendet oder interagierende Objekte schließen
  • Far select – Verwendet für Objekte, die weit entfernt sind
  • Verschieben – Wird verwendet, um ein Hologramm im Raum zu verschieben
  • Drehen – Wird verwendet, um anzuzeigen, wie Hologramme oder Objekte gedreht werden.
  • Skalierung – Wird verwendet, um anzuzeigen, wie Hologramme so bearbeitet werden, dass sie größer oder kleiner sind
  • Hand-Flip – Wird zum Aufrufen eines Ui-Startbereichs oder handmenüs verwendet
  • Palm up – Wird zum Hummingbird-Moment im Out of the Box-Erlebnis verwendet. Ein weiterer Vorschlag könnte sein, einen Benutzeroberflächenstartbereich zu erstellen.
  • Scrollen – Wird zum Scrollen einer Liste oder eines langen Dokuments verwendet

Beispielszene

Beispiele finden Sie in der HandCoachExample-Szene unter: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes

Hand-3D-Ressourcen

Sie finden die Ressourcen unter: MixedRealityToolkit.SDK/Experimental/HandCoach

Qualität

Wenn Sie Verzerrungen im hautierten Gitter bemerken, müssen Sie sicherstellen, dass Ihr Projekt die richtige Menge an Gelenken verwendet. Wechseln Sie zum Edit > Project Einstellungen > Quality > Other > Blend Weights. Stellen Sie sicher, dass "4 Knochen" ausgewählt sind, um glatte Gelenke zu sehen. Project Setting

Skripts

Interaktionshinweis

Das InteractionHint.cs Skript bietet Wrapperfunktionen zum Auslösen von Animationen und Fades für das Hand rig.

Einrichten einer Interaktionshinweise

Um einen Interaktionshinweis einzurichten, empfiehlt es sich, die bereitgestellten Prefabs "StaticHandCoachRoot_L.prefab" und "StaticHandCoachRoot_R.prefab" zu verwenden. Diese Prefab enthält das InteractionHint-Skript und das Hand-Rig sowie die richtige Hierarchie, um sicherzustellen, dass die bereitgestellten Hintanimationen wie vorgesehen funktionieren. Andernfalls müssen Sie das Skript auf einem GameObject auf einer übergeordneten Ebene von Ihrem Hand-Rig mit Animator platzieren.

Inspektoreigenschaften

  • HideIfHandTracked Dieser boolesche Zustand gibt an, ob der Handverfolgungszustand verwendet werden soll, um visuelle Elemente auszublenden, wenn die Hände eines Benutzers nachverfolgt werden. Wenn dies auf "false" festgelegt ist, wird nur die Skripting-Eigenschaft "customShouldHideVisuals" verwendet, um festzustellen, ob der Hinweis ausgeblendet werden soll.

  • MinDelay Diese Eigenschaft gibt die minimale Verzögerung für die Darstellung der Visuellen an. Standardmäßig werden die Visuellen für die Hand nach dieser vielen Sekunden angezeigt, wenn die Hände des Benutzers nicht nachverfolgt werden.

  • MaxDelay Diese Eigenschaft gibt die maximale Verzögerung für die Anzeige der Visuellen an. Standardmäßig werden die Visuellen für die Hand nach dieser vielen Sekunden angezeigt, auch wenn die Hände des Benutzers nachverfolgt werden.

  • UseMaxTimer Wenn dieser boolesche Wert auf "false" festgelegt ist, deaktiviert er den maximalen Zeitgeber und ermöglicht nur, dass die Handhinweise angezeigt werden können, wenn die Hände des Benutzers nicht angezeigt werden, oder die benutzerdefinierte Bedingung gibt false zurück.

  • Wiederholt Diese Eigenschaft steuert, wie oft die Hintanimation wiedergegeben wird, wenn der Min- oder Max-Timer übergeben wurde. Der Hinweis blendet dann aus und wartet erneut auf die Verzögerung.

  • AutoActivate Wenn dieser boolesche Wert auf "true" festgelegt ist, wird der Hinweis automatisch über die Zeitgeberlogik ausgeführt, wenn das GameObject des Skripts in der Hierarchie aktiv ist und das Skript aktiviert ist. Dies sollte nur auf "false" festgelegt werden, wenn Sie das Aussehen und Das Verschwinden des Hinweiss manuell über Code steuern möchten.

  • AnimationState Der Name des Animationszustands, der wiedergegeben werden soll, wenn der Hinweis aktiv ist. Dies muss festgelegt werden, bevor die StartHintLoop()-Funktion aufgerufen wird (während OnEnable, wenn AutoActivate überprüft wird).

Steuern von InteraktionHint über Skript

  • StartHintLoop Diese Funktion startet die Anzeige-/Ausblendeschleife, die andernfalls OnEnable startet, wenn das AutoActivate-Flag auf "true" festgelegt ist.
  • StopHintLoop Diese Funktion ruft den Ausblendungsanimationszustand auf, wenn sie derzeit nicht wiedergegeben wird, und deaktiviert dann die Anzeige-/Ausblendeschleife und legt das Hand-Rig inaktiv in der Hierarchie fest.
  • AnimationState Diese Zeichenfolge bestimmt, welche Animationszustände während der Schleife wiedergegeben werden. Sie können diese Zeichenfolge ändern, um zu ändern, welchen Zustand wiedergegeben wird, aber Sie müssen dies nach dem Aufrufen von StopHintLoop tun, und Sie müssen StartHintLoop erneut aufrufen, nachdem Sie den Status geändert haben.
  • CustomShouldHideVisuals Sie können dies mit Ihrer eigenen Funktion festlegen, die true zurückgeben sollte, wenn Sie die Hand-Visuelle ausblenden möchten (beachten Sie den MinMaxTimer, insbesondere den max-Parameter)

Überlegungen zur benutzerdefinierten Animation

Fades sind standardmäßig auf 0,5 Sekunden festgelegt, sodass alle benutzerdefinierten Animationen, die für die Verwendung mit dem Rig erstellt wurden, mindestens 1,5 Sekunden für aussagekräftige Informationen sein sollten, die übermittelt werden sollen.

Die bereitgestellten Standardblenden- und Ausblendenstatus, Fade_In und Fade_Out können angepasst werden, indem sie den Zeitstempel des zweiten Keyframes ändern, um die Fadenlänge festzulegen.

Der Animator und das Skript wurden so eingerichtet, dass die Einrichtung so einfach wie möglich sein sollte. Um neue Animationszustände hinzuzufügen, importieren Sie einfach Ihre FBX, stellen Sie sicher, dass der Animationsname mit einem eindeutigen Namen festgelegt ist, und ziehen Sie diese Animation in den Animator.

MoveToTarget

Das MoveToTarget.cs-Skript bietet Funktionen zum Verschieben der Handhinweise von einer Nachverfolgungsposition in eine Zielposition im Laufe der Zeit.

Einrichten von MoveToTarget

Die bereitgestellten Prefabs "MovingHandCoachRoot_L.prefab" und "MovingHandCoachRoot_R.prefab" enthalten einen MoveToTarget in ihren Hierarchien. Wenn Sie dieses Skript auf ihrem eigenen Setup verwenden möchten, müssen Sie es auf dem Stammspielobjekt platzieren, das den Animator für Ihr Rig enthält.

Inspektoreigenschaften

  • TrackingObject Legen Sie dies mit dem Objekt fest, dem Sie folgen möchten, bevor die Bewegung gestartet wird. Es wird empfohlen, ein leeres GameObject zu erstellen und an eine bestimmte Position zu verschieben, damit Sie die Nachverfolgung anheften können.
  • TargetObject Legen Sie dies mit dem Objekt fest, zu dem sie während der Bewegung wechseln möchten. Es wird empfohlen, ein leeres GameObject zu erstellen und an eine bestimmte Position zu verschieben, damit Sie die Nachverfolgung anheften können.
  • RootObject Legen Sie dies auf ein freigegebenes übergeordnetes Element zwischen Nachverfolgung und Zielobjekt fest, sodass die relativen Positionen ordnungsgemäß berechnet werden können. Das eingeschlossene Prefab verfügt sowohl über Nachverfolgungs- als auch Zielobjekte in der Hierarchie, aber Sie können das Zielobjekt außerhalb des Prefab festlegen und das Stammobjekt in ein freigegebenes übergeordnetes Element ändern.
  • Dauer Die Zeit, die es (in Sekunden) dauern sollte, um von TrackingObject zu TargetObject in Sekunden zu wechseln.
  • TargetOffset Ein tunbarer Offset, um das GameObject abzurufen, um die richtige Zielposition zu erreichen. Dies ist nützlich, wenn Ihre Animation während der Animation einen Position offset enthält.
  • AnimationCurve Dies ist standardmäßig auf eine lineare Kurve festgelegt, aber Sie können die Kurve ändern, um die Beschleunigung beim Starten und Beenden des Bewegungspfads bereitzustellen.

Steuern von MoveToTarget über Skript

Führen Sie in Ihrem benutzerdefinierten Skript einen Aufruf an Follow() aus, während die Handanlage dem TrackingObject folgen soll, und rufen Sie dann MoveToTargetPosition() auf, wenn die Handanlage ihre Bewegung auf das TargetObject beginnt.

Steuern von MoveToTarget über Animationen

Legen Sie in der Animation, die verschoben werden muss, zwei Ereignisse fest: eine mit einem Aufruf von Follow() und einer mit einem Aufruf zu MoveToTargetPosition(). Die Folgenden sollten auf dem ersten Keyframe festgelegt werden, da die Handanlage dazu führt, dass Ihr TrackingObject folgt. MoveToTargetPosition sollte auf dem Keyframe festgelegt werden, in dem das Rig zum Ziel wechseln soll. Dies ist die Verwendung der Skriptfunktionen in den bereitgestellten Prefabs.

Drehen vonAroundPoint

Das Skript "RotateAroundPoint.cs" bietet Funktionen zum Drehen der Handanmerkung um einen Pivotpunkt im Laufe der Zeit.

Einrichten von RotateAroundPoint

Die bereitgestellten Prefabs "RotatingHandCoachRoot_L.prefab" und "RotatingHandCoachRoot_R.prefab" enthalten eine RotateAroundPoint in ihren Hierarchien. Wenn Sie dieses Skript auf ihrem eigenen Setup verwenden möchten, müssen Sie es auf dem Stammspielobjekt platzieren, das den Animator für Ihr Rig enthält.

Inspektoreigenschaften

  • ZentriertParent Legen Sie dies mit dem übergeordneten Objekt fest, um das Rig zu pivotieren.
  • InverseParent Legen Sie dies mit dem übergeordneten Element fest, um inverse zu zentriertParent zu drehen, um die Handausrichtung gleich zu halten. Im Allgemeinen ist dies das übergeordnete Objekt mit dem InteractionHint-Skript darauf.
  • PivotPosition Legen Sie dies auf einen Punkt fest, an dem der Hinweis gestartet werden soll.
  • Dauer Die Zeit, die es (in Sekunden) dauern sollte, um um den zentriertenParent zu drehen.
  • AnimationCurve Dies ist standardmäßig auf eine lineare Kurve festgelegt, aber Sie können die Kurve ändern, um die Beschleunigung beim Starten und Beenden des Bewegungspfads bereitzustellen.
  • RotationVector Wie viele Grad auf jeder Achse gedreht werden sollen.

Steuern von RotateAroundPoint über Skript

Geben Sie in Ihrem benutzerdefinierten Skript einen Aufruf an RotateToTarget() an, wenn Sie möchten, dass das Handgerät seine Drehung um den zentriertenParent beginnt. Wenn Sie möchten, dass die Position auf die ursprüngliche PivotPosition zurückgesetzt werden soll, rufen Sie ResetAndDeterminePivot() auf.

Steuern von RotateAroundPoint über Animationen

Legen Sie in der Animation, die verschoben werden muss, zwei Ereignisse fest: eine mit einem Aufruf auf ResetAndDeterminePivot() und eine mit einem Aufruf zu RotateToTarget(). ResetAndDeterminePivot sollte auf dem ersten Keyframe festgelegt werden, da die Handeinrichtung auf die PivotPosition zurückgesetzt wird. RotateToTarget sollte auf dem Keyframe festgelegt werden, an dem das Rig mit dem Drehen um das CenteredParent beginnen soll. So wird die Skriptfunktionalität in den bereitgestellten Prefabs verwendet.