Pekare

Pekaren

Den här artikeln förklarar hur du konfigurerar och svarar på pekarindata i praktiken, jämfört med pekararkitektur

Pekare instanseras automatiskt vid körning när en ny kontrollant identifieras. Mer än en pekare kan kopplas till en kontrollant. Med standardpekarprofilen får till exempel Windows Mixed Reality både en linje och en parotisk pekare för normalt urval respektive teleportering.

Pekarkonfiguration

Pekare konfigureras som en del av indatasystemet i MRTK via en MixedRealityPointerProfile . Den här typen av profil tilldelas till MixedRealityInputSystemProfile en i MRTK Configuration Inspector. Pekarprofilen avgör markören, typer av pekare som är tillgängliga vid körning och hur pekarna kommunicerar med varandra för att avgöra vilken som är aktiv.

  • Pekarens omfattning – Definierar det maximala avståndet som en pekare kan interagera med ett GameObject för.

  • Peka Raycast Layer Masks – det här är en prioriterad matris med LayerMasks för att avgöra vilka möjliga GameObjects en viss pekare kan interagera med och ordningen på interaktionen som ska försökas. Detta kan vara användbart för att se till att pekare interagerar med gränssnittselement först före andra scenobjekt. Exempel på pekarprofil

Konfiguration av pekaralternativ

Standardkonfigurationen för MRTK-pekarprofil innehåller följande pekarklasser och tillhörande prefabs out-of-box. Listan över pekare som är tillgängliga för systemet vid körning definieras under Pekaralternativ i pekarprofilen. Utvecklare kan använda den här listan för att konfigurera om befintliga pekare, lägga till nya pekare eller ta bort en.

Exempel på pekaralternativprofil

Varje pekarpost definieras av följande datauppsättning:

  • Kontrollanttyp – Den uppsättning kontrollanter som en pekare är giltig för.

    • Till exempel ansvararPointer för att "peka" objekt med ett finger, och markeras som standard som endast stöd för den ledade handkontrolltypen. Pekare instansieras bara när en kontrollant blir tillgänglig och i synnerhet kontrollanttypen definierar vilka kontrollanter som pekarens prefab kan skapas med.
  • Handhänt – tillåter en pekare till att endast instansieras för en viss hand (vänster/höger)

Anteckning

Om du ställer in egenskapen Hand för en pekarpost på Ingen inaktiveras den effektivt från systemet som ett alternativ till att ta bort pekaren från listan.

  • Pointer Prefab – Den här prefab-tillgången instansieras när en kontrollant som matchar den angivna kontrollanttypen och handhäntheten börjar spåras.

Det går att ha flera pekare associerade med en kontrollant. I till exempel DefaultHoloLens2InputSystemProfile (Assets/MRTK/SDK/Profiles/HoloLens2/) associeras den tydligt styrda handkontrollanten med reglaget För hand, DefaultHoloLens2InputSystemProfileoch DefaultControllerPointer (dvs. handbilder).

Anteckning

MRTK tillhandahåller en uppsättning pekar-prefabs i Assets/MRTK/SDK/Features/UX/Prefabs/Pointers. En ny anpassad prefab kan byggas så länge den innehåller ett av pekarskripten i Assets/MRTK/SDK/Features/UX/Scripts/Pointers eller något annat skript som implementerar .

Markörkonfiguration

Blickmarkören kan konfigureras direkt via GazeCursorPrefab egenskapen i MixedRealityInputSystemProfile i redigeraren. Om du vill konfigurera markören som används för andra pekare måste du ändra prefab som används CursorPrefab i fältet för motsvarande BaseControllerPointer . Om du vill ändra markören programmatiskt ändrar BaseCursor du egenskapen för motsvarande IMixedRealityPointer beteende.

Markörens prefab-egenskap

Se våra markör prefabs i Assets/MRTK/SDK/Features/UX/Prefabs/Cursors för exempelimplementeringar av markörbeteende. I synnerhet ger DefaultGazeCursor en robust implementering av ändring av markörens bild baserat på kontextuellt tillstånd.

Standardpekarklasser

Följande klasser är de out-of-box MRTK-pekare som är tillgängliga och definierade i standardprofilen för MRTK-pekare som beskrivs ovan. Varje pekar prefab under Assets/MRTK/SDK/Features/UX/Prefabs/Pointers innehåller en av pekarkomponenterna kopplade.

MRTK-standardpekare

Långt pekare

LinePointer

LinePointer,en baspekarklass, ritar en linje från källan för indata (dvs. kontrollanten) i pekarriktningen och stöder en enda ray-typ i den här riktningen. I allmänhet instansieras och används underordnade klasser som och teleporteringspekaren (som även ritar linjer för att ange var teleporteringen kommer att hamna) i stället för den här klassen som främst tillhandahåller ShellHandRayPointer vanliga funktioner.

