Bewegingscontrollers in Unity

Er zijn twee belangrijke manieren om actie te ondernemen op uw blik in Unity: handbewegingen en bewegingscontrollers in HoloLens en Immersive HMD. U hebt toegang tot de gegevens voor beide bronnen van ruimtelijke invoer via dezelfde API's in Unity.

Unity biedt twee primaire manieren om toegang te krijgen tot ruimtelijke invoergegevens voor Windows Mixed Reality. De algemene Input.GetButton/Input.GetAxis API's werken op meerdere Unity XR SDK's, terwijl de InteractionManager/GestureRecognizer-API die specifiek is voor Windows Mixed Reality de volledige set ruimtelijke invoergegevens beschikbaar maakt.

Unity XR-invoer-API's

Voor nieuwe projecten raden we u aan om de nieuwe XR-invoer-API's vanaf het begin te gebruiken.

Meer informatie over de XR-API's vindt u hier.

Toewijzingstabel voor Unity-knop/as

Input Manager van Unity voor Windows Mixed Reality bewegingscontrollers ondersteunt de knop- en as-id's die hieronder worden vermeld via de Api's Input.GetButton/GetAxis. De kolom 'Windows MR-specifiek' verwijst naar eigenschappen die beschikbaar zijn buiten het type InteractionSourceState . Elk van deze API's wordt gedetailleerd beschreven in de onderstaande secties.

De knop-/as-id-toewijzingen voor Windows Mixed Reality komen over het algemeen overeen met de Oculus-knop-/as-id's.

De toewijzingen van knop-/as-id's voor Windows Mixed Reality op twee manieren verschillen van de toewijzingen van OpenVR:

  1. De toewijzing maakt gebruik van touchpad-id's die verschillen van de duimstick, ter ondersteuning van controllers met zowel duimsticks als touchpads.
  2. De toewijzing voorkomt overbelasting van de A- en X-knop-id's voor de menuknoppen, zodat deze beschikbaar blijven voor de fysieke ABXY-knoppen.
InvoerAlgemene Unity-API's
(Input.GetButton/GetAxis)
Windows MR-specifieke invoer-API
(XR. WSA. Invoer)
Linkerhand Rechterhand
Selecteer de trigger ingedrukt As 9 = 1,0 As 10 = 1,0 selecteer Ingedrukt
Analoge waarde trigger selecteren As 9 As 10 selectPressedAmount
Selecteer de trigger die gedeeltelijk is ingedrukt Knop 14 (gamepadcompatibil) Knop 15 (gamepadcompatibilt) selectPressedAmount > 0.0
Menuknop ingedrukt Knop 6* Knop 7* menu Ingedrukt
Gripknop ingedrukt As 11 = 1,0 (geen analoge waarden)
Knop 4 (gamepadcompatibilt)
As 12 = 1,0 (geen analoge waarden)
Knop 5 (gamepadcompatibilt)
Begrepen
Duimstick X (links: -1.0, rechts: 1.0) As 1 As 4 thumbstickPosition.x
Duimstick Y (boven: -1.0, onder: 1.0) As 2 As 5 thumbstickPosition.y
Duimstick ingedrukt Knop 8 Knop 9 duimstick Ingedrukt
Touchpad X (links: -1.0, rechts: 1.0) As 17* As 19* touchpadPosition.x
Touchpad Y (boven: -1.0, onder: 1.0) As 18* As 20* touchpadPosition.y
Touchpad aangeraakt Knop 18* Knop 19* touchpadTouched
Touchpad ingedrukt Knop 16* Knop 17* touchpad Ingedrukt
6DoF grip pose of pointer pose Alleen greephouding : XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Grip of Pointer doorgeven als argument: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Traceringsstatus Positienauwkeurigheid en risico van bronverlies alleen beschikbaar via MR-specifieke API sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Notitie

Deze knop-/as-id's verschillen van de id's die Unity gebruikt voor OpenVR vanwege conflicten in de toewijzingen die worden gebruikt door gamepads, Oculus Touch en OpenVR.

