Vezérlők, mutatók és fókusz

A vezérlők, mutatók és fókusz olyan magasabb szintű fogalmak, amelyek az alap bemeneti rendszer alapjaira épülnek. Együttesen a mechanizmus nagy részét biztosítják a jelenet objektumai számára.

Vezérlők

A vezérlők fizikai vezérlők (6fokos szabadság, kéz stb.) ábrázolásai. Eszközkezelők hozták létre őket, és ők felelnek a megfelelő mögöttes rendszerrel való kommunikációért és az adatok MRTK-alakú adatokra és eseményekre való lefordításáért.

A Windows Mixed Reality platformon például az a vezérlő, amely a mögöttes Windows-kézkövetési API-khoz való csatlakozásért felelős, hogy információt kap a kéz testről, testről és más WindowsMixedRealityArticulatedHand tulajdonságairól. Ezek az adatok releváns MRTK-eseményekké (például a RaisePoseInputChanged vagy RaiseHandJointsUpdated hívása) és a saját belső állapotának frissítésével felelősek, hogy a lekérdezései helyes adatokat adjanak TryGetJointPose vissza.

A vezérlők életciklusa általában a következőt foglalja magában:

  1. A vezérlőt egy új forrás észlelésekor az eszközkezelő fogja létrehozni (például az eszközkezelő észleli és elkezdi nyomon követni a kéz nyomát).

  2. A vezérlő Update() ciklusában a mögöttes API-rendszerbe hív.

  3. Ugyanabban a frissítési hurokban a bemeneti esemény változásait a hívása közvetlenül magában a bemeneti rendszerbe hívja meg (például a HandMeshUpdated vagy a HandJointsUpdated értékkel).

Mutatók és fókusz

A mutatók a játék objektumokkal való interakcióra használhatók. Ez a szakasz azt ismerteti, hogyan lehet mutatókat létrehozni, hogyan frissülni, és hogyan határozzák meg a fókuszban található objektumokat. Emellett a meglévő mutatók különböző típusait és az aktív helyzeteket is lefedi.

Mutatókategóriák

A mutatók általában az alábbi kategóriák egyikébe sorolhatók:

  • Távoli mutatók

    Az ilyen típusú mutatók a felhasználótól távol található objektumokhoz használhatók (a távoliak egyszerűen "közel" vannak). Az ilyen típusú mutatók általában olyan vonalakat hoznak létre, amelyek messze léphetnek a világba, és lehetővé teszik a felhasználó számára, hogy olyan objektumokat módosítson, amelyek nem közvetlenül mellette vannak.

  • Közelmutatók

    Az ilyen típusú mutatók olyan objektumokhoz használhatók, amelyek elég közel vannak a felhasználóhoz ahhoz, hogy megragadják, megérintse és manipulálják őket. Az ilyen típusú mutatók általában úgy lépnek interakcióba az objektumokkal, hogy a közeli környezetben lévő objektumokat keresnek (kis távolságban sugárcímzéssel, a környék objektum-keresgélő spherical írásával, vagy a megragadhatónak/érintésre használhatónak minősülő objektumok listáinak számbavételével).

  • Teleport-mutatók

    Az ilyen típusú mutatók a teleportációs rendszerbe csatlakoznak, hogy kezelni tudja a felhasználónak a mutató által megcélzott helyre való áthelyezését.

Mutatót éke

Mivel egyetlen vezérlő több mutatóval is (például a kézhez közel és távol is lehet interakciós mutató), létezik egy összetevő, amely az aktív mutató mediánját teszi felelőssé.

Ha például a felhasználó kézzel közelít egy megnyomható gombhoz, a nem jelenik meg, és a ShellHandRayPointer PokePointer aktívnak kell lennie.

Ezt a kezeli, amely az összes mutató állapota alapján meghatározza, hogy mely mutatók DefaultPointerMediator aktívak. Ennek egyik legfontosabb célja a távoli mutatók letiltása, ha egy közel mutató közel van egy objektumhoz (lásd: DefaultPointerMediator ).

A mutató mediátorának alternatív implementációja is lehetséges, ha módosítja a tulajdonságot PointerMediator a mutatóprofilon.

Mutatók letiltása

Mivel a mutatót közvetítő minden keretet futtat, végül az összes mutató aktív/inaktív állapotát vezérli. Ezért ha beállít egy mutató IsInteractionEnabled tulajdonságát a kódban, azt felül fogja írni a mutatót közvetítő minden képkockán. Ehelyett a megadásával szabályozhatja, hogy a mutatóknak saját maga PointerBehavior kell-e be- vagy kikapcsolva lennie. Vegye figyelembe, hogy ez csak akkor működik, ha az alapértelmezett és az FocusProvider DefaultPointerMediator MRTK-t használja.

Példa: Kézzel készített sugárok letiltása az MRTK-ban

Az alábbi kód kikapcsolja az MRTK-hez használt kéz sugárokat:

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

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

A következő kód a kézcsomóképeket adja vissza alapértelmezett viselkedésüknek az MRTK-ban:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

A következő kód kényszeríti a kézi sugárok be- és be való be- és be való be- vagy le

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOn);

További PointerUtils TurnPointersOnOff példák: és .

FocusProvider (Fókuszprovider)

A az a munkahorsz, amely az összes mutatón való itrálásért és az egyes mutatók célobjektumának FocusProvider kiderítéséért felelős.

Minden Update() hívásban ez a következőt fogja:

  1. Frissítse az összes mutatót úgy, hogy sugárképezéssel és a találatok észlelését a mutató által konfigurált módon adja meg (a sphere mutató például megadhatja a SphereOverlap raycastMode-t, így a FocusProvider egy sphere-alapú ütközést fog tenni)

  2. Frissítse a fókuszban lévő objektumot mutatónkénti alapon (azaz ha egy objektum fókuszba lenne ásna, eseményeket is aktiválna az adott objektumhoz, ha egy objektum fókuszt veszett volna el, akkor a fókusz elveszne stb.).

Mutató konfigurálása és életciklusa

A mutatók a bemeneti rendszerprofil Mutatók szakaszában konfigurálhatóak.

A mutató élettartama általában a következő:

  1. Az eszközkezelő észleli a vezérlő jelenlétét. Ez az eszközkezelő ezután létrehozza a vezérlőhöz társított mutatókat a RequestPointers hívásával.

  2. A FocusProvider az Update() hurokban iterál az összes érvényes mutatón, és a társított sugárcímzési vagy találatészlelési logikát fogja tenni. Ezzel határozható meg az egyes mutatók által fókuszált objektum.

    • Mivel egyszerre több aktív bemeneti forrás is lehet (például két aktív kéz), több objektum is lehet egyszerre fókuszban.
  3. Amikor az eszközkezelő felderíti, hogy egy vezérlőforrás elveszett, le fogja bontani az elveszett vezérlőhöz társított mutatókat.