För rörelsekontroller som i Oculus, Vive och Windows Mixed Reality matchar rotationen kontrollantens rotation. För andra styrenheter som HoloLens två ledade händer matchar rotationen den system tillhandahållna pekhållningen för hand.

MRTK-pekarlinje
CurvePointer

CurvePointer utökar klassen LinePointer genom att tillåta flera stegs ray-casts längs en kurva. Den här baspekarklassen är användbar för kurvande instanser, till exempel teleporteringspekare där linjen konsekvent snedstreckar till en parabel.

ShellHandRayPointer

Implementeringen av ShellHandRayPointer,som sträcker sig från , används som standard för MRTK-pekarprofilen. Prefab-programmet DefaultControllerPointer implementerar klassen .

GGVPointer

GGVPointer kallas även för GGV-pekaren (Blick/gest/röst) och ger HoloLens ett utseende i 1-format och trycker på interaktioner, främst via Blick och Air Tap eller Blick och röst Välj interaktion. GGV-pekarens position och riktning styrs av huvudets position och rotation.

TouchPointer

TouchPointer ansvarar för att arbeta med Unity Touch-indata (dvs. pekskärm). Det här är "långt interaktioner" eftersom när skärmen vidrörs, kommer det att kastar en kamera från kameran till en plats i scenen som kan vara långt bort.

MousePointer

MousePointer driver en skärm till världen raycast för långt interaktioner, men för mus i stället för pekskärm.

Muspekaren

Anteckning

Musstöd är inte tillgängligt som standard i MRTK, men kan aktiveras genom att lägga till en ny typ av indataprovider till MRTK-indataprofilen och tilldela till MixedRealityMouseInputProfile dataleverantören.

Nära pekare

PokePointer

ThePointer används för att interagera med spelobjekt som stöder "nära interaktionsbar". som är GameObjects som har ett kopplat NearInteractionTouchable skript. När det gäller UnityUI letar den här pekaren efter NearInteractionTouchableUnityUIs. The Använd a SphereCast för att fastställa det närmast pekbara elementet och används för att driva sådant som de tryckbara knapparna.

När du konfigurerar GameObject med komponenten ser du till att konfigurera NearInteractionTouchableNearInteractionTouchable så att den pekar längst fram på knappen eller något annat objekt som ska göras rörbart. Kontrollera också att den nåbara gränsen matchar det nåbara objektets gränser.

Användbara egenskaper för Pekare:

  • TouchableDistance:Maximalt avstånd där en nåbar yta kan interagera med
  • Visuella objekt:Spelobjekt som används för att rendera fingertips (ring på finger, som standard).
  • Rad:Valfri linje som ska ritas från hands till den aktiva indataytan.
  • Layer Masks –En prioriterad matris med LayerMasks för att avgöra vilka möjliga GameObjects pekaren kan interagera med och den interaktionsordning som ska försökas. Observera att ett GameObject också måste ha en NearInteractionTouchable komponent för att kunna interagera med en pekare.
Pekare
SpherePointer

SpherePointer använderUnityEngine.Physics.OverlapSphere för att identifiera det närmaste objektet för interaktion, vilket är användbart för "grabbable"-indata som . Precis som PokePointer/NearInteractionTouchable funktionsparet måste spelobjektet innehålla en komponent som är skriptet för att kunna interagera med Sphere NearInteractionGrabbable Pointer.

Hämta pekare

Useful Sphere Pointer-egenskaper:

  • Sphere Cast Radius: Radien för den sfär som används för att fråga efter objekt som kan användas.
  • Near Object Margin: Avståndet överst i Sphere Cast Radius att fråga efter för att identifiera om ett objekt är nära pekaren. Total radie för identifiering av near-objekt är Sphere Cast Radius + Near Object Margin
  • Near Object Sector Angle:Vinkeln runt framåtaxeln för pekaren för att fråga efter objekt i närheten. Gör så IsNearObject att frågan fungerar som en glass. Detta är inställt på 66 grader som standard för att matcha Hololens 2-beteendet