OpenXR

Als u de basisbeginselen van mixed reality-interacties in Unity wilt leren, gaat u naar de Unity Manual for Unity XR Input (Unity Manual for Unity XR Input). Deze Unity-documentatie behandelt de toewijzingen van controllerspecifieke invoer tot meer generaliseerbare InputFeatureUsages, hoe beschikbare XR-invoer kan worden geïdentificeerd en gecategoriseerd, hoe gegevens uit deze invoer kunnen worden gelezen en meer.

De Mixed Reality OpenXR-invoegtoepassing biedt aanvullende profielen voor invoerinteractie, toegewezen aan de standaard InputFeatureUsages, zoals hieronder wordt beschreven:

InputFeatureUsage HP Reverb G2 Controller (OpenXR) HoloLens Hand (OpenXR)
primary2DAxis Joystick
primary2DAxisClick Joystick - Klikken
activeren Trigger
Grip Grip Luchtkraan of knijp
primaryButton [X/A] - Druk op Een tik in de lucht
secondaryButton [Y/B] - Druk op
gripButton Grip - Persen
triggerButton Trigger - druk op
menuKnop Menu

Griphouding versus wijzende houding

Windows Mixed Reality ondersteunt bewegingscontrollers in verschillende vormfactoren. Het ontwerp van elke controller verschilt in de relatie tussen de handpositie van de gebruiker en de natuurlijke 'voorwaartse' richting die apps moeten gebruiken om te wijzen bij het weergeven van de controller.

Om deze controllers beter weer te geven, zijn er twee soorten poses die u kunt onderzoeken voor elke interactiebron: de griphouding en de aanwijzerpositie. Zowel de coördinaten van de grippositie als de aanwijzerpositie worden uitgedrukt door alle Unity-API's in globale Unity-wereldcoördinaten.

Greephouding

De griphouding vertegenwoordigt de locatie van de gebruikerspalm, gedetecteerd door een HoloLens of door een bewegingscontroller vast te houden.

Op immersive headsets kan de griphouding het beste worden gebruikt om de hand van de gebruiker of een object in de hand van de gebruiker weer te geven. De griphouding wordt ook gebruikt bij het visualiseren van een bewegingscontroller. Het renderbare model van Windows voor een bewegingscontroller gebruikt de greeppositie als oorsprong en draaipunt.

De griphouding wordt specifiek als volgt gedefinieerd:

  • De positie van de greep: De palmcentid bij het natuurlijk vasthouden van de besturing, links of rechts aangepast om de positie binnen de grip te centreren. Op de Windows Mixed Reality bewegingscontroller wordt deze positie over het algemeen uitgelijnd met de knop Grip.
  • De rechteras van de gripstand: Wanneer u uw hand volledig opent om een platte houding van 5 vingers te vormen, de straal die normaal is voor uw palm (vooruit van linkerpalm, achteruit van rechterpalm)
  • De voorwaartse as van de gripstand: wanneer u uw hand gedeeltelijk sluit (alsof u de controller vasthoudt), de straal die "vooruit" wijst door de buis die wordt gevormd door uw niet-duimvingers.
  • De as Omhoog van de gripstand: de as Omhoog die wordt geïmpliceerd door de definities Rechts en Vooruit.

U hebt toegang tot de grippositie via de XR (Cross-Vendor Input API) van Unity. InputTracking. GetLocalPosition/Rotation) of via de WINDOWS MR-specifieke API (sourceState.sourcePose.TryGetPosition/Rotation, waarbij posegegevens worden aangevraagd voor het Grip-knooppunt ).

Aanwijzerhouding

De aanwijzerpositie vertegenwoordigt de punt van de controller die naar voren wijst.

