Handtracking in Unreal

Das Handverfolgungssystem verwendet die Handflächen und Finger einer Person als Eingabe. Daten zur Position und Drehung jedes Fingers, der gesamten Handfläche und der Handgesten sind verfügbar. Ab Unreal 4.26 basiert die Handverfolgung auf dem Unreal HeadMountedDisplay-Plug-In und verwendet eine gemeinsame API für alle XR-Plattformen und -Geräte. Die Funktionalität ist für Windows Mixed Reality- und OpenXR-Systeme identisch.

Handhaltung

Mit Handhaltung können Sie die Hände und Finger Ihrer Benutzer als Eingabe nachverfolgen und verwenden, auf die sowohl in Blaupausen als auch in C++ zugegriffen werden kann. Die Unreal-API sendet die Daten als Koordinatensystem, wobei Ticks mit der Unreal Engine synchronisiert werden.

Handskelettbild mit Gelenken überlagernHandskelett

Die Hierarchie wird durch EHandKeypoint Aufzählung beschrieben:

Abbildung der Handschlüsselpunkt-Bluprint-Optionen

Sie können alle diese Daten aus den Händen eines Benutzers abrufen, indem Sie die Funktion Get Motion Controller Data verwenden. Diese Funktion gibt eine XRMotionControllerData-Struktur zurück. Im Folgenden finden Sie ein Blaupausen-Beispielskript, das die XRMotionControllerData-Struktur analysiert, um handgelenkte Speicherorte abzurufen und ein Debugkoordinatensystem an der Position jedes Gelenks zu zeichnet.

Blaupause der Get-Gaze-Datenfunktion, die mit der Zeilenverfolgung nach Kanalfunktion verbunden ist

Es ist wichtig, zu überprüfen, ob die Struktur gültig ist und ob es sich um eine Hand handelt. Andernfalls erhalten Sie möglicherweise ein undefiniertes Verhalten beim Zugriff auf Positionen, Drehungen und Radienarrays.

Handhaltungen werden mithilfe des Live Link-Plug-Ins für Animation verfügbar gemacht.

Wenn die Windows Mixed Reality- und Live Link-Plug-Ins aktiviert sind:

  1. Wählen Sie Fenster > Livelink aus, um das Fenster Live Link-Editor zu öffnen.
  2. Wählen Sie Quelle aus, und aktivieren Sie Windows Mixed Reality Handverfolgungsquelle.

Quelle für Livelinks

Nachdem Sie die Quelle aktiviert und ein Animationsobjekt geöffnet haben, erweitern Sie den Abschnitt Animation auf der Registerkarte Vorschauszene . Weitere Optionen finden Sie ebenfalls.

Livelinkanimation

Die Handanimationshierarchie ist identisch mit der in EWMRHandKeypoint. Animationen können mithilfe von WindowsMixedRealityHandTrackingLiveLinkRemapAsset neu zugewiesen werden:

Live Link Animation 2

Sie kann auch im Editor unterklassiert werden:

Live Link Remap

Handgitter

Wichtig

Handgitter erfordert OpenXR.

Das Microsoft OpenXR-Plug-In muss verwendet werden, verfügbar über den Unreal Marketplace oder über GitHub.

Handgitter als nachverfolgte Geometrie

Wichtig

Um Handgitter als nachverfolgte Geometrie in OpenXR zu erhalten, müssen Sie Set Use Hand Mesh with Enabled Tracking Geometry aufrufen.

Um diesen Modus zu aktivieren, sollten Sie Set Use Hand Mesh with Enabled Tracking Geometry aufrufen:

Blaupause des Ereignisbeginns mit der Wiedergabe verbunden, um die Verwendung der Handgitterfunktion mit aktiviertem Nachverfolgungsgeometriemodus festzulegen

Hinweis

Es ist nicht möglich, dass beide Modi gleichzeitig aktiviert werden. Wenn Sie einen aktivieren, wird die andere automatisch deaktiviert.

Zugreifen auf Handgitterdaten

Handgitter

Bevor Sie auf Handgitterdaten zugreifen können, müssen Sie Folgendes ausführen:

  • Wählen Sie Ihre ARSessionConfig-Ressource aus, erweitern Sie die EINSTELLUNGEN FÜR AR-Einstellungen –> Weltzuordnung , und aktivieren Sie Gitterdaten aus nachverfolgter Geometrie generieren.

Im Folgenden finden Sie die Standardgitterparameter:

  1. Verwenden von Mesh Data for Occlusion
  2. Generieren von Kollisionen für Gitterdaten
  3. Generieren von Nav Mesh für Gitterdaten
  4. Rendern von Gitterdaten im Wireframe – Debugparameter, der generiertes Gitter anzeigt

Diese Parameterwerte werden als Räumliche Zuordnungsgitter und Handgitterstandard verwendet. Sie können sie jederzeit in Blaupausen oder Code für jedes Gitter ändern.

C++-API-Referenz

Verwenden Sie EEARObjectClassification , um Handgitterwerte in allen nachverfolgbaren Objekten zu finden.

enum class EARObjectClassification : uint8
{
    // Other types
	HandMesh,
};

Die folgenden Delegatten werden aufgerufen, wenn das System ein nachverfolgbares Objekt erkennt, einschließlich eines Handgitters.

class FARSupportInterface
{
    public:
    // Other params
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
	DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};

