Hände und Motion-Controller in DirectXHands and motion controllers in DirectX

Hinweis

Dieser Artikel bezieht sich auf die älteren WinRT-APIs.This article relates to the legacy WinRT native APIs. Bei neuen nativen App-Projekten wird die Verwendung der openxr-API empfohlen.For new native app projects, we recommend using the OpenXR API.

In der gemischten Realität von Windows werden sowohl Hand-als auch Bewegungs Controller Eingaben über die räumlichen Eingabe-APIs behandelt, die sich im Windows. UI. Input. Spatial -Namespace befinden.In Windows Mixed Reality, both hand and motion controller input is handled through the spatial input APIs, found in the Windows.UI.Input.Spatial namespace. Dadurch haben Sie die Möglichkeit, häufig gängige Aktionen zu behandeln, z. bThis enables you to easily handle common actions like Select presses the same way across both hands and motion controllers.

Erste SchritteGetting started

Wenn Sie in Windows Mixed Reality auf räumliche Eingaben zugreifen möchten, beginnen Sie mit der spatialinteraktionmanager-Schnittstelle.To access spatial input in Windows Mixed Reality, start with the SpatialInteractionManager interface. Sie können auf diese Schnittstelle zugreifen, indem Sie spatialinteraktionmanager:: getforcurrentviewaufrufen, in der Regel beim Starten der app.You can access this interface by calling SpatialInteractionManager::GetForCurrentView, typically sometime during app startup.

using namespace winrt::Windows::UI::Input::Spatial;

SpatialInteractionManager interactionManager = SpatialInteractionManager::GetForCurrentView();

Die Aufgabe von spatialinteraktionmanager besteht darin, den Zugriff auf spatialinteraktionsourcesbereitzustellen, die eine Quelle für Eingaben darstellen.The SpatialInteractionManager's job is to provide access to SpatialInteractionSources, which represent a source of input. Im System sind drei Arten von spatialinteraktionsources verfügbar.There are three kinds of SpatialInteractionSources available in the system.

  • Hand stellt die erkannte Hand eines Benutzers dar.Hand represents a user's detected hand. Hand Quellen bieten verschiedene Features, die auf dem Gerät basieren, von grundlegenden Gesten auf hololens bis hin zur vollständigen manuellen Nachverfolgung auf hololens 2.Hand sources offer different features based on the device, ranging from basic gestures on HoloLens to fully articulated hand tracking on HoloLens 2.
  • Controller stellt einen gekoppelten Bewegungs Controller dar.Controller represents a paired motion controller. Bewegungs Controller können verschiedene Funktionen bieten, z. b. Select-Trigger, Menü Schaltflächen, Zieh Schaltflächen, Touchpads und Finger Stifte.Motion controllers can offer different capabilities, for example, Select triggers, Menu buttons, Grasp buttons, touchpads, and thumbsticks.
  • Voice repräsentiert die von einem Benutzer festgestellten sprach Schlüsselwörter.Voice represents the user's voice speaking system-detected keywords. Beispielsweise fügt diese Quelle eine SELECT Press-und-Freigabe ein, wenn der Benutzer "Select" anzeigt.For example, this source will inject a Select press and release whenever the user says "Select".

Pro-Frame-Daten für eine Quelle werden von der spatialinteraktionsourcestate -Schnittstelle dargestellt.Per-frame data for a source is represented by the SpatialInteractionSourceState interface. Es gibt zwei verschiedene Möglichkeiten, auf diese Daten zuzugreifen, je nachdem, ob Sie ein Ereignis gesteuertem oder Abruf basiertes Modell in der Anwendung verwenden möchten.There are two different ways to access this data, depending on whether you want to use an event-driven or polling-based model in your application.

Ereignisgesteuerte EingabeEvent-driven input

