Ukazatele

Ukazatele

Tento článek vysvětluje, jak konfigurovat a reagovat na vstupy ukazatelů v praxi, v porovnání s architekturou ukazatelů .

Ukazatele jsou automaticky instance za běhu při zjištění nového kontroleru. K řadiči lze připojit více než jeden ukazatel. například s výchozím profilem ukazatele získá Windows Mixed Reality controllers jak čáru, tak i parabolic ukazatel pro normální výběr a rozportování v uvedeném pořadí.

Konfigurace ukazatele

Ukazatele jsou konfigurovány jako součást vstupního systému v MRTK prostřednictvím MixedRealityPointerProfile . Tento typ profilu je přiřazen k nástroji MixedRealityInputSystemProfile v nástroji MRTK Configuration Inspector. Profil ukazatele určuje kurzor, typy ukazatelů, které jsou k dispozici za běhu, a způsob vzájemné komunikace těchto ukazatelů k rozhodnutí, které z nich je aktivní.

  • Rozsah ukázání – definuje maximální vzdálenost, pro kterou může ukazatel pracovat s GameObject.

  • Odkazy na Raycast vrstvy – jedná se o pole LayerMasks s určením priorit, které umožňuje určit, s jakým možným ukazatelem GameObjects může pracovat libovolný daný ukazatel, a pořadí interakce. To může být užitečné, aby ukazatelé komunikovali s prvky uživatelského rozhraní před jinými objekty scény. Příklad profilu ukazatele

Konfigurace možností ukazatele

Výchozí konfigurace profilu ukazatele MRTK zahrnuje následující třídy ukazatelů a související prefabs. Seznam ukazatelů, které jsou k dispozici pro systém za běhu, je definován v části Možnosti ukazatele v profilu ukazatele. Vývojáři můžou tento seznam využít k překonfigurování stávajících ukazatelů, přidání nových ukazatelů nebo odstranění jednoho z nich.

Příklad profilu možností ukazatele

Jednotlivé položky ukazatele jsou definovány následující sadou dat:

  • Typ kontroleru – sada řadičů, pro které je ukazatel platný.

    • Například PokePointer zodpovídá za objekty "poking" s prstem a je ve výchozím nastavení označena jako podpora pouze typu kloubového kontroleru. Ukazatele jsou vytvořeny pouze v případě, že řadič bude k dispozici, a konkrétně typ kontroleru definuje, s jakými řadiči lze tento ukazatel Prefab vytvořit.
  • Uchopení pera – umožňuje, aby byl ukazatel na instanci jenom pro konkrétní ruku (vlevo/vpravo)

Poznámka

Nastavení vlastnosti rukopisu položky ukazatele na hodnotu žádné znamená, že ji ze systému efektivně zakážete jako alternativu k odebrání tohoto ukazatele ze seznamu.

  • Ukazatel Prefab – vytvoří se instance tohoto prostředku Prefab, když se kontroler, který odpovídá zadanému typu kontroleru a začne sledovat.

K řadiči je možné přidružit více ukazatelů. Například v DefaultHoloLens2InputSystemProfile (assets/MRTK/SDK/Profiles/HoloLens2/) je kloubový řadič spojen s DefaultHoloLens2InputSystemProfile, GrabPointera DefaultControllerPointer (tj. paprsky).

Poznámka

MRTK poskytuje sadu ukazatelů prefabs v assets/MRTK/SDK/Features/UX/prefabs/ukazatelů. Nový vlastní Prefab může být sestaven tak dlouho, dokud obsahuje jeden ze skriptů s ukazateli v nabídce assets/MRTK/SDK/Features/UX/Scripts /Pointers nebo jakékoli jiné implementace skriptu .

Výchozí třídy ukazatelů

Následující třídy jsou předem připravené ukazatele MRTK, které jsou k dispozici a definovány ve výchozím profilu ukazatele MRTK , který je uveden výše. Každý ukazatel Prefab, který je součástí assets/MRTK/SDK/Features/UX/Prefabs/ukazatelů , obsahuje jednu z připojených komponent ukazatele.

MRTK výchozí ukazatelé

Far ukazatelé

LinePointer

LinePointer, základní třída ukazatelů, nakreslí čáru ze zdroje vstupu (tj. kontroler) v směru ukazatele a v tomto směru podporuje jedno přetypování. Obecně platí, že podřízené třídy, jako jsou ShellHandRayPointer a ukazatele teleport, jsou vytvořeny a využity (které také Nakreslí čáry, které označují, kde se při rozportování dokončí) místo této třídy, která primárně poskytuje běžné funkce.