Sphere pointer modified to only query for objects in the forward direction (Sfärpekaren har ändrats för att endast fråga efter objekt i framåtriktad riktning)

  • Near Object Smoothing Factor:Utjämningsfaktor för identifiering av närobjekt. Om ett objekt identifieras i radien nära objektet blir den efterfrågade radien near object radius * (1 + Near Object Smoothing Factor) för att minska känsligheten och göra det svårare för ett objekt att lämna identifieringsintervallet.
  • Hämta lagermasker – En prioriterad matris med LayerMasks för att avgöra vilka möjliga GameObjects pekaren kan interagera med och den interaktionsordning som ska försökas. Observera att ett GameObject också måste ha en NearInteractionGrabbable för att interagera med en SpherePointer.

    Anteckning

    Lagret Spatial Awareness är inaktiverat i standard-GrabPointer-prefabet som tillhandahålls av MRTK. Detta görs för att minska prestandapåverkan när en sfär överlappar frågan med det rumsliga nätet. Du kan aktivera detta genom att ändra grabPointer-prefab.

  • Ignorera Colliders Not in FOV – Om du vill ignorera kolliderare som kan vara nära pekaren, men inte i det visuella FOV-objektet. Detta kan förhindra oavsiktliga tagningar och gör att hand rays sätts på när du är nära att ta tag men inte kan se den. Det visuella FOV-objektet definieras via en glass i stället för det typiska frustumet av prestandaskäl. Den här glassen är centrerad och centrerad på samma sätt som kamerans frustum med en radie som är lika med halv visningshöjd (eller lodrät FOV).
Sphere Pointer

Teleporteringspekare

  • TeleportPointer kommer att skicka en teleporteringsbegäran när en åtgärd vidtas (dvs. knappen teleportering trycks ned) för att flytta användaren.
  • ParabolicTeleportPointer kommer att skicka en teleporteringsbegäran när en åtgärd vidtas (dvs. knappen teleportering trycks ned) med en partopisk linje raycast för att flytta användaren.
Pekarparitisk

Pekarstöd för plattformar med mixad verklighet

I följande tabell visas de pekartyper som vanligtvis används för vanliga plattformar i MRTK. Obs! Det är möjligt att lägga till olika pekartyper till dessa plattformar. Du kan till exempel lägga till en Tilläggspekare eller Sphere-pekare till VR. Dessutom kan VR-enheter med en spelpad använda GGV-pekaren.

Pekare OpenVR Windows Mixed Reality HoloLens 1 HoloLens 2
ShellHandRayPointer Giltig Giltig Giltig
TeleportPointer Giltig Giltig
GGVPointer Giltig
SpherePointer Giltig
Pointer Giltig

Pekarinteraktioner via kod

Gränssnitt för pekarehändelse

MonoBehaviours som implementerar ett eller flera av följande gränssnitt och tilldelas till ett GameObject med en får pekarinteraktionshändelser som definieras av det associerade Collider gränssnittet.

Händelse Beskrivning Hanterare
Innan fokus ändrades/fokus ändrades Upphöjt för både spelobjektet som förlorar fokus och det som får det varje gång en pekare ändrar fokus. IMixedRealityFocusChangedHandler
Fokus Retur/Avsluta Upphöjt till spelobjektet som får fokus när den första pekaren kommer in i den och på den som förlorar fokus när den sista pekaren lämnar det. IMixedRealityFocusHandler
Pekare nedåt/drad/upp/klickad Upphöjt till rapport pekare, dra och släpp. IMixedRealityPointerHandler
Touch startade/uppdaterades/slutfördes Upphöjt av pekmedvetna pekare som PokePointer att rapportera touch-aktivitet. IMixedRealityTouchHandler

Anteckning

IMixedRealityFocusChangedHandler och IMixedRealityFocusHandler ska hanteras i de objekt som de är upphöjda på. Det är möjligt att ta emot fokushändelser globalt, men till skillnad från andra indatahändelser blockerar inte den globala händelsehanteraren mottagandet av händelser baserat på fokus (händelsen tas emot av både den globala hanteraren och ett motsvarande objekt i fokus).

Indatahändelser för pekare i praktiken

Indatahändelser för pekar identifieras och hanteras av MRTK-indatasystemet på ett liknande sätt som vanliga indatahändelser. Skillnaden är att indatahändelser för pekare endast hanteras av GameObject i fokus av pekaren som utloggade indatahändelsen, samt eventuella globala indatahanterare. Regelbundna indatahändelser hanteras av GameObjects i fokus för alla aktiva pekare.

  1. MRTK-indatasystemet identifierar att en indatahändelse har inträffat
  2. MRTK-indatasystemet utser relevant gränssnittsfunktion för indatahändelsen till alla registrerade globala indatahanterare
  3. Indatasystemet avgör vilket GameObject som är i fokus för pekaren som utloggade händelsen
    1. Indatasystemet använder Unitys händelsesystem för att utsläcka relevant gränssnittsfunktion för alla matchande komponenter i det fokuserade GameObject
    2. Om en indatahändelse någon gång har markerats som använd avslutas processen och inga fler GameObjects får återanrop.
      • Exempel: Komponenter som IMixedRealityFocusHandler implementerar gränssnittet genomsöks efter en GameObject-vinst eller förlorar fokus
      • Obs! Unity-händelsesystemet bubblar upp för att söka i det överordnade GameObject om det inte finns några komponenter som matchar det önskade gränssnittet i det aktuella GameObject..
  4. Om inga globala indatahanterare har registrerats och inget GameObject hittas med en matchande komponent/gränssnitt anropar indatasystemet varje registrerade indatahanterare för återställning