De door het systeem geleverde aanwijzerpositie kan het beste worden gebruikt om te raycasten wanneer u het controllermodel zelf weergeeft. Als u een ander virtueel object weergeeft in plaats van de controller, zoals een virtueel pistool, moet u een straal aanwijzen die het meest natuurlijk is voor dat virtuele object, zoals een straal die langs de loop van het app-gedefinieerde pistoolmodel rijdt. Omdat gebruikers het virtuele object kunnen zien en niet de fysieke controller, is het aanwijzen met het virtuele object waarschijnlijk natuurlijker voor degenen die uw app gebruiken.

Op dit moment is de aanwijzerpositie alleen beschikbaar in Unity via de Windows MR-specifieke API, sourceState.sourcePose.TryGetPosition/Rotation, die in InteractionSourceNode.Pointer als argument wordt doorgegeven.

OpenXR

U hebt toegang tot twee sets poses via OpenXR-invoerinteracties:

  • De greephoudingen voor het weergeven van objecten in de hand
  • Het doel is om in de wereld te wijzen.

Meer informatie over dit ontwerp en de verschillen tussen de twee poses vindt u in de OpenXR-specificatie - Invoersubpaden.

Poses die worden geleverd door de InputFeatureUsages DevicePosition, DeviceRotation, DeviceVelocity en DeviceAngularVelocity vertegenwoordigen allemaal de OpenXR-griphouding. InputFeatureUsages met betrekking tot griphoudingen worden gedefinieerd in CommonUsages van Unity.

Poses die worden geleverd door de InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity en PointerAngularVelocity vertegenwoordigen allemaal de OpenXR-doelhouding. Deze InputFeatureUsages zijn niet gedefinieerd in opgenomen C#-bestanden, dus u moet uw eigen InputFeatureUsages als volgt definiëren:

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

Haptics

Voor informatie over het gebruik van haptics in het XR-invoersysteem van Unity vindt u documentatie in de Unity Manual for Unity XR Input - Haptics.

Controllertraceringsstatus

Net als bij de headsets vereist de Windows Mixed Reality bewegingscontroller geen installatie van externe volgsensoren. In plaats daarvan worden de controllers gevolgd door sensoren in de headset zelf.

Als de gebruiker de controllers uit het gezichtsveld van de headset verplaatst, blijft Windows in de meeste gevallen controllerposities afleiden. Wanneer de controller het visuele tracering lang genoeg heeft verloren, zullen de posities van de controller dalen naar posities met een geschatte nauwkeurigheid.

Op dit punt vergrendelt het systeem de controller voor de gebruiker, waarbij de positie van de gebruiker wordt bijgehouden terwijl deze zich verplaatst, terwijl de werkelijke oriëntatie van de controller nog steeds wordt weergegeven met behulp van de interne oriëntatiesensoren. Veel apps die gebruikmaken van controllers om ui-elementen aan te wijzen en te activeren, kunnen normaal werken terwijl ze bij benadering nauwkeurig zijn zonder dat de gebruiker het doorhebt.

Redenering over het expliciet bijhouden van de status

Apps die posities verschillend willen behandelen op basis van de traceringsstatus, kunnen verder gaan en eigenschappen van de status van de controller inspecteren, zoals SourceLossRisk en PositionAccuracy:

Traceringsstatus SourceLossRisk PositionAccuracy TryGetPosition
Hoge nauwkeurigheid < 1.0 Hoog true
Hoge nauwkeurigheid (risico op verlies) == 1,0 Hoog true
Geschatte nauwkeurigheid == 1,0 Geschatte true
Geen positie == 1,0 Geschatte onjuist