pro řadiče pohybu, jako v Oculus, a a Windows Mixed Reality, bude rotace odpovídat rotaci kontroleru. u jiných řadičů, jako jsou HoloLens 2 kloubové ručičky, se rotace shoduje se systémem, který představuje ukazující pozici.

Čára ukazatele MRTK
CurvePointer

CurvePointer rozšiřuje třídu LinePointer tím, že umožňuje přetypování na více kroků podél křivky. Tato třída základního ukazatele je užitečná pro zakřivené instance, jako jsou například ukazatele portů, kde se řádek konzistentně rozloží na parabola.

ShellHandRayPointer

Implementace ShellHandRayPointer, která rozšiřuje z , se používá jako výchozí pro profil ukazatele MRTK. DefaultControllerPointer Prefab implementuje třídu.

GGVPointer

také označovaný jako ukazatel pohledu/gesto/hlas (GGV) , GGVPointer pravomoci HoloLens vzhled a klepněte na interakce, hlavně prostřednictvím pohledu a klepnutí vzduchu nebo pohledu a hlasu vybrat interakci. Pozice a směr ukazatele GGV se řídí pozicí a otočením hlavního prvku.

TouchPointer

TouchPointer zodpovídá za práci se vstupem v Unity Touch (tj. dotykové obrazovky). Jedná se o "daleko interakce", protože se jednání o tom, že se obrazovka dotýká, přetypování Ray z kamery do potenciálně umístění na scéně.

MousePointer

MousePointer zajišťuje obrazovku po celém světě raycast pro většinu interakcí, ale pro myš místo dotyku.

Ukazatel myši

Poznámka

podpora myši není ve výchozím nastavení v MRTK dostupná, ale je možné ji povolit přidáním nového vstupního Zprostředkovatel dat typu do vstupního profilu MRTK a přiřazením MixedRealityMouseInputProfile poskytovateli dat.

Ukazatele na okolí

PokePointer

PokePointer se používá k interakci s herními objekty, které podporují "blízkou interakci". které jsou GameObjects s připojeným NearInteractionTouchable skriptem. V případě UnityUI tento ukazatel vyhledá NearInteractionTouchableUnityUIs. PokePointer používá SphereCast k určení nejbližšího dotykové prvku a používá se k napájení jako k tlačítkům, jako jsou tlačítka pro tisk.

Při konfiguraci GameObject s NearInteractionTouchable komponentou, nezapomeňte nakonfigurovat parametr NearInteractionTouchable tak, aby ukazoval na přední stranu tlačítka nebo jiného objektu, který by měl být připraven. Také se ujistěte, že meze dotykového ovládání odpovídají hranicím přidaného objektu.

Užitečné vlastnosti poke ukazatele:

  • TouchableDistance: maximální vzdálenost, se kterou lze pracovat s dotykovými plochami
  • Vizuály: herní objekt používaný k vykreslování vizuálního tipu prstu (ve výchozím nastavení je to vyzvánět na prstu).
  • Line: Volitelný řádek pro kreslení z ruky na aktivní vstupní plochu.
  • Poke masek vrstev – pole LayerMasks s určenou prioritou k určení možného GameObjects, se kterým může ukazatel pracovat, a pořadí interakce k pokusu. Všimněte si, že GameObject musí mít také NearInteractionTouchable komponentu, aby mohl pracovat s ukazatelem poke.
Ukazatel poke
SpherePointer

SpherePointer používá UnityEngine. fyzika. OverlapSphere k identifikaci nejbližšího objektu pro interakci, což je užitečné pro "přehoditelné" vstupy, jako je . Podobně jako PokePointer/NearInteractionTouchable funkční pár, aby bylo možné pracovat s ukazatelem na police, musí herní objekt obsahovat komponentu, která je NearInteractionGrabbable skriptem.

Ukazatel myši

Užitečné vlastnosti ukazatele sphere:

  • Poloměr přetypování koule: poloměr pro oblast, která se používá k dotazování na poutavé objekty.
  • Okraj poblíž objektu: vzdálenost nad poloměrem přetypování koule na dotaz na zjištění, zda je objekt poblíž ukazatele. Celkový poloměr detekce objektu na pozici je poloměr přetypování koule + poblíž okraje objektu.
  • Úhel okolí objektu: úhel kolem dopředné osy ukazatele pro dotazování u okolních objektů. Slouží IsNearObject jako kuželový dotaz. Toto nastavení je ve výchozím nastavení nastaveno na 66 stupňů, aby se shodovalo s chováním HoloLens 2.

