Gesten in Unity
Es gibt zwei wichtige Möglichkeiten, um ihre Blicke in Unity, Handgesten und Bewegungscontrollern in HoloLens und immersivem HMD zu ergreifen. Sie greifen auf die Daten für beide Quellen der räumlichen Eingabe über die gleichen APIs in Unity zu.
Unity bietet zwei primäre Möglichkeiten für den Zugriff auf räumliche Eingabedaten für Windows Mixed Reality. Die allgemeinen Input.GetButton/Input.GetAxis-APIs funktionieren über mehrere Unity XR-SDKs hinweg, während die interactionManager/GestureRecognizer-API speziell für Windows Mixed Reality den vollständigen Satz räumlicher Eingabedaten verfügbar macht.
ApIs für zusammengesetzte Gesten auf hoher Ebene (GestureRecognizer)
Namespace: UnityEngine.XR.WSA.Input
Typen: GestureRecognizer, GestureSettings, InteractionSourceKind
Ihre App kann auch zusammengesetzte Gesten auf höherer Ebene für räumliche Eingabequellen, Tippen, Halten, Manipulation und Navigationsgesten erkennen. Mithilfe des GestureRecognizers können Sie diese zusammengesetzten Gesten sowohl über die Hände als auch über Bewegungscontroller erkennen.
Jedes Gestikereignis auf dem GestureRecognizer stellt das SourceKind für die Eingabe sowie den Zielkopfstrahl zum Zeitpunkt des Ereignisses bereit. Einige Ereignisse stellen zusätzliche kontextspezifische Informationen bereit.
Es sind nur einige Schritte erforderlich, um Gesten mithilfe einer Gestenerkennung zu erfassen:
- Erstellen einer neuen Gestenerkennung
- Angeben, welche Gesten überwacht werden sollen
- Abonnieren von Ereignissen für diese Gesten
- Starten der Erfassung von Gesten
Erstellen einer neuen Gestenerkennung
Um den GestureRecognizer zu verwenden, müssen Sie einen GestureRecognizer erstellt haben:
GestureRecognizer recognizer = new GestureRecognizer();
Angeben, welche Gesten überwacht werden sollen
Geben Sie an, welche Gesten Sie über SetRecognizableGestures()verwenden möchten:
recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);
Abonnieren von Ereignissen für diese Gesten
Abonnieren Sie Ereignisse für die Gesten, an denen Sie interessiert sind.
void Start()
{
recognizer.Tapped += GestureRecognizer_Tapped;
recognizer.HoldStarted += GestureRecognizer_HoldStarted;
recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}
Hinweis
Navigations- und Manipulationsgesten schließen sich für eine Instanz eines GestureRecognizers gegenseitig aus.
Starten der Erfassung von Gesten
Standardmäßig überwacht ein GestureRecognizer die Eingabe erst, wenn StartCapturingGestures() aufgerufen wird. Es ist möglich, dass ein Gestikereignis generiert werden kann, nachdem StopCapturingGestures() aufgerufen wird, wenn die Eingabe vor dem Frame ausgeführt wurde, in dem StopCapturingGestures() verarbeitet wurde. Der GestureRecognizer merkt sich, ob es während des vorherigen Frames, in dem die Geste tatsächlich aufgetreten ist, aktiviert oder deaktiviert wurde. Daher ist es zuverlässig, die Gestenüberwachung basierend auf der Ausrichtung dieses Frames zu starten und zu beenden.
recognizer.StartCapturingGestures();
Beenden der Erfassung von Gesten
So beenden Sie die Gestikerkennung:
recognizer.StopCapturingGestures();
Entfernen einer Gestikerkennung
Denken Sie daran, das Abonnement von abonnierten Ereignissen abbestellen, bevor Sie ein GestureRecognizer-Objekt zerstören.
void OnDestroy()
{
recognizer.Tapped -= GestureRecognizer_Tapped;
recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}
Rendern des Bewegungscontrollermodells in Unity
Bewegungscontrollermodell und Teleportierung
Zum Rendern von Bewegungscontrollern in Ihrer App, die den physischen Controllern entsprechen, die Ihre Benutzer halten und formulieren, während verschiedene Tasten gedrückt werden, können Sie das MotionController-Prefab im Mixed Reality-Toolkit verwenden. Dieses Prefab lädt das richtige glTF-Modell zur Laufzeit dynamisch vom installierten Bewegungscontrollertreiber des Systems. Es ist wichtig, diese Modelle dynamisch zu laden, anstatt sie manuell im Editor zu importieren, damit Ihre App physische 3D-Modelle für alle aktuellen und zukünftigen Controller anzeigt, die Ihre Benutzer möglicherweise haben.
- Folgen Sie den Anweisungen für die ersten Schritte , um das Mixed Reality-Toolkit herunterzuladen und es Zu Ihrem Unity-Projekt hinzuzufügen.
- Wenn Sie Ihre Kamera durch den MixedRealityCameraParent Prefab als Teil der Schritte "Erste Schritte" ersetzt haben, können Sie loslegen! Dieser Prefab enthält das Rendern des Bewegungscontrollers. Fügen Sie andernfalls Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab aus dem Projektbereich zu Ihrer Szene hinzu. Sie möchten diesen Prefab als untergeordnetes Element des übergeordneten Objekts hinzufügen, das Sie verwenden, um die Kamera zu verschieben, wenn der Benutzer innerhalb der Szene teleportiert, sodass die Controller mit dem Benutzer zusammenkommen. Wenn Ihre App keine Teleportierung erfordert, fügen Sie einfach das Prefab am Stamm der Szene hinzu.
Auslösen von Objekten
Das Werfen von Objekten in der virtuellen Realität ist ein schwierigeres Problem, als es zu Beginn erscheinen kann. Wie bei den meisten physisch basierten Interaktionen wirkt das Auslösen im Spiel unerwartet, es ist sofort offensichtlich und bricht die Immersion. Wir haben einige Zeit damit verbracht, tief darüber nachzudenken, wie sie ein physisch korrektes Wurfverhalten darstellen und einige Richtlinien erstellt haben, die durch Updates für unsere Plattform aktiviert wurden, die wir für Sie freigeben möchten.
Hier finden Sie ein Beispiel dafür, wie Wir empfehlen, das Auslösen hier zu implementieren. Dieses Beispiel folgt den folgenden vier Richtlinien:
Verwenden Sie die Geschwindigkeit des Controllers anstelle der Position. Im November-Update auf Windows haben wir eine Verhaltensänderung eingeführt, wenn sich der Positionsnachverfolgungszustand "Ungefähr" befindet. In diesem Zustand werden Geschwindigkeitsinformationen über den Controller weiterhin so lange gemeldet, wie wir glauben, dass ihre hohe Genauigkeit, die oft länger als die Position ist, eine hohe Genauigkeit bleibt.
Integrieren Sie die Winkelgeschwindigkeit des Controllers. Diese Logik ist alle in der
throwing.cs
Datei in derGetThrownObjectVelAngVel
statischen Methode enthalten, innerhalb des oben verknüpften Pakets:Da die Winkelgeschwindigkeit erhalten ist, muss das ausgelöste Objekt die gleiche Winkelgeschwindigkeit beibehalten, wie sie im Moment des Wurfs hatte:
objectAngularVelocity = throwingControllerAngularVelocity;
Da die Mitte der Masse des ausgelösten Objekts wahrscheinlich nicht am Ursprung der Griff-Pose liegt, hat sie wahrscheinlich eine andere Geschwindigkeit als die des Controllers im Rahmen des Bezugs des Benutzers. Der Teil der Geschwindigkeit des Objekts auf diese Weise beigetragen hat, ist die sofortige Tangentialgeschwindigkeit der Mitte des ausgelösten Objekts um den Controllerursprung. Diese Tangentialgeschwindigkeit ist das Kreuzprodukt der Winkelgeschwindigkeit des Controllers mit dem Vektor, der den Abstand zwischen dem Controllerursprung und der Mitte des ausgelösten Objekts darstellt.
Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos; Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
Die Gesamtgeschwindigkeit des ausgelösten Objekts ist die Summe der Geschwindigkeit des Controllers und dieser Tangentialgeschwindigkeit:
objectVelocity = throwingControllerVelocity + tangentialVelocity;
Achten Sie genau auf die Zeit, zu der wir die Geschwindigkeit anwenden. Wenn eine Taste gedrückt wird, kann es bis zu 20 ms dauern, bis dieses Ereignis über Bluetooth bis zum Betriebssystem bubiert. Dies bedeutet, dass der Controller informationen, die Sie erhalten, tatsächlich vor dieser Änderung des Zustands stehen, wenn Sie eine Änderung des Controllerzustands von gedrücktem Zustand in "Nicht gedrückt" oder umgekehrt abrufen. Darüber hinaus wird die von unserer Umfrage-API dargestellte Controller-Pose weitergeleitet, um eine wahrscheinliche Pose zum Zeitpunkt der Anzeige des Frames darzustellen, der in Zukunft mehr als 20 ms sein könnte. Dies eignet sich gut für das Rendern gehaltener Objekte, aber das Zeitproblem für die Zielbestimmung des Objekts wird beim Berechnen der Flugbahn für den Moment berechnet, in dem der Benutzer den Wurf losgelassen hat. Glücklicherweise enthält der Zustand mit dem November-Update, wenn ein Unity-Ereignis wie InteractionSourcePressed oder InteractionSourceReleased gesendet wird, die historischen Posendaten zurück, als die Schaltfläche gedrückt oder freigegeben wurde. Um die genaueste Controllerrendering- und Controlleradressierung während der Throws zu erhalten, müssen Sie das Abrufen und Ereignis ordnungsgemäß verwenden, je nach Bedarf:
- Damit der Controller jeden Frame rendert, sollte Ihre App das GameObject des Controllers an der vorwärts prognostizierten Controllerposition für die Photonzeit des aktuellen Frames positionieren. Sie erhalten diese Daten aus Unity-Abruf-APIs wie XR. InputTracking.GetLocalPosition oder XR. WSA. Input.InteractionManager.GetCurrentReading.
- Für die Controlleradressierung auf eine Pressemitteilung oder Veröffentlichung sollte Ihre App Raycast erstellen und Flugbahnen basierend auf der historischen Controller-Pose für dieses Pressemitteilungs- oder Freigabeereignis berechnen. Sie erhalten diese Daten aus Unity-Ereignis-APIs, z. B. InteractionManager.InteractionSourcePressed.
Verwenden Sie die Griff-Pose. Winkelgeschwindigkeit und Geschwindigkeit werden relativ zur Griffposition gemeldet, nicht zeigerposiert.
Das Auslösen wird mit zukünftigen Windows-Updates weiter verbessert, und Sie können davon ausgehen, dass Sie hier weitere Informationen dazu finden.
Gestik- und Bewegungscontroller in MRTK
Sie können über den Eingabe-Manager auf Gesten und Bewegungscontroller zugreifen.
Immer am Ball mit Tutorials
Schritt-für-Schritt-Lernprogramme mit detaillierteren Anpassungsbeispielen sind in der Mixed Reality Academy verfügbar:
MR Input 213 - Bewegungscontroller
Nächster Entwicklungsprüfpunkt
Wenn Sie die Unity-Entwicklungsreise verfolgt haben, die wir eingerichtet haben, befinden Sie sich mitten in der Erkundung der MRTK-Kernbausteine. Von hier aus können Sie mit dem nächsten Baustein fortfahren:
Oder fahren Sie mit den Funktionen und APIs der Mixed Reality-Plattform fort:
Sie können jederzeit zu den Prüfpunkten für die Unity-Entwicklung zurückkehren.