Exempel

Nedan visas ett exempelskript som ändrar färgen på den anslutna renderaren när en pekare tar eller lämnar fokus eller när en pekare väljer objektet.

public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler, IMixedRealityPointerHandler
{
    private Color color_IdleState = Color.cyan;
    private Color color_OnHover = Color.white;
    private Color color_OnSelect = Color.blue;
    private Material material;

    private void Awake()
    {
        material = GetComponent<Renderer>().material;
    }

    void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
    {
        material.color = color_OnHover;
    }

    void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
    {
        material.color = color_IdleState;
    }

    void IMixedRealityPointerHandler.OnPointerDown(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerDragged(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
    {
        material.color = color_OnSelect;
    }
}

Frågepekare

Du kan samla in alla pekare som är aktiva genom att loopa genom tillgängliga indatakällor (dvs. tillgängliga styrenheter och indata) för att identifiera vilka pekare som är kopplade till dem.

var pointers = new HashSet<IMixedRealityPointer>();

// Find all valid pointers
foreach (var inputSource in CoreServices.InputSystem.DetectedInputSources)
{
    foreach (var pointer in inputSource.Pointers)
    {
        if (pointer.IsInteractionEnabled && !pointers.Contains(pointer))
        {
            pointers.Add(pointer);
        }
    }
}

Primär pekare

Utvecklare kan prenumerera på focusProviders PrimaryPointerChanged-händelsen för att få ett meddelande när den primära pekaren i fokus har ändrats. Detta kan vara mycket användbart för att identifiera om användaren för närvarande interagerar med en scen via blick eller en hand ray eller någon annan indatakälla.

private void OnEnable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.SubscribeToPrimaryPointerChanged(OnPrimaryPointerChanged, true);
}

private void OnPrimaryPointerChanged(IMixedRealityPointer oldPointer, IMixedRealityPointer newPointer)
{
    ...
}

private void OnDisable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.UnsubscribeFromPrimaryPointerChanged(OnPrimaryPointerChanged);

    // This flushes out the current primary pointer
    OnPrimaryPointerChanged(null, null);
}

Scenen PrimaryPointerExample (Assets/MRTK/Examples/Demos/Input/Scenes/PrimaryPointer) visar hur du använder för händelser för att svara på en PrimaryPointerChangedHandler ny primär pekare.

Exempel på primär pekare

Pekarresultat

ResultMarköregenskapen innehåller det aktuella resultatet för scenfrågan som används för att fastställa objektet med fokus. För en raycast-pekare, som de som skapas som standard för rörelsekontroller, blickindata och handbilder, innehåller den platsen och det normala för raycast-träffen.

private void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
{
    var result = eventData.Pointer.Result;
    var spawnPosition = result.Details.Point;
    var spawnRotation = Quaternion.LookRotation(result.Details.Normal);
    Instantiate(MyPrefab, spawnPosition, spawnRotation);
}

Scenen PointerResultExample (Assets/MRTK/Examples/Demos/Input/Scenes/PointerResult/PointerResultExample.unity) visar hur du använder pekaren för att skapa ett objekt på Result träffplatsen.

Pekarresultat

Inaktivera pekare

Om du vill aktivera och inaktivera pekare (till exempel för att inaktivera handbilden) anger du PointerBehavior för en viss pekartyp via PointerUtils .

// Disable the hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Disable hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

// Disable the gaze pointer
PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOff);

// Set the behavior to match HoloLens 1
// Note, if on HoloLens 2, you must configure your pointer profile to make the GGV pointer show up for articulated hands.
public void SetHoloLens1()
{
    PointerUtils.SetPokePointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGrabPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGGVBehavior(PointerBehavior.Default);
}

Se PointerUtils och för fler TurnPointersOnOff exempel.

Pekarinteraktioner via redigeringsprogram

För pekarhändelser som hanteras av ger MRTK ytterligare bekvämlighet i form av komponenten, vilket gör att pekarhändelser kan IMixedRealityPointerHandlerPointerHandler hanteras direkt via Unity-händelser.

Pekarhanterare

Pekarens omfattning

Vida pekare har inställningar som begränsar hur långt de kommer att raycasta och interagera med andra objekt i scenen. Som standard är det här värdet inställt på 10 meter. Det här värdet valdes för att vara konsekvent med beteendet för HoloLens gränssnittet.

Detta kan ändras genom att uppdatera DefaultControllerPointerShellHandRayPointer prefab-komponentens -fält:

Pekarens omfattning – detta styr det maximala avståndet som pekare interagerar med.

Standard pekarens omfattning – Detta styr längden på pekarens ray/line som renderas när pekaren inte interagerar med något.

Se även