Deze bewegingscontrollertraceringsstatussen worden als volgt gedefinieerd:

  • Hoge nauwkeurigheid: Hoewel de bewegingscontroller zich binnen het gezichtsveld van de headset bevindt, biedt deze over het algemeen posities met een hoge nauwkeurigheid, op basis van visuele tracking. Een bewegende controller die tijdelijk het gezichtsveld verlaat of tijdelijk wordt verborgen voor de headsetsensoren (bijvoorbeeld door de andere hand van de gebruiker), blijft gedurende korte tijd uiterst nauwkeurige houdingen retourneren op basis van inertiële tracering van de controller zelf.
  • Hoge nauwkeurigheid (met risico op verlies): Wanneer de gebruiker de bewegingscontroller voorbij de rand van het gezichtsveld van de headset verplaatst, kan de headset binnenkort de positie van de controller niet meer visueel volgen. De app weet wanneer de controller deze FOV-grens heeft bereikt door te zien dat SourceLossRisk 1.0 bereikt. Op dat moment kan de app ervoor kiezen om controllerbewegingen te onderbreken waarvoor een gestage stroom van poses van hoge kwaliteit vereist is.
  • Nauwkeurigheid bij benadering: Wanneer de controller het visuele tracering lang genoeg heeft verloren, zullen de posities van de controller dalen naar posities met een geschatte nauwkeurigheid. Op dit punt vergrendelt het systeem de controller voor de gebruiker, waarbij de positie van de gebruiker wordt bijgehouden terwijl deze zich verplaatst, terwijl de werkelijke oriëntatie van de controller nog steeds wordt weergegeven met behulp van de interne oriëntatiesensoren. Veel apps die gebruikmaken van controllers om ui-elementen aan te wijzen en te activeren, kunnen normaal werken terwijl ze bij benadering nauwkeurig zijn zonder dat de gebruiker het doorhebt. Apps met zwaardere invoervereisten kunnen ervoor kiezen om deze daling van Hoge nauwkeurigheid naar Nauwkeurigheid bij benadering te herkennen door de eigenschap PositionAccuracy te inspecteren, bijvoorbeeld om de gebruiker gedurende deze periode een ruimer hitbox te geven op doelen buiten het scherm.
  • Geen positie: Hoewel de controller lange tijd met een geschatte nauwkeurigheid kan werken, weet het systeem soms dat zelfs een vergrendelde positie op het lichaam op dit moment niet zinvol is. Een controller die is ingeschakeld, is bijvoorbeeld mogelijk nooit visueel waargenomen of een gebruiker kan een controller neerzetten die vervolgens door iemand anders wordt opgehaald. Op die momenten biedt het systeem geen enkele positie aan de app en retourneert TryGetPosition false.

Common Unity API's (Input.GetButton/GetAxis)

Naamruimte:UnityEngine, UnityEngine.XR
Typen: Invoer, XR. InputTracking

Unity gebruikt momenteel de algemene Input.GetButton/Input.GetAxis API's om invoer beschikbaar te maken voor de Oculus SDK, de OpenVR SDK en Windows Mixed Reality, inclusief handen en bewegingscontrollers. Als uw app deze API's voor invoer gebruikt, kan deze eenvoudig bewegingscontrollers ondersteunen op meerdere XR SDK's, waaronder Windows Mixed Reality.

De status van een logische knop indrukken

Als u de algemene Unity-invoer-API's wilt gebruiken, begint u meestal met het koppelen van knoppen en assen aan logische namen in Unity Input Manager, waarbij u een knop of as-id's aan elke naam bindt. U kunt vervolgens code schrijven die verwijst naar de naam van die logische knop/as.

Als u bijvoorbeeld de triggerknop van de linkerbewegingscontroller wilt toewijzen aan de actie Verzenden, gaat u naar Invoer van projectinstellingen > bewerken > in Unity en vouwt u de eigenschappen van de sectie Verzenden uit onder Assen. Wijzig de eigenschap Positieve knop of Alt-positieve knop om joystickknop 14 te lezen, als volgt:

InputManager van Unity
Unity InputManager

Uw script kan vervolgens controleren op de actie Verzenden met behulp van Input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

U kunt meer logische knoppen toevoegen door de eigenschap Grootte onder Assen te wijzigen.

De status van een fysieke knop rechtstreeks indrukken

U kunt knoppen ook handmatig openen op basis van hun volledig gekwalificeerde naam, met behulp van Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

De houding van een hand of bewegingscontroller krijgen

U kunt de positie en draaiing van de controller openen met behulp van XR. InputTracking:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Notitie