Ukazatel na objekt sphere se změnil jenom na dotaz na objekty ve směru směrem nahoru.

  • Bezproblémový faktor vyhlazování objektu: faktor vyhlazení pro detekci objektů v blízkosti. Pokud je v poloměru objektu na blízkosti zjištěn objekt, dotazovaná událost RADIUS se pak zaznamená na blížící se poloměru objektu * (1 + blížící se faktor vyhlazování objektů), aby se snížila citlivost a bylo obtížnější pro objekt opustit Rozsah detekce.
  • Přidaných masek vrstev – pole s určenou prioritou LayerMasks k určení možného GameObjects, s nímž může ukazatel pracovat, a pořadí interakce k pokusu. Všimněte si, že GameObject musí mít také NearInteractionGrabbable k interakci s SpherePointer.

    Poznámka

    Vrstva povědomí o prostorech je ve výchozím GrabPointer Prefab, kterou poskytuje MRTK, zakázaná. To se provádí, aby se snížil dopad na výkon při překrytí dotazu na prostorovou mřížku. Tuto možnost můžete povolit úpravou GrabPointer Prefab.

  • Ignorovat kolize, které nejsou v FOV – jestli se mají ignorovat kokolize, které se mohou nacházet blízko ukazatele, ale ve skutečnosti nejsou ve vizuálním FOV. To může zabránit náhodným příjezdům a umožní, aby se paprsky zapnuly, když může být skoro možné, ale nevidíte je. Vizuální FOV je definován pomocí kužele namísto typických frustum z důvodů výkonu. Tento kuželový kužel je na střed a orientovaný na stejný jako frustum kamery s poloměrem rovným poloviční výšce zobrazení (nebo vertikální FOV).
Ukazatel na sphere

Ukazatele teleport

  • TeleportPointer vyvolá požadavek teleport, pokud je provedena akce (například stisknuté tlačítko teleport), aby uživatel mohl uživatele přesunout.
  • ParabolicTeleportPointer vyvolá požadavek teleport při provedení akce (například stisknuté tlačítko teleport) s Parabolic čárou raycast, aby mohl uživatel uživatele přesunout.
Parabolic ukazatele

Podpora ukazatelů pro smíšené platformy realit

Následující tabulka popisuje typy ukazatelů, které se obvykle používají pro běžné platformy v MRTK. Poznámka: na tyto platformy je možné přidat různé typy ukazatelů. Například můžete přidat ukazatel poke nebo ukazatel koule na VR. Zařízení VR s gamepadem by navíc mohla používat ukazatel GGV.

Ukazatel OpenVR Windows Mixed Reality HoloLens 1 HoloLens 2
ShellHandRayPointer Platné Platné Platné
TeleportPointer Platné Platné
GGVPointer Platné
SpherePointer Platné
PokePointer Platné

Interakce ukazatelů přes kód

Rozhraní ukazatelů událostí

Třídy MonoBehaviour, které implementují jedno nebo více z následujících rozhraní a jsou přiřazeny k GameObject s, Collider budou přijímat události interakce ukazatelů, jak jsou definovány v přidruženém rozhraní.

Událost Popis Obslužná rutina
Před změnou zaměření/změnou fokusu Vyvolá se u herních objektů a tím pokaždé, když se ukazatel změní na fokus. IMixedRealityFocusChangedHandler
Zadat nebo ukončit fokus Vyvolá se u herního objektu, který získá fokus, když první ukazatel vstoupí do něj, a když se zaznamená, že se fokus zastaví, když ho Poslední ukazatel opustí. IMixedRealityFocusHandler
Ukazatel dolů/přetáhld/po kliknutí Je aktivována při stisknutí a vypuštění ukazatele na sestavu. IMixedRealityPointerHandler
Začátek/aktualizace/dokončení dotykového ovládání Vyvolali ukazatelé dotykového ovládání, jako je například PokePointer Sestava aktivity dotykového ovládání. IMixedRealityTouchHandler

Poznámka

IMixedRealityFocusChangedHandler a IMixedRealityFocusHandler měla by být zpracována v objektech, na kterých jsou vyvolány. Je možné přijímat události fokusu globálně, ale na rozdíl od jiných událostí vstupu, globální obslužná rutina události nebude blokovat přijímání událostí na základě fokusu (událost bude přijata globální obslužnou rutinou a odpovídajícím objektem v rámci fokusu).

Vstupní události ukazatele v akci