Stellen Sie sicher, dass Ihre Delegathandler die folgende Funktionssignatur befolgen:

void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)

Sie können über folgendes UARTrackedGeometry::GetUnderlyingMeshauf Gitterdaten zugreifen:

UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()

Blaupausen-API-Referenz

So arbeiten Sie mit Handgittern in Blaupausen:

  1. Hinzufügen einer ARTrackableNotify-Komponente zu einem Blaupausenschauspieler

ARTrackable Notify

  1. Wechseln Sie zum Bereich Details , und erweitern Sie den Abschnitt Ereignisse .

ARTrackable Notify 2

  1. Überschreiben Sie beim Hinzufügen/Aktualisieren/Entfernen nachverfolgter Geometrie mit den folgenden Knoten in Ihrem Ereignisdiagramm:

Bei ARTrackable Notify

Handgittervisualisierung in OpenXR

Die empfohlene Möglichkeit zum Visualisieren von Handgittern ist die Verwendung des XRVisualization-Plug-Ins von Epic zusammen mit dem Microsoft OpenXR-Plug-In.

Anschließend sollten Sie im Blaupausen-Editor die Set Use Hand Mesh-Funktion aus dem Microsoft OpenXR-Plug-In mit Enabled XRVisualization als Parameter verwenden:

Blaupause der Ereigniswiedergabe beginnen verbunden, um die Verwendung der Handgitterfunktion mit aktiviertem xrvisualisierungsmodus festzulegen

Um den Renderingprozess zu verwalten, sollten Sie Render Motion Controller von XRVisualization verwenden:

Blaupause der Get Motion Controller-Datenfunktion, die mit der Renderfunktion des Bewegungscontrollers verbunden ist

Das Ergebnis:

Bild der digitalen Hand überlagert auf einer echten menschlichen Hand

Wenn Sie etwas komplizierteres benötigen, z. B. das Zeichnen eines Handgitters mit einem benutzerdefinierten Shader, müssen Sie die Gitter als nachverfolgte Geometrie abrufen.

Handlichtstrahl

Das Abrufen von Handpose funktioniert für enge Interaktionen wie das Greifen von Objekten oder das Drücken von Tasten. Manchmal müssen Sie jedoch mit Hologrammen arbeiten, die weit von Ihren Benutzern entfernt sind. Dies kann mit Handstrahlen erreicht werden, die als Zeigegeräte in C++ und Blaupausen verwendet werden können. Sie können einen Strahl von Ihrer Hand bis zu einem weit entfernten Punkt zeichnen und mithilfe von Unreal Raytracing ein Hologramm auswählen, das andernfalls unerreichbar wäre.

Wichtig

Da alle Funktionsergebnisse jeden Frame ändern, werden sie alle aufrufbar gemacht. Weitere Informationen zu reinen und unreinen oder aufrufbaren Funktionen finden Sie in der Blaupausenbenutzer-GUId für Funktionen.

Um die Daten für die Handstrahlen abzurufen, sollten Sie die Funktion Get Motion Controller Data aus dem vorherigen Abschnitt verwenden. Die zurückgegebene Struktur enthält zwei Parameter, die Sie zum Erstellen eines Handstrahls verwenden können: Zielposition und Zielrotation. Diese Parameter bilden einen Strahl, der von Ihrem Ellenbogen gesteuert wird. Sie sollten sie nehmen und ein Hologramm finden, an dem gezeigt wird.

Im Folgenden finden Sie ein Beispiel für die Bestimmung, ob ein Handstrahl auf ein Widget trifft, und ein benutzerdefiniertes Trefferergebnis festlegen:

Blaupause der Get Motion Controller-Datenfunktion

Gesten

Die HoloLens 2 verfolgt räumliche Gesten nach, was bedeutet, dass Sie diese Gesten als Eingabe erfassen können. Die Gestennachverfolgung basiert auf einem Abonnementmodell. Sie sollten die Funktion "Gesten konfigurieren" verwenden, um dem Gerät mitzuteilen, welche Gesten Sie nachverfolgen möchten. Weitere Details zu Gesten finden Sie im Dokument HoloLens 2 Grundlegende Verwendung.

Windows Mixed Reality

Blaupause des Ereignisses, das mit der Wiedergabe beginnt, verbunden mit der Konfiguration der Gestenfunktion

Anschließend sollten Sie Code hinzufügen, um die folgenden Ereignisse zu abonnieren:

Blaupause der Räumlichen Eingabe in Windows halten, tippen und linke BearbeitungsgestenScreenshot der Gesten für räumliche Eingaben in Windows im Detailbereich

OpenXR

In OpenXR werden Gestenereignisse über die Eingabepipeline nachverfolgt. Mithilfe der Handinteraktion kann das Gerät Tap-and-Hold-Gesten automatisch erkennen, aber nicht die anderen. Sie werden als OpenXRMsftHandInteraction Select- und Grip-Zuordnungen benannt. Sie müssen das Abonnement nicht aktivieren. Sie sollten die Ereignisse in Projekteinstellungen/Engine/Eingabe wie folgt deklarieren:

Screenshot der OpenXR-Aktionszuordnungen

Nächster Entwicklungsprüfpunkt

Wenn Sie der Unreal-Entwicklungs-Journey folgen, die wir entworfen haben, befinden Sie sich mitten im Kennenlernen der MRTK-Grundbausteine. 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 Unreal-Entwicklung zurückkehren.