De bovenstaande code vertegenwoordigt de griphouding van de controller (waar de gebruiker de controller vasthoudt), die handig is voor het weergeven van een zwaard of pistool in de hand van de gebruiker, of een model van de controller zelf.

De relatie tussen deze greeppositie en de aanwijzerpositie (waar de punt van de controller wijst) kan per controller verschillen. Op dit moment is toegang tot de aanwijzer van de controller alleen mogelijk via de MR-specifieke invoer-API, zoals beschreven in de onderstaande secties.

Windows-specifieke API's (XR. WSA. Invoer)

Waarschuwing

Als uw project gebruikmaakt van een van de XR's. WSA-API's, deze worden geleidelijk uitgefaseerd ten gunste van de XR SDK in toekomstige Unity-releases. Voor nieuwe projecten raden we u aan om de XR SDK vanaf het begin te gebruiken. Meer informatie over het XR-invoersysteem en API's vindt u hier.

Naamruimte:UnityEngine.XR.WSA.Input
Typen: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Als u meer gedetailleerde informatie wilt over Windows Mixed Reality handinvoer (voor HoloLens) en bewegingscontrollers, kunt u ervoor kiezen om de Windows-specifieke api's voor ruimtelijke invoer te gebruiken onder de naamruimte UnityEngine.XR.WSA.Input. Hiermee hebt u toegang tot aanvullende informatie, zoals positienauwkeurigheid of het brontype, zodat u handen en controllers uit elkaar kunt houden.

Peiling voor de status van handen en bewegingscontrollers

U kunt de status van dit frame peilen voor elke interactiebron (hand of bewegingscontroller) met behulp van de methode GetCurrentReading .

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