Vstupní události ukazatele jsou rozpoznány a zpracovávány vstupním systémem MRTK podobným způsobem jako běžné události vstupu. Rozdíl mezi tím, že vstupní události ukazatele jsou zpracovávány pouze pomocí GameObject ukazatele, který aktivoval vstupní událost, a také libovolnými globálními vstupními obslužnými rutinami. Běžné události vstupu jsou zpracovávány nástrojem GameObjects při zaměření na všechny aktivní ukazatele.

  1. Vstupní systém MRTK rozpozná vstupní událost, ke které došlo.
  2. Vstupní systém MRTK aktivuje příslušnou funkci rozhraní pro vstupní událost pro všechny registrované globální obslužné rutiny vstupu.
  3. Vstupní systém Určuje, který GameObject má fokus na ukazatel, který událost vyvolal.
    1. Vstupní systém využívá systém událostí Unity k vyvolání příslušné funkce rozhraní pro všechny odpovídající součásti na GameObject s fokusem.
    2. Pokud v jakémkoli okamžiku byla vstupní událost označena jako použitá, proces se ukončí a žádné další GameObjects nebudou přijímat zpětná volání.
      • Příklad: komponenty implementující rozhraní IMixedRealityFocusHandler budou vyhledávány GameObjecté zisky nebo ztratí fokus.
      • Poznámka: systém událostí Unity bude mít bublinu až po vyhledání nadřazeného GameObjectu, pokud se v aktuální GameObject nenašly žádné komponenty odpovídající požadovanému rozhraní.
  4. Pokud nejsou registrovány žádné globální vstupní obslužné rutiny a nebyl nalezen žádný GameObject s vyhovující komponentou nebo rozhraním, pak vstupní systém bude volat všechny záložní obslužné rutiny zaregistrované vstupy.

Příklad

Níže je příklad skriptu, který změní barvu připojeného zobrazovacího prvku, když ukazatel převezme nebo opustí fokus nebo když ukazatel vybere objekt.

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;
    }
}

Ukazatele na dotazy

Je možné shromáždit všechny ukazatele, které jsou aktuálně aktivní, prostřednictvím smyčky dostupných vstupních zdrojů (tj. dostupné řadiče a vstupy) a zjistit, ke kterým ukazatelům jsou připojeni.

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ární ukazatel

Vývojáři se můžou přihlásit k odběru události FocusProviders PrimaryPointerChanged, která se upozorní, když se změní primární ukazatel na fokus. To může být velmi užitečné, pokud chcete zjistit, jestli uživatel aktuálně spolupracuje s scénou prostřednictvím pohledu, nebo s jiným vstupním zdrojem.

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);
}

PrimaryPointerExampleScény (assets/MRTK/Examples/demos/Input/scény/PrimaryPointer) ukazuje, jak použít PrimaryPointerChangedHandler události pro k reakci na nový primární ukazatel.

Příklad primárního ukazatele

Výsledek ukazatele

Vlastnost pointer Result obsahuje aktuální výsledek pro dotaz scény použitý k určení objektu s fokusem. Pro ukazatel raycast, jako jsou ty, které jsou vytvořené ve výchozím nastavení pro řadiče pohybu, pohledu vstup a pohyb, bude obsahovat umístění a normální raycast.

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);
}

PointerResultExampleScéna (assety/MRTK/Examples/demos/Input/scény/PointerResult/PointerResultExample. Unity) ukazuje, jak použít ukazatel Result k vytvoření objektu v umístění volání.

Výsledek ukazatele

Zakázat ukazatele

Chcete-li povolit a zakázat ukazatele (například pro vypnutí ruky), nastavte PointerBehavior pro daný typ ukazatele prostřednictvím 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);
}

Další příklady naleznete v tématu PointerUtils a TurnPointersOnOff .

Interakce ukazatelů přes Editor

Pro události ukazatele, které jsou zpracovávány nástrojem IMixedRealityPointerHandler , MRTK poskytuje další pohodlí ve formě PointerHandler komponenty, která umožňuje zpracovávat události ukazatele přímo prostřednictvím událostí Unity.

Obslužná rutina ukazatele

Rozsah ukazatele

Parametry Far mají nastavení, které omezují, jak daleko budou raycast a interaktivně pracovat s ostatními objekty ve scéně. Ve výchozím nastavení je tato hodnota nastavena na 10 měřičů. tato hodnota byla vybrána, aby zůstala v souladu s chováním HoloLens shell.

To lze změnit aktualizací DefaultControllerPointerShellHandRayPointer polí Prefab komponenty:

Rozsah ukazatelů – Tato kontrola určuje maximální vzdálenost, s jakou ukazatelé budou pracovat.

Výchozí rozsah ukazatelů – určuje délku ukazatele na spojnici/čáru, která se vykreslí, když ukazatel nepracuje s cokoli.

Viz také