Der spatialinteraktionsmanager stellt eine Reihe von Ereignissen bereit, die Ihre APP überwachen kann.The SpatialInteractionManager provides a number of events that your app can listen for. Einige Beispiele hierfür sind sourcepressed, [sourcereleasing und sourceupdatiert.A few examples include SourcePressed, [SourceReleased, and SourceUpdated.

Der folgende Code verknüpft z. b. einen Ereignishandler mit dem Namen MyApp:: onsourcepressed zum sourcepressed-Ereignis.For example, the following code hooks up an event handler called MyApp::OnSourcePressed to the SourcePressed event. Dadurch kann Ihre APP auf jeder Art von Interaktions Quelle drückt erkennen.This allows your app to detect presses on any type of interaction source.

using namespace winrt::Windows::UI::Input::Spatial;

auto interactionManager = SpatialInteractionManager::GetForCurrentView();
interactionManager.SourcePressed({ this, &MyApp::OnSourcePressed });

Dieses gedrückte Ereignis wird asynchron an die APP gesendet, zusammen mit dem entsprechenden spatialinteraktionsourcestate zu dem Zeitpunkt, zu dem der Druck erfolgt ist.This pressed event is sent to your app asynchronously, along with the corresponding SpatialInteractionSourceState at the time the press happened. Ihre APP-oder Spiel-Engine kann die Verarbeitung sofort starten oder die Ereignisdaten in der Eingabe Verarbeitungsroutine in die Warteschlange stellen.Your app or game engine may want to start processing right away or queue up the event data in your input processing routine. Hier ist eine Ereignishandlerfunktion für das sourcepressed-Ereignis, mit dem überprüft wird, ob die Schaltfläche "auswählen" gedrückt wurde.Here's an event handler function for the SourcePressed event, which checks whether the select button has been pressed.

using namespace winrt::Windows::UI::Input::Spatial;

void MyApp::OnSourcePressed(SpatialInteractionManager const& sender, SpatialInteractionSourceEventArgs const& args)
{
    if (args.PressKind() == SpatialInteractionPressKind::Select)
    {
        // Select button was pressed, update app state
    }
}

Der obige Code überprüft nur die SELECT-Taste, die der primären Aktion auf dem Gerät entspricht.The above code only checks for the 'Select' press, which corresponds to the primary action on the device. Beispiele hierfür sind die Durchführung einer airtap auf hololens oder das Abrufen des Auslösers auf einem Bewegungs Controller.Examples include doing an AirTap on HoloLens or pulling the trigger on a motion controller. "Select"-Pressen stellen dar, dass die Absicht des Benutzers ist, das Hologramm zu aktivieren, auf das Sie abzielen'Select' presses represent the user's intention to activate the hologram they're targeting. Das sourcepressed-Ereignis wird für eine Reihe unterschiedlicher Schaltflächen und Gesten ausgelöst, und Sie können andere Eigenschaften auf der spatialinteraktionsource überprüfen, um diese Fälle zu testen.The SourcePressed event will fire for a number of different buttons and gestures, and you can inspect other properties on the SpatialInteractionSource to test for those cases.

Abruf basierte EingabePolling-based input

Sie können auch spatialinteraktionmanager verwenden, um den aktuellen Status der Eingabe jedes Frame abzufragen.You can also use SpatialInteractionManager to poll for the current state of input every frame. Um dies zu erreichen, müssen Sie getdetectedsourcesattimestamp jeden Frame aufrufen.To do this, call GetDetectedSourcesAtTimestamp every frame. Diese Funktion gibt ein Array zurück, das eine spatialinteraktionsourcestate für jede aktive spatialinteraktionsourceenthält.This function returns an array containing one SpatialInteractionSourceState for every active SpatialInteractionSource. Dies bedeutet, dass eine für jeden aktiven Motion-Controller, eine für jede verfolgte Hand und eine für die Sprache, wenn ein SELECT-Befehl vor kurzem ausgesprochen wurde.This means one for each active motion controller, one for each tracked hand, and one for speech if a 'select' command was recently uttered. Sie können dann die Eigenschaften auf den einzelnen spatialinteraktionsourcestate-Objekten überprüfen, um Eingaben in Ihre Anwendung zu steuern.You can then inspect the properties on each SpatialInteractionSourceState to drive input into your application.

Im folgenden finden Sie ein Beispiel für die Überprüfung der SELECT-Aktion mithilfe der Abruf Methode.Here's an example of how to check for the 'select' action using the polling method. Die Vorhersage Variable stellt ein holographicframevorhersage -Objekt dar, das aus dem holographicframeabgerufen werden kann.The prediction variable represents a HolographicFramePrediction object, which can be obtained from the HolographicFrame.

using namespace winrt::Windows::UI::Input::Spatial;

auto interactionManager = SpatialInteractionManager::GetForCurrentView();
auto sourceStates = m_spatialInteractionManager.GetDetectedSourcesAtTimestamp(prediction.Timestamp());

for (auto& sourceState : sourceStates)
{
    if (sourceState.IsSelectPressed())
    {
        // Select button is down, update app state
    }
}

Jede spatialinteraktionsource verfügt über eine ID, mit der Sie neue Quellen identifizieren und vorhandene Quellen von Frame zu Frame korrelieren können.Each SpatialInteractionSource has an ID, which you can use to identify new sources and correlate existing sources from frame to frame. Es wird immer dann eine neue ID erhalten, wenn Sie den FOV verlassen und eingeben, Controller-IDs bleiben jedoch für die Dauer der Sitzung statisch.Hands get a new ID every time they leave and enter the FOV, but controller IDs remain static for the duration of the session. Sie können die Ereignisse in spatialinteraktionmanager, wie z. b. sourceerkannten und sourcelost, verwenden, um zu reagieren, wenn die Hände in die Ansicht des Geräts eingegeben oder verlassen werden oder wenn Bewegungs Controller eingeschaltet/ausgeschaltet sind oder gekoppelt bzw. nicht gekoppelt sind.You can use the events on SpatialInteractionManager such as SourceDetected and SourceLost, to react when hands enter or leave the device's view, or when motion controllers are turned on/off or are paired/unpaired.

Vorhergesagte und Vergangenheits darstellenPredicted vs. historical poses

Getdetectedsourcesattimestamp verfügt über einen Zeitstempel-Parameter.GetDetectedSourcesAtTimestamp has a timestamp parameter. Dies ermöglicht es Ihnen, den Zustand anzufordern und die vorhergesagten oder Verlaufs Daten darzustellen, sodass Sie räumliche Interaktionen mit anderen Quellen der Eingabe korrelieren können.This enables you to request state and pose data that is either predicted or historical, letting you correlate spatial interactions with other sources of input. Wenn Sie z. b. die Position der Hand im aktuellen Frame rendern, können Sie den vorhergesagten Zeitstempel übergeben, der von holographicframebereitgestellt wird.For example, when rendering the hand's position in the current frame, you can pass in the predicted timestamp provided by the HolographicFrame. Dies ermöglicht es dem System, die Position der Hand an der gerenderten Frame Ausgabe zu weiterleiten und die erkannte Latenz zu minimieren.This enables the system to forward-predict the hand position to closely align with the rendered frame output, minimizing perceived latency.

Eine solche vorhergesagte Pose erzeugt jedoch keinen idealen Zeige-Ray für das Ziel einer Interaktions Quelle.However, such a predicted pose doesn't produce an ideal pointing ray for targeting with an interaction source. Wenn z. b. eine Bewegungs Controller Schaltfläche gedrückt wird, kann es bis zu 20 ms dauern, bis das Ereignis durch Bluetooth bis zum Betriebssystem hochskalieren kann.For example, when a motion controller button is pressed, it can take up to 20 ms for that event to bubble up through Bluetooth to the operating system. Wenn ein Benutzer eine Handbewegung durchführt, kann eine gewisse Zeitspanne Vergehen, bevor das System die Geste erkennt, und die APP dann abruft.Similarly, after a user does a hand gesture, some amount of time may pass before the system detects the gesture and your app then polls for it. Wenn Ihre APP eine Zustandsänderung abruft, werden die Kopfzeile und die Hand zum Ziel der Interaktion verwendet, die tatsächlich in der Vergangenheit aufgetreten ist.By the time your app polls for a state change, the head and hand poses used to target that interaction actually happened in the past. Wenn Sie als Ziel verwenden, indem Sie den Zeitstempel Ihres aktuellen holographicframe-Werts an getdetectedsourcesattimestamp übergeben, wird die Pose stattdessen auf dem Ziel-Ray zum Zeitpunkt der Anzeige des Frames (in der Zukunft mehr als 20 ms) vorhergesagt.If you target by passing your current HolographicFrame's timestamp to GetDetectedSourcesAtTimestamp, the pose will instead be forward predicted to the targeting ray at the time the frame will be displayed, which could be more than 20 ms in the future. Diese zukünftige Darstellung eignet sich gut zum Rendern der Interaktions Quelle, aber sorgt für unser Zeitproblem für die Interaktion , da die Zielvorgabe des Benutzers in der Vergangenheit erfolgte.This future pose is good for rendering the interaction source, but compounds our time problem for targeting the interaction, as the user's targeting occurred in the past.

Glücklicherweise bieten die Ereignisse " sourcepressed", "[sourcereleasing" und " sourceupout " den dem jeweiligen Eingabe Ereignis zugeordneten Verlaufs Status .Fortunately, the SourcePressed, [SourceReleased, and SourceUpdated events provide the historical State associated with each input event. Dies umfasst direkt die von trygetpointerposeverfügbaren Verlaufs Daten und Handschrift stellen sowie einen historischen Zeitstempel , den Sie an andere APIs übergeben können, um mit diesem Ereignis zu korrelieren.This directly includes the historical head and hand poses available through TryGetPointerPose, along with a historical Timestamp that you can pass to other APIs to correlate with this event.

Dies führt zu den folgenden bewährten Vorgehensweisen beim Rendern und als Ziel für die Verwendung von Händen und Controllern jedes Frames:That leads to the following best practices when rendering and targeting with hands and controllers each frame:

  • Für das Hand-/controllerrendering der einzelnen Frames sollte Ihre APP die Vorwärts Gesagte Darstellung der einzelnen Interaktions Quellen in der Photonen Zeit des aktuellen Frames Abfragen .For hand/controller rendering each frame, your app should poll for the forward-predicted pose of each interaction source at the current frame’s photon time. Sie können alle Interaktions Quellen abrufen, indem Sie getdetectedsourcesattimestamp jedes Frame aufrufen und den von holographicframe:: currentvorhersagebereitgestellten vorhergesagten Zeitstempel übergeben.You can poll for all interaction sources by calling GetDetectedSourcesAtTimestamp each frame, passing in the predicted timestamp provided by HolographicFrame::CurrentPrediction.
  • Für die Verwendung von Hand/Controller , die auf einen Press oder eine Freigabe abzielen, sollte Ihre APP gedrückte/freigegebene Ereignisse verarbeiten, und zwar basierend auf der Verlaufs Kopfzeile für dieses Ereignis.For hand/controller targeting upon a press or release, your app should handle pressed/released events, raycasting based on the historical head or hand pose for that event. Sie erhalten diesen Ziel-Ray, indem Sie das sourcepressed -oder sourcereleasing -Ereignis verarbeiten, die State -Eigenschaft von den Ereignis Argumenten abrufen und dann die trygetpointerpose -Methode aufrufen.You get this targeting ray by handling the SourcePressed or SourceReleased event, getting the State property from the event arguments, and then calling its TryGetPointerPose method.

Geräte übergreifende Eingabe EigenschaftenCross-device input properties

Die spatialinteraktionsource-API unterstützt Controller und Hand Verfolgungs Systeme mit einer Vielzahl von Funktionen.The SpatialInteractionSource API supports controllers and hand tracking systems with a wide range of capabilities. Eine Reihe dieser Funktionen sind zwischen den Gerätetypen üblich.A number of these capabilities are common between device types. Beispielsweise stellen Hand Verfolgungs-und Bewegungs Controller eine SELECT-Aktion und eine 3D-Position bereit.For example, hand tracking and motion controllers both provide a 'select' action and a 3D position. Wenn möglich, ordnet die API diese gemeinsamen Funktionen denselben Eigenschaften auf der spatialinteraktionsource zu.Wherever possible, the API maps these common capabilities to the same properties on the SpatialInteractionSource. Dies ermöglicht es Anwendungen, eine breite Palette von Eingabetypen leichter zu unterstützen.This enables applications to more easily support a wide range of input types. In der folgenden Tabelle werden die Eigenschaften, die unterstützt werden, und deren Vergleich zwischen Eingabetypen beschrieben.The following table describes the properties that are supported, and how they compare across input types.

EigenschaftProperty BeschreibungDescription Bewegungen von hololens (1. Gen)HoloLens(1st gen) Gestures Motion-ControllerMotion Controllers HandgelenkArticulated Hands
Spatialinteraktionsource::hängkeitSpatialInteractionSource::Handedness Rechts oder Links/Controller.Right or left hand / controller. Nicht unterstütztNot Supported UnterstütztSupported UnterstütztSupported
Spatialinteraktionsourcestate::isselectpressedSpatialInteractionSourceState::IsSelectPressed Aktueller Zustand der primären Schaltfläche.Current state of the primary button. Luft tippenAir Tap TriggerTrigger Gelockerte Luft tippen (Aufrufe)Relaxed Air Tap (upright pinch)
Spatialinteraktionsourcestate::isfassteSpatialInteractionSourceState::IsGrasped Aktueller Status der Schaltfläche "übernehmen".Current state of the grab button. Nicht unterstütztNot Supported Schaltfläche ""Grab button Ein-oder geschlossene Hand ZeigerPinch or Closed Hand
Spatialinteraktionsourcestate::ismenupressedSpatialInteractionSourceState::IsMenuPressed Aktueller Zustand der Menü Schaltfläche.Current state of the menu button. Nicht unterstütztNot Supported Menü SchaltflächeMenu Button Nicht unterstütztNot Supported
Spatialinteraktionsourcelokation::PositionSpatialInteractionSourceLocation::Position XYZ-Speicherort der Hand-oder Ziehpunkt Position auf dem Controller.XYZ location of the hand or grip position on the controller. Palmen StandortPalm location Position der Zieh PunktpositionGrip pose position Palmen StandortPalm location
Spatialinteraktionsourcelokation::OrientationSpatialInteractionSourceLocation::Orientation Die Quaternion, die die Ausrichtung der Hand oder des Zieh Punkts auf dem Controller darstellt.Quaternion representing the orientation of the hand or grip pose on the controller. Nicht unterstütztNot Supported Ziehpunkt AusrichtungGrip pose orientation Palmen AusrichtungPalm orientation
Spatialpointerinteraktionsourcepose::PositionSpatialPointerInteractionSourcePose::Position Ursprung des zeigenden Strahl.Origin of the pointing ray. Nicht unterstütztNot Supported UnterstütztSupported UnterstütztSupported
Spatialpointerinteraktionsourcepose::forwarddirectionSpatialPointerInteractionSourcePose::ForwardDirection Richtung des zeigenden Strahls.Direction of the pointing ray. Nicht unterstütztNot Supported UnterstütztSupported UnterstütztSupported

Einige der oben aufgeführten Eigenschaften sind auf allen Geräten nicht verfügbar, und die API bietet eine Möglichkeit, um dies zu testen.Some of the above properties aren't available on all devices, and the API provides a means to test for this. Beispielsweise können Sie die Eigenschaft spatialinteraktionsource:: isgrasp unterstützt überprüfen, um zu bestimmen, ob die Quelle eine vergrauaktion bereitstellt.For example, you can inspect the SpatialInteractionSource::IsGraspSupported property to determine whether the source provides a grasp action.

Ziehpunkt im Vergleich zu Zeige darstellenGrip pose vs. pointing pose

Windows Mixed Reality unterstützt Bewegungs Controller in verschiedenen Formfaktoren.Windows Mixed Reality supports motion controllers in different form factors. Sie unterstützt auch die Systeme für die Nachverfolgung von HandIt also supports articulated hand tracking systems. Alle diese Systeme verfügen über unterschiedliche Beziehungen zwischen der Handposition und der natürlichen Vorwärtsrichtung, die apps zum zeigen oder Rendern von Objekten in der Hand verwenden sollten.All of these systems have different relationships between the hand position and the natural "forward" direction that apps should use for pointing or rendering objects in the user's hand. Um dies zu unterstützen, gibt es zwei Arten von 3D-Posen, die sowohl für die Hand Verfolgung als auch für Bewegungs Controller bereitgestellt werden.To support all of this, there are two types of 3D poses provided for both hand tracking and motion controllers. Der erste ist Ziehpunkt, der die Position des Benutzers darstellt.The first is grip pose, which represents the user's hand position. Die zweite zeigt eine Darstellung, die ein zeigendes Strahl darstellt, das aus der Hand oder dem Controller des Benutzers stammt.The second is pointing pose, which represents a pointing ray originating from the user's hand or controller. Wenn Sie also die Hand des Benutzers oder ein Objekt, das in der Hand des Benutzers gehalten wird (z. b. ein Schwert oder eine Waffe), wiedergeben möchten, verwenden Sie die Ziehpunkt-Pose.So, if you want to render the user's hand or an object held in the user's hand, such as a sword or gun, use the grip pose. Wenn Sie einen raycast von Controller oder Hand durchführen möchten, z. b. wenn der Benutzer * * auf die Benutzeroberfläche zeigt, verwenden Sie die Zeige Pose.If you want to raycast from the controller or hand, for example when the user is **pointing at UI, use the pointing pose.

Sie können auf die Ziehpunkt- Pose über spatialinteraktionsourcestate zugreifen::P roperties:: trygetlocation (...). Es wird wie folgt definiert:You can access the grip pose through SpatialInteractionSourceState::Properties::TryGetLocation(...). It's defined as follows:

  • Die Zieh Punktposition: der Palmen Schwerpunkt bei der natürlichen Aufbewahrung des Controllers, nach links oder rechts, um die Position im Ziehpunkt zu zentrieren.The grip position: The palm centroid when holding the controller naturally, adjusted left or right to center the position within the grip.
  • Die Rechte Achse der Ziehpunkt Ausrichtung: Wenn Sie Ihre Hand vollständig geöffnet haben, um eine flache 5-Finger-Darstellung zu bilden, ist das Strahl-Ray, das normal ist (vorwärts von links nach links, rückwärts von rechter Palme).The grip orientation's Right axis: When you completely open your hand to form a flat 5-finger pose, the ray that is normal to your palm (forward from left palm, backward from right palm)
  • Die Forward-Achse der Ziehpunkt Ausrichtung: Wenn Sie die Hand teilweise schließen (wie beim Halten des Controllers), wird der Strahl, der durch das durch ihre nicht-Thumb-Finger formatierte Rohr auf "Vorwärts" zeigt.The grip orientation's Forward axis: When you close your hand partially (as if holding the controller), the ray that points "forward" through the tube formed by your non-thumb fingers.
  • Die aufwärts Achse der Ziehpunkt Ausrichtung: die aufwärts Achse, die durch die Rechte-und vorwärts Definitionen impliziert wird.The grip orientation's Up axis: The Up axis implied by the Right and Forward definitions.

Sie können auf die Zeiger Pose über spatialinteraktionsourcestate zugreifen::P roperties:: trygetlocation (...):: sourcepointerpose oder spatialinteraktionsourcestate:: trygetpointerpose (...):: trygetinteraktionsourcepose.You can access the pointer pose through SpatialInteractionSourceState::Properties::TryGetLocation(...)::SourcePointerPose or SpatialInteractionSourceState::TryGetPointerPose(...)::TryGetInteractionSourcePose.

Controller spezifische Eingabe EigenschaftenController-specific input properties

Für Controller verfügt spatialinteraktionsource über eine Controller Eigenschaft mit zusätzlichen Funktionen.For controllers, the SpatialInteractionSource has a Controller property with additional capabilities.

  • Hasthumbstick: True gibt an, dass der Controller über einen Finger Stick verfügt.HasThumbstick: If true, the controller has a thumbstick. Überprüfen Sie die controllerproperties -Eigenschaft des spatialinteraction SourceState-Objekts, um die x-und y-Werte des Finger Anrufs (thumbstickx und thumbthumb) sowie den gedrückten Zustand (isthumbstickpressed) abzurufen.Inspect the ControllerProperties property of the SpatialInteractionSourceState to acquire the thumbstick x and y values (ThumbstickX and ThumbstickY), as well as its pressed state (IsThumbstickPressed).
  • Hastouchpad: True gibt an, dass der Controller über einen Touchpad verfügt.HasTouchpad: If true, the controller has a touchpad. Überprüfen Sie die controllerproperties-Eigenschaft von spatialinteraction SourceState, um die Touchpad x-und y-Werte (touchpadx und touchpady) abzurufen, und um zu ermitteln, ob der Benutzer das Pad berührt (istouchpadtoud), und wenn Sie das Touchpad nach unten drücken (istouchpadpressed).Inspect the ControllerProperties property of the SpatialInteractionSourceState to acquire the touchpad x and y values (TouchpadX and TouchpadY), and to know if the user is touching the pad (IsTouchpadTouched) and if they're pressing the touchpad down (IsTouchpadPressed).
  • Simplehapticscontroller: Die simplehapticscontroller-API für den Controller ermöglicht es Ihnen, die Haptik Funktionen des Controllers zu überprüfen. Außerdem können Sie das haptische Feedback steuern.SimpleHapticsController: The SimpleHapticsController API for the controller allows you to inspect the haptics capabilities of the controller, and it also allows you to control haptic feedback.

Der Bereich für Touchpad und Ministick beträgt-1 bis 1 für beide Achsen (von unten nach oben und von links nach rechts).The range for touchpad and thumbstick is -1 to 1 for both axes (from bottom to top, and from left to right). Der Bereich für den analogen-Auslösers, auf den mit der spatialinteraktionsourcestate:: selectpressedvalue-Eigenschaft zugegriffen wird, weist einen Bereich von 0 bis 1 auf.The range for the analog trigger, which is accessed using the SpatialInteractionSourceState::SelectPressedValue property, has a range of 0 to 1. Der Wert 1 korreliert mit isselectpressed, das gleich true ist. alle anderen Werte korrelieren mit isselectpressed, das gleich false ist.A value of 1 correlates with IsSelectPressed being equal to true; any other value correlates with IsSelectPressed being equal to false.

Handgelenk VerfolgungArticulated hand tracking

Die Windows Mixed Reality-API bietet vollständige Unterstützung für die Weitergabe von Handgelenk, z. b. auf hololens 2.The Windows Mixed Reality API provides full support for articulated hand tracking, for example on HoloLens 2. Die Handschrift Nachverfolgung kann verwendet werden, um direkte Manipulations-und Punkt-und Commit-Eingabe Modelle in Ihren Anwendungen zu implementieren.Articulated hand tracking can be used to implement direct manipulation and point-and-commit input models in your applications. Sie kann auch zum Erstellen vollständig benutzerdefinierter Interaktionen verwendet werden.It can also be used to author fully custom interactions.

Hand GerüstHand skeleton

Die gemischte Nachverfolgung bietet ein 25-Gerüst Gerüst, das viele verschiedene Arten von Interaktionen ermöglicht.Articulated hand tracking provides a 25 joint skeleton that enables many different types of interactions. Das Gerüst bietet fünf Gelenke für den Index/Mittelwert/Ring/kleine Finger, vier Gelenke für den Ziehpunkt und ein Handgelenk.The skeleton provides five joints for the index/middle/ring/little fingers, four joints for the thumb, and one wrist joint. Das gemischte Gelenk fungiert als Basis der Hierarchie.The wrist joint serves as the base of the hierarchy. Das folgende Bild veranschaulicht das Layout des Skeleton.The following picture illustrates the layout of the skeleton.

Hand Gerüst

In den meisten Fällen wird jedes Joint auf der Grundlage des von ihm dargestellten Knochens benannt.In most cases, each joint is named based on the bone that it represents. Da bei jedem Joint zwei gedankenfelder vorhanden sind, verwenden wir eine Konvention, die jedes Joint-Element auf der Grundlage des untergeordneten knotes an diesem Speicherort zu benennen.Since there are two bones at every joint, we use a convention of naming each joint based on the child bone at that location. Der untergeordnete Knochen ist als der Knochen weiter vom Handgelenk definiert.The child bone is defined as the bone further from the wrist. Beispielsweise enthält die Zusammenstellung "Index proximal" die Anfangsposition des Index "proximal" und die Ausrichtung dieses Knochens.For example, the "Index Proximal" joint contains the beginning position of the index proximal bone, and the orientation of that bone. Sie enthält nicht die Endposition des-Knochens.It doesn't contain the ending position of the bone. Wenn Sie diese benötigen, erhalten Sie diese vom nächsten gemeinsamen Zusammenhang in der Hierarchie, dem "Index Intermediate"-Joint.If you need that, you'd get it from the next joint in the hierarchy, the "Index Intermediate" joint.

Zusätzlich zu den 25 hierarchischen Gelenken bietet das System eine Palmen Verbindung.In addition to the 25 hierarchical joints, the system provides a palm joint. Die Palme wird in der Regel nicht als Teil der Skelettstruktur betrachtet.The palm isn't typically considered part of the skeletal structure. Sie wird nur als bequeme Möglichkeit zur Verfügung gestellt, um die allgemeine Position und Ausrichtung der Hand zu erhalten.It's provided only as a convenient way to get the hand's overall position and orientation.

Die folgenden Informationen werden für jedes Joint bereitgestellt:The following information is provided for each joint:

NameName BeschreibungDescription
PositionPosition 3D-Position des gemeinsamen, in jedem angeforderten Koordinatensystem verfügbar.3D position of the joint, available in any requested coordinate system.
OrientationOrientation 3D-Ausrichtung des in jedem angeforderten Koordinatensystem verfügbaren knotes.3D orientation of the bone, available in any requested coordinate system.
RadiusRadius Abstand zur Oberfläche der Skin an der gemeinsamen Position.Distance to surface of the skin at the joint position. Nützlich für das optimieren direkter Interaktionen oder Visualisierungen, die auf der fingerbreite basieren.Useful for tuning direct interactions or visualizations that rely on finger width.
GenauigkeitAccuracy Gibt Aufschluss darüber, wie sicher das System über diese gemeinsamen Informationen verfügt.Provides a hint on how confident the system feels about this joint's information.

Sie können auf die Hand Skeleton-Daten über eine Funktion auf dem spatialinteraktionsourcestatezugreifen.You can access the hand skeleton data through a function on the SpatialInteractionSourceState. Die Funktion heißt trygethandposeund gibt ein Objekt mit dem Namen handposezurück.The function is called TryGetHandPose, and it returns an object called HandPose. Wenn die Quelle keine Handgelenke unterstützt, gibt diese Funktion NULL zurück.If the source doesn't support articulated hands, then this function will return null. Sobald Sie über eine Hand Pose verfügen, können Sie aktuelle gemeinsame Daten abrufen, indem Sie trygetjointmit dem Namen der zusammenhängenden aufrufen, an der Sie interessiert sind.Once you have a HandPose, you can get current joint data by calling TryGetJoint, with the name of the joint you're interested in. Die Daten werden als jointpose -Struktur zurückgegeben.The data is returned as a JointPose structure. Der folgende Code Ruft die Position des Finger Abbilds für den Index ab.The following code gets the position of the index finger tip. Die Variable CurrentState stellt eine Instanz von spatialinteraktionsourcestatedar.The variable currentState represents an instance of SpatialInteractionSourceState.

using namespace winrt::Windows::Perception::People;
using namespace winrt::Windows::Foundation::Numerics;

auto handPose = currentState.TryGetHandPose();
if (handPose)
{
    JointPose joint;
    if (handPose.TryGetJoint(desiredCoordinateSystem, HandJointKind::IndexTip, joint))
    {
        float3 indexTipPosition = joint.Position;

        // Do something with the index tip position
    }
}

Hand NetzHand mesh

Die API für die Nachverfolgung von Handschriften ermöglicht ein vollständig zu entformbares Dreieck-Mesh-Mesh.The articulated hand tracking API allows for a fully deformable triangle hand mesh. Dieses Mesh kann sich zusammen mit dem Hand Gerüst in Echtzeit deformen und eignet sich für Visualisierungs-und erweiterte Physik Techniken.This mesh can deform in real time along with the hand skeleton, and is useful for visualization and advanced physics techniques. Um auf das Hand Mesh zuzugreifen, müssen Sie zuerst ein handmeshobserver -Objekt erstellen, indem Sie trycreatehandmeshobserverasync auf der spatialinteraktionsourceaufrufen.To access the hand mesh, you need to first create a HandMeshObserver object by calling TryCreateHandMeshObserverAsync on the SpatialInteractionSource. Dies muss nur einmal pro Quelle erfolgen, normalerweise wenn Sie das erste Mal sehen.This only needs to be done once per source, typically the first time you see it. Das heißt, Sie rufen diese Funktion auf, um ein handmeshobserver-Objekt zu erstellen, wenn eine Hand in den FOV gelangt.That means you'll call this function to create a HandMeshObserver object whenever a hand enters the FOV. Dabei handelt es sich um eine asynchrone Funktion, daher müssen Sie hier mit etwas Parallelität umgehen.This is an async function, so you'll have to deal with a bit of concurrency here. Sobald Sie verfügbar sind, können Sie das handmeshobserver-Objekt für den Dreiecks Index Puffer durch Aufrufen von gettriangleindicesAbfragen.Once available, you can ask the HandMeshObserver object for the triangle index buffer by calling GetTriangleIndices. Indizes ändern den Frame nicht über Frame, sodass Sie diese einmal erhalten und für die Lebensdauer der Quelle Zwischenspeichern können.Indices don't change frame over frame, so you can get those once and cache them for the lifetime of the source. Indizes werden in der Reihenfolge im Uhrzeigersinn bereitgestellt.Indices are provided in clockwise winding order.

Der folgende Code startet einen getrennten Std:: Thread, um den Mesh-Beobachter zu erstellen, und extrahiert den Index Puffer, sobald der Mesh-Beobachter verfügbar ist.The following code spins up a detached std::thread to create the mesh observer and extracts the index buffer once the mesh observer is available. Sie beginnt mit einer Variablen namens CurrentState, bei der es sich um eine Instanz von spatialinteraktionsourcestate handelt, die eine nach verfolgte Hand darstellt.It starts from a variable called currentState, which is an instance of SpatialInteractionSourceState representing a tracked hand.

using namespace Windows::Perception::People;

std::thread createObserverThread([this, currentState]()
{
    HandMeshObserver newHandMeshObserver = currentState.Source().TryCreateHandMeshObserverAsync().get();
    if (newHandMeshObserver)
    {
        unsigned indexCount = newHandMeshObserver.TriangleIndexCount();
        vector<unsigned short> indices(indexCount);
        newHandMeshObserver.GetTriangleIndices(indices);

        // Save the indices and handMeshObserver for later use - and use a mutex to synchronize access if needed!
     }
});
createObserverThread.detach();

Das Starten eines getrennten Threads ist nur eine Option für die Behandlung von asynchronen Aufrufen.Starting a detached thread is just one option for handling async calls. Alternativ dazu können Sie die neue von C++ unterstützte co_await Funktionalität verwenden/WinRT.Alternatively, you could use the new co_await functionality supported by C++/WinRT.

Wenn Sie über ein handmeshobserver-Objekt verfügen, sollten Sie es für die Dauer aufbewahren, in der die zugehörige spatialinteraktionsource aktiv ist.Once you have a HandMeshObserver object, you should hold onto it for the duration that its corresponding SpatialInteractionSource is active. Anschließend können Sie den einzelnen Frame aufrufen, um den aktuellen Vertex-Puffer zu Fragen, der die Hand darstellt, indem Sie getvertexstateforpose aufrufen und eine handpose -Instanz übergeben, die die Darstellung darstellt, für die Sie Vertices wünschen.Then each frame, you can ask it for the latest vertex buffer that represents the hand by calling GetVertexStateForPose and passing in a HandPose instance that represents the pose that you want vertices for. Jeder Scheitelpunkt im Puffer hat eine Position und einen normalen.Each vertex in the buffer has a position and a normal. Im folgenden finden Sie ein Beispiel dafür, wie Sie den aktuellen Satz von Scheitel Punkten für ein Hand Mesh erhalten.Here's an example of how to get the current set of vertices for a hand mesh. Wie zuvor stellt die CurrentState -Variable eine Instanz von spatialinteraktionsourcestatedar.As before, the currentState variable represents an instance of SpatialInteractionSourceState.

using namespace winrt::Windows::Perception::People;

auto handPose = currentState.TryGetHandPose();
if (handPose)
{
    std::vector<HandMeshVertex> vertices(handMeshObserver.VertexCount());
    auto vertexState = handMeshObserver.GetVertexStateForPose(handPose);
    vertexState.GetVertices(vertices);

    auto meshTransform = vertexState.CoordinateSystem().TryGetTransformTo(desiredCoordinateSystem);
    if (meshTransform != nullptr)
    {
        // Do something with the vertices and mesh transform, along with the indices that you saved earlier
    }
}

Im Gegensatz zu Skelett Gelenken lässt die Hand Mesh-API nicht zu, dass Sie ein Koordinatensystem für die Scheitel Punkte angeben.In contrast to skeleton joints, the hand mesh API doesn't allow you to specify a coordinate system for the vertices. Stattdessen gibt der handmeshvertexstate das Koordinatensystem an, in dem die Vertices bereitgestellt werden.Instead, the HandMeshVertexState specifies the coordinate system that the vertices are provided in. Sie können dann eine Mesh-Transformation abrufen, indem Sie trygettransformto aufrufen und das gewünschte Koordinatensystem angeben.You can then get a mesh transform by calling TryGetTransformTo and specifying the coordinate system you want. Sie müssen diese Mesh-Transformation verwenden, wenn Sie mit den Scheitel Punkten arbeiten.You'll need to use this mesh transform whenever you work with the vertices. Dieser Ansatz reduziert den CPU-Overhead, insbesondere dann, wenn Sie nur das Mesh für renderingzwecke verwenden.This approach reduces CPU overhead, especially if you're only using the mesh for rendering purposes.

Zusammengesetzte Gesten durchschauen und CommitGaze and Commit composite gestures

Für Anwendungen, die das Eingabe Modell für den Blick und Commit verwenden, insbesondere für hololens (erste Generation), bietet die räumliche Eingabe-API einen optionalen spatialgesturerecognizer , der verwendet werden kann, um zusammengesetzte Gesten zu aktivieren, die auf dem "Select"-Ereignis basieren.For applications using the gaze-and-commit input model, particularly on HoloLens (first gen), the Spatial Input API provides an optional SpatialGestureRecognizer that can be used to enable composite gestures built on top of the 'select' event. Durch die Weiterleitung von Interaktionen zwischen spatialinteraktionmanager und dem spatialgesturerecognizer eines holograms können apps Tap-, Hold-, Manipulations-und Navigations Ereignisse gleichmäßig über die Hand-, sprach-und räumlichkeits Eingabegeräte hinweg erkennen, ohne dass die Pressen und Releases manuell behandelt werden müssen.By routing interactions from the SpatialInteractionManager to a hologram's SpatialGestureRecognizer, apps can detect Tap, Hold, Manipulation, and Navigation events uniformly across hands, voice, and spatial input devices, without having to handle presses and releases manually.

Spatialgesturerecognizer führt nur die minimale Mehrdeutigkeit zwischen dem Satz von Gesten aus, die Sie anfordern.SpatialGestureRecognizer does only the minimal disambiguation between the set of gestures that you request. Wenn Sie z. b. "nur tippen" anfordern, kann der Benutzer den Finger so lange herunterhalten, wie er aussieht, und es tritt immer noch ein tippen auf.For example, if you request just Tap, the user may hold their finger down as long as they like and a Tap will still occur. Wenn Sie sowohl Tippen als auch halten anfordern, wird die Bewegung nach ungefähr einer Sekunde nach unten mit dem Finger angehalten, und es tritt kein Tippen mehr auf.If you request both Tap and Hold, after about a second of holding down their finger the gesture will promote to a Hold and a Tap will no longer occur.

Wenn Sie spatialgesturerecognizer verwenden möchten, behandeln Sie das interaktionerkannte -Ereignis von spatialinteraktionmanager, und rufen Sie das dort verfügbare spatialpointerpose-Element ab.To use SpatialGestureRecognizer, handle the SpatialInteractionManager's InteractionDetected event and grab the SpatialPointerPose exposed there. Verwenden Sie den Head-Gaze-Strahl des Benutzers aus dieser Pose, um sich mit den holograms und Oberflächen Netzen in der Benutzerumgebung auszutauschen, um zu bestimmen, mit welchem Benutzer interagiert werden soll.Use the user's head gaze ray from this pose to intersect with the holograms and surface meshes in the user's surroundings to determine what the user is intending to interact with. Leiten Sie dann die spatialinteraktion in den Ereignis Argumenten an den spatialgesturerecognizer des Ziel-Hologramms weiter, indem Sie die zugehörige captureinteraktions -Methode verwenden.Then, route the SpatialInteraction in the event arguments to the target hologram's SpatialGestureRecognizer, using its CaptureInteraction method. Dies beginnt mit der Interpretation dieser Interaktion gemäß der spatialgesturesettings-Einstellung , die bei der Erstellungszeit für diese Erkennung festgelegt wurde, oder durch trysetgesturesettings.This starts interpreting that interaction according to the SpatialGestureSettings set on that recognizer at creation time - or by TrySetGestureSettings.

Bei hololens (erste Generation) sollten Interaktionen und Gesten ihre Zielvorgabe von der Kopfzeile des Benutzers ableiten, anstatt Sie an der Position des Benutzers zu rendern oder zu interagieren.On HoloLens (first gen), interactions and gestures should derive their targeting from the user's head gaze, rather than rendering or interacting at the hand's location. Nachdem eine Interaktion begonnen hat, können relative Bewegungen der Hand verwendet werden, um die Bewegung zu steuern, wie bei der Manipulation oder Navigation.Once an interaction has started, relative motions of the hand may be used to control the gesture, as with the Manipulation or Navigation gesture.

Siehe auchSee also