Elke InteractionSourceState die u terugkrijgt, vertegenwoordigt een interactiebron op het huidige moment in de tijd. De InteractionSourceState geeft informatie weer, zoals:

  • Welke soorten drukken worden uitgevoerd (Select/Menu/Grasp/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Andere gegevens die specifiek zijn voor bewegingscontrollers, zoals de XY-coördinaten van het touchpad en/of de duimstick en de aangeraakte status

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • De InteractionSourceKind om te weten of de bron een hand of een bewegingscontroller is

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

Polling voor voorwaarts voorspelde renderinghoudingen

  • Wanneer u pollt naar brongegevens van de interactie van handen en controllers, zijn de poses die u krijgt naar voren voorspelde poses voor het moment in de tijd dat de fotonen van dit frame de ogen van de gebruiker bereiken. Vooruit voorspelde poses kunnen het beste worden gebruikt voor het weergeven van de controller of een vastgehouden object per frame. Als u zich richt op een bepaalde pers of release met de controller, is dat het meest nauwkeurig als u de api's voor historische gebeurtenissen gebruikt die hieronder worden beschreven.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • U kunt ook de naar voren voorspelde hoofdhouding voor dit huidige frame krijgen. Net als bij de bronhouding is dit handig voor het weergeven van een cursor, hoewel het richten van een bepaalde pers of release het meest nauwkeurig is als u de api's voor historische gebeurtenissen gebruikt die hieronder worden beschreven.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

Interactiebronevenementen verwerken

Als u invoerevenementen wilt verwerken terwijl deze plaatsvinden met hun nauwkeurige historische posegegevens, kunt u interactiebron-gebeurtenissen afhandelen in plaats van polling.

Interactiebronevenementen afhandelen:

  • Registreer u voor een InteractionManager-invoer gebeurtenis. Voor elk type interactie-gebeurtenis waarin u geïnteresseerd bent, moet u zich hierop abonneren.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • De gebeurtenis afhandelen. Zodra u zich hebt geabonneerd op een interactiegebeurtenis, ontvangt u de callback wanneer dat nodig is. In het voorbeeld SourcePressed is dit nadat de bron is gedetecteerd en voordat deze is vrijgegeven of verloren is gegaan.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

De verwerking van een gebeurtenis stoppen

U moet stoppen met het verwerken van een gebeurtenis wanneer u niet langer geïnteresseerd bent in de gebeurtenis of als u het object vernietigt dat is geabonneerd op de gebeurtenis. Als u de verwerking van de gebeurtenis wilt stoppen, moet u zich afmelden voor de gebeurtenis.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Lijst met interactiebronevenementen

De beschikbare interactiebronevenementen zijn:

  • InteractionSourceDetected (bron wordt actief)
  • InteractionSourceLost (wordt inactief)
  • InteractionSourcePressed (tik, druk op de knop of 'Selecteren' uit)
  • InteractionSourceReleased (het einde van een tik, de knop is vrijgegeven of het einde van de uiting Selecteren)
  • InteractionSourceUpdated (verplaatst of wijzigt een bepaalde status)

Gebeurtenissen voor historische doelhoudingen die het meest overeenkomen met een pers of release

De polling-API's die eerder zijn beschreven, geven uw app naar voren voorspelde poses. Hoewel deze voorspelde poses het beste zijn voor het weergeven van de controller of een virtueel handheld-object, zijn toekomstige poses niet optimaal voor targeting, om twee belangrijke redenen:

  • Wanneer de gebruiker op een knop op een controller drukt, kan er ongeveer 20 ms draadloze latentie zijn via Bluetooth voordat het systeem de druk ontvangt.
  • Als u vervolgens een voorwaarts voorspelde houding gebruikt, wordt er nog eens 10-20 ms aan voorwaartse voorspelling toegepast op het tijdstip waarop de fotonen van het huidige frame de ogen van de gebruiker bereiken.

Dit betekent dat polling u een bronhouding of hoofdhouding geeft die 30-40 ms naar voren staat van waar het hoofd en de handen van de gebruiker daadwerkelijk terug waren toen de pers of release plaatsvond. Voor HoloLens handinvoer is er, hoewel er geen draadloze overdrachtsvertraging is, een vergelijkbare verwerkingsvertraging om de pers te detecteren.

Als u nauwkeurig wilt targeten op basis van de oorspronkelijke intentie van de gebruiker voor een hand- of controllerdruk, moet u de historische bronhouding of hoofdhouding van die InteractionSourcePressed - of InteractionSourceReleased-invoergebeurtenis gebruiken.

U kunt zich richten op een pers- of release met historische posegegevens van het hoofd of de controller van de gebruiker:

  • De hoofdhouding op het moment in de tijd waarop een beweging of controller-druk optrad, die kan worden gebruikt om te bepalen waar de gebruiker naar keek :

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • De bronpositie op het moment in de tijd waarop een bewegingscontroller optreedt, die kan worden gebruikt om te bepalen waarnaar de gebruiker de controller heeft gericht. Dit is de status van de controller die de pers heeft ervaren. Als u de controller zelf weergeeft, kunt u de houding van de aanwijzer aanvragen in plaats van de greeppositie, om de doelstraal te schieten vanaf wat de gebruiker als de natuurlijke punt van die gerenderde controller beschouwt:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

Voorbeeld van gebeurtenis-handlers

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

Bewegingscontrollers in MRTK

U hebt toegang tot de beweging en de bewegingscontroller vanuit invoerbeheer.

Volg de zelfstudies

Stapsgewijze zelfstudies, met meer gedetailleerde aanpassingsvoorbeelden, zijn beschikbaar in de Mixed Reality Academy:

MR Input 213 - Bewegingscontroller
MR Input 213 - Bewegingscontroller

Controlepunt volgende ontwikkeling

Als u het Unity-ontwikkelingstraject volgt dat we hebben uitgetekend, bent u bezig met het verkennen van de basisbouwstenen van MRTK. Vanaf hier kunt u doorgaan naar de volgende bouwsteen:

Of ga naar Mixed Reality platformmogelijkheden en API's:

U kunt altijd op elk gewenst moment teruggaan naar de controlepunten voor Unity-ontwikkeling .

Zie ook