Handtrainer — MRTK2
Handtrainer ist eine 3D-modellierte Hand, die ausgelöst wird, wenn das System die Hände des Benutzers nicht erkennt. Dies wird als "Lehrkomponente" implementiert, die den Benutzer leitet, wenn die Geste nicht gelehrt wurde. Wenn Benutzer die angegebene Geste für einen bestimmten Zeitraum nicht ausgeführt haben, werden die Hände verzögert schleifen. Handtrainer kann verwendet werden, um das Drücken einer Taste oder das Aufsammeln eines Hologramms darzustellen.
Das aktuelle Interaktionsmodell stellt eine Vielzahl von Gestensteuerelementen dar, z. B. Scrolling, Far Select und Near Tap. Im Folgenden finden Sie eine vollständige Liste mit vorhandenen Hand-Coach-Beispielen:
- Fast tippen – Wird für Schaltflächen oder Schließen interagierbarer Objekte verwendet
- Far select – Wird für Objekte verwendet, die weit entfernt sind
- Move : Wird verwendet, um ein Hologramm im Raum zu bewegen
- Rotieren : Wird verwendet, um zu zeigen, wie Hologramme oder Objekte gedreht werden.
- Skalierung: Wird verwendet, um zu zeigen, wie Hologramme so bearbeitet werden, dass sie größer oder kleiner sind
- Handdrehen – Wird zum Aufrufen eines Ui-Startbereichs oder eines Handmenüs verwendet
- Palm up – Wird für Kolibri-Moment in out of the Box-Erfahrung verwendet. Ein weiterer Vorschlag könnte das Aufrufen eines Ui-Startbereichs sein.
- 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 auf dem skinned Mesh bemerken, müssen Sie sicherstellen, dass Ihr Projekt die richtige Anzahl von Gelenken verwendet. Wechseln Sie zu Unitys Projekteinstellungen > bearbeiten > Qualität > Andere > Mischgewichte. Stellen Sie sicher, dass "4 Knochen" ausgewählt sind, um Glatte Gelenke zu sehen.
Skripts
Interaktionshinweise
Das InteractionHint.cs
Skript bietet Wrapperfunktionen zum Auslösen von Animationen und Fades für das Hand rig.
Einrichten eines Interaktionshinweises
Um einen Interaktionshinweis einzurichten, wird empfohlen, die bereitgestellten Prefabs "StaticHandCoachRoot_L.prefab" und "StaticHandCoachRoot_R.prefab" zu verwenden. Dieses Prefab enthält das InteractionHint-Skript und das Hand rig sowie die richtige Hierarchie, um sicherzustellen, dass die bereitgestellten Hinweisanimationen wie vorgesehen funktionieren. Andernfalls müssen Sie das Skript auf einem gameObject-Objekt platzieren, das eine übergeordnete Ebene von Ihrem Handgerät mit Animator entfernt ist.
Eigenschaften des Inspektors
HideIfHandTracked Dieser boolesche Wert gibt an, ob der Zustand der Handnachverfolgung verwendet werden soll, um Visuals auszublenden, wenn die Hände eines Benutzers nachverfolgt werden. Wenn dies auf false festgelegt ist, wird nur die Skripteigenschaft "customShouldHideVisuals" verwendet, um zu bestimmen, ob der Hinweis ausgeblendet werden soll.
MinDelay Diese Eigenschaft gibt die minimale Verzögerung für die Anzeige der Visuals an. Standardmäßig werden die Visuals für die Hand nach so 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 Visuals an. Standardmäßig werden die Visuals für die Hand nach so 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 Timer und erlaubt nur, dass der Handhinweis angezeigt wird, wenn die Hände des Benutzers nicht sichtbar sind, oder die benutzerdefinierte Bedingung false zurückgibt.
Wiederholt Diese Eigenschaft steuert, wie oft die Hinweisanimation abgespielt wird, wenn der Zeitgeber "min" oder "max" abgelaufen ist. Der Hinweis wird dann ausgeblendet und wartet erneut auf die Verzögerung.
AutoAktivieren Wenn dieser boolesche Wert auf true festgelegt ist, wird der Hinweis automatisch durch die Timerlogik ausgeführt, wenn das GameObject des Skripts in der Hierarchie aktiv ist und das Skript aktiviert ist. Dies sollte nur dann auf false festgelegt werden, wenn Sie die Darstellung und das Verschwinden des Hinweises per Code manuell steuern möchten.
AnimationState Der Name des Animationszustands, der wiedergegeben werden soll, wenn der Hinweis aktiv ist. Dies muss festgelegt werden, bevor die Funktion StartHintLoop() aufgerufen wird (während OnEnable, wenn AutoActivate aktiviert ist).
Steuern von InteractionHint per Skript
- StartHintLoop Diese Funktion startet die Ein-/Ausblendeschleife, die andernfalls OnEnable startet, wenn das AutoActivate-Flag auf true festgelegt ist.
- StopHintLoop Diese Funktion ruft den Ausblendanimationszustand auf, wenn er gerade nicht wiedergegeben wird, deaktiviert dann die Ein-/Ausblendeschleife und legt das Handgerät inaktiv in der Hierarchie fest.
- AnimationState Diese Zeichenfolge bestimmt, welcher Animationszustand während der Schleife wiedergegeben wird. Sie können diese Zeichenfolge ändern, um zu ändern, welcher Zustand wiedergegeben wird, aber Sie müssen dies nach dem Aufruf von StopHintLoop tun, und Sie müssen StartHintLoop erneut aufrufen, nachdem Sie den Zustand geändert haben.
- CustomShouldHideVisuals Sie können dies mit Ihrer eigenen Funktion festlegen, die true zurückgeben sollte, wenn Sie die Handvisuals ausblenden möchten (beachten Sie den MinMaxTimer, insbesondere den max-Parameter).
Überlegungen zur benutzerdefinierten Animation
Ausblendvorgänge sind standardmäßig auf 0,5 Sekunden festgelegt. Daher sollten alle benutzerdefinierten Animationen, die für die Verwendung mit dem Rig erstellt wurden, mindestens 1,5 Sekunden lang sein, damit aussagekräftige Informationen übermittelt werden können.
Die bereitgestellten Standard-Ein- und Ausblendzustände, Fade_In und Fade_Out können durch Ändern des Zeitstempels des zweiten Keyframes angepasst werden, um die Einblendlä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 Ihren 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 des Handhinweiss von einer Überwachungsposition in eine Zielposition im Laufe der Zeit.
Einrichten von MoveToTarget
Die bereitgestellten Prefabs "MovingHandCoachRoot_L.prefab" und "MovingHandCoachRoot_R.prefab" enthalten ein MoveToTarget in ihren Hierarchien. Wenn Sie dieses Skript in Ihrem eigenen Setup verwenden möchten, müssen Sie es auf dem Root-Gameobjekt platzieren, das den Animator für Ihr Rig enthält.
Eigenschaften des Inspektors
- TrackingObject Legen Sie dies mit dem Objekt fest, dem das Rig folgen soll, bevor die Bewegung gestartet wird. Es wird empfohlen, ein leeres GameObject zu erstellen und es an eine bestimmte Position zu verschieben, um die Nachverfolgung zu lokalisieren.
- TargetObject Legen Sie dies mit dem Objekt fest, zu dem das Rig während seiner Bewegung verschoben werden soll. Es wird empfohlen, ein leeres GameObject zu erstellen und es an eine bestimmte Position zu verschieben, um die Nachverfolgung zu lokalisieren.
- RootObject Legen Sie dies auf ein freigegebenes übergeordnetes Element zwischen Der Nachverfolgung und dem Zielobjekt fest, damit die relativen Positionen korrekt berechnet werden können. Das enthaltene Prefab enthält sowohl Tracking- als auch Zielobjekte in seiner Hierarchie, aber Sie können das Zielobjekt als gameObject außerhalb des Prefab festlegen und das Stammobjekt in ein freigegebenes übergeordnetes Objekt ändern.
- Dauer Die Zeitspanne, die (in Sekunden) benötigt werden sollte, um von TrackingObject zu TargetObject zu wechseln.
- TargetOffset Ein abstimmbarer Offset, damit das GameObject die richtige Zielposition erreicht. Dies ist nützlich, wenn Ihre Animation während der Animation einen Positionsoffset enthält.
- AnimationCurve Dies ist standardmäßig auf eine lineare Kurve festgelegt, aber Sie können die Kurve ändern, um beim Starten und Beenden des Bewegungspfads eine Beschleunigung zu ermöglichen.
Steuern von MoveToTarget per Skript
Rufen Sie in Ihrem benutzerdefinierten Skript Follow() auf, während das Handgerät dem TrackingObject folgt, und rufen Sie dann MoveToTargetPosition() auf, wenn das Handgerät seine Bewegung zum TargetObject beginnen soll.
Steuern von MoveToTarget über Animationen
Legen Sie in der Animation, die verschoben werden muss, zwei Ereignisse fest: eines mit einem Aufruf von Follow() und eines mit einem Aufruf von MoveToTargetPosition(). Folgen sollte für den ersten Keyframe festgelegt werden, da das Handgerät ihrem TrackingObject folgt. MoveToTargetPosition sollte für den Keyframe festgelegt werden, an dem das Rig zum Ziel verschoben werden soll. So wird die Skriptfunktionalität in den bereitgestellten Prefabs verwendet.
RotateAroundPoint
Das Skript RotateAroundPoint.cs bietet Funktionen zum Drehen des Handhinweiss um einen Pivotpunkt im Laufe der Zeit.
Einrichten von RotateAroundPoint
Die bereitgestellten Prefabs "RotatingHandCoachRoot_L.prefab" und "RotatingHandCoachRoot_R.prefab" enthalten einen RotateAroundPoint in ihren Hierarchien. Wenn Sie dieses Skript in Ihrem eigenen Setup verwenden möchten, müssen Sie es auf dem Root-Gameobjekt platzieren, das den Animator für Ihr Rig enthält.
Eigenschaften des Inspektors
- CenteredParent Legen Sie dies mit dem übergeordneten Objekt fest, um das das Rig herum pivotieren soll.
- InverseParent Legen Sie dies mit dem übergeordneten Element fest, um invers zu zentriert zu drehenParent, um die Handausrichtung gleich zu halten. Im Allgemeinen ist dies das übergeordnete Objekt mit dem InteractionHint-Skript.
- PivotPosition Legen Sie dies auf einen Punkt fest, an dem der Hinweis mit der Bewegung beginnen soll.
- Dauer Die Zeit, die (in Sekunden) benötigt werden sollte, um das CenteredParent zu rotieren.
- AnimationCurve Dies ist standardmäßig auf eine lineare Kurve festgelegt, aber Sie können die Kurve ändern, um beim Starten und Beenden des Bewegungspfads eine Beschleunigung zu ermöglichen.
- RotationVector Wie viele Grad auf jeder Achse gedreht werden sollen.
Steuern von RotateAroundPoint per Skript
Rufen Sie in Ihrem benutzerdefinierten Skript RotateToTarget() auf, wenn das Handgerät seine Drehung um das CenteredParent beginnen soll. Wenn 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: eines mit einem Aufruf von ResetAndDeterminePivot() und eines mit einem Aufruf von RotateToTarget(). ResetAndDeterminePivot sollte für den ersten Keyframe festgelegt werden, da das Hand-Rig auf die PivotPosition zurückgesetzt wird. RotateToTarget sollte für den Keyframe festgelegt werden, an dem das Rig beginnen soll, sich um centeredParent zu drehen. Auf diese Weise wird die Skriptfunktionalität in den bereitgestellten Prefabs verwendet.