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

A vezérlők, a mutatók és a fókusz olyan magasabb szintű fogalmak, amelyek az alapvető bemeneti rendszer által létrehozott alapokra épülnek. Együttesen a mechanizmus nagy részét biztosítják a jelenet objektumaival való interakcióhoz.

Vezérlők

A vezérlők fizikai vezérlők (6 szabadságfok, csuklós kéz stb.) ábrázolásai. Ezeket az eszközkezelők hozzák létre, és felelősek a megfelelő mögöttes rendszerrel való kommunikációért, valamint az adatok MRTK-alakú adatokká és eseményekké történő fordításáért.a

A Windows Mixed Reality platformon például a WindowsMixedRealityArticulatedHand vezérlő felel a mögöttes Windows kézkövető API-kkal való együttműködésért, hogy információkat kapjon a kéz illesztéseiről, pózairól és egyéb tulajdonságairól. Felelős azért, hogy ezeket az adatokat releváns MRTK-eseményekké alakítsa (például a RaisePoseInputChanged vagy a RaiseHandJointsUpdated meghívásával), valamint a saját belső állapotának frissítésével, hogy a lekérdezések helyes adatokat adjanak TryGetJointPose vissza.

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

  1. Egy vezérlőt egy eszközkezelő hoz létre egy új forrás észlelésekor (például az eszközkezelő észleli és elkezdi a kéz nyomon követését).

  2. A vezérlő Update() hurokjában meghívja a mögöttes API-rendszert.

  3. Ugyanebben a frissítési ciklusban a bemeneti esemény módosításait közvetlenül a központi bemeneti rendszerbe hívja (például a HandMeshUpdated vagy a HandJointsUpdated emelése).

Mutatók és fókusz

A mutatók játékobjektumokkal való interakcióra szolgálnak. Ez a szakasz bemutatja, hogyan jönnek létre a mutatók, hogyan frissülnek, és hogyan határozzák meg a fókuszban lévő objektum(ok)t. Emellett ismerteti a különböző típusú mutatókat, valamint azokat a forgatókönyveket is, amelyekben aktívak.

Mutatókategóriák

A mutatók általában a következő kategóriák egyikébe tartoznak:

  • Távoli mutatók

    Az ilyen típusú mutatók a felhasználótól távol lévő objektumokkal való interakcióra szolgálnak (a távolról egyszerűen "nem közel" definiált). Az ilyen típusú mutatók általában olyan vonalakat vetnek, amelyek messzire mehetnek a világba, és lehetővé teszik a felhasználó számára, hogy olyan objektumokat használjon és kezeljen, amelyek nem közvetlenül mellettük vannak.

  • Közeli mutatók

    Az ilyen típusú mutatók olyan objektumok kezelésére szolgálnak, amelyek elég közel vannak a felhasználóhoz ahhoz, hogy megragadják, megérinthessék és manipulálják őket. Az ilyen típusú mutatók általában úgy kommunikálnak az objektumokkal, hogy objektumokat keresnek a közeli közelben (vagy kis távolságra történő sugárszórással, a közelben lévő objektumok keresése gömbön történő öntéssel, vagy a megragadhatónak/érinthetőnek tekintett objektumok listáinak számbavételével).

  • Teleportmutatók

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

Mutató közvetítése

Mivel egyetlen vezérlő több mutatóval is rendelkezhet (például a csuklós kéz közel és távoli interakciós mutatókkal is rendelkezhet), létezik egy összetevő, amely a mutató aktív állapotának mediálásáért felelős.

Ha például a felhasználó keze egy lenyomható gombhoz közelít, a ShellHandRayPointer gombnak nem kell megjelennie, és a PokePointer gombnak be kell kapcsolódnia.

Ezt a DefaultPointerMediator( ) kezeli, amely az összes mutató állapota alapján határozza meg, hogy mely mutatók aktívak. Az egyik legfontosabb dolog, hogy letiltsa a távoli mutatókat, ha egy közeli mutató közel van egy objektumhoz (lásd: DefaultPointerMediator).

A mutató mediátorának alternatív implementációját a mutatóprofil tulajdonságának módosításával PointerMediator lehet biztosítani.

A mutatók letiltása

Mivel a mutatóközvetítő minden keretet futtat, az összes mutató aktív/inaktív állapotát szabályozza. Ezért ha egy mutató IsInteractionEnabled tulajdonságát kódban állítja be, azt a mutató mediátora minden keretben felülírja. Ehelyett megadhatja, hogy a PointerBehavior mutatók be- vagy kikapcsolhatók-e. Vegye figyelembe, hogy ez csak akkor működik, ha az alapértelmezett FocusProvider és DefaultPointerMediator az MRTK-t használja.

Példa: Kézi sugarak letiltása az MRTK-ban

A következő kód kikapcsolja a kézi sugarakat az MRTK-ban:

// 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 visszaadja a kézi sugarakat az alapértelmezett viselkedésükhöz az MRTK-ban:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

A következő kód arra kényszeríti a kézi sugarakat, hogy be legyenek kapcsolva, függetlenül attól, hogy közel van-e egy megragadhatóhoz:

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

További példákért lásd PointerUtils a és TurnPointersOnOff a további példákat.

FocusProvider

Ez FocusProvider az a munkahorse, amely az összes mutató listájának iterálásáért és annak kiderítéséért felelős, hogy mi a szűrt objektum az egyes mutatókhoz.

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

  1. Frissítse az összes mutatót a raycasting használatával, és végezze el a találatészlelést a mutató által konfigurált módon (például a gömbmutató megadhatja a SphereOverlap raycastMode értéket, így a FocusProvider gömbalapú ütközést hajt végre)

  2. Frissítse a szűrt objektumot mutatónként (azaz ha egy objektum fókuszba kerül, eseményeket is aktiválna az objektumra, ha egy objektum elvesztette a fókuszt, akkor a fókusz elveszne stb.).

Mutató konfigurálása és életciklusa

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

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ókészletet a következő híváson keresztül: RequestPointers.

  2. A FocusProvider Update() hurokjában iterál az összes érvényes mutatóra, és a kapcsolódó raycast vagy hit detection logikát hajtja végre. Ez határozza meg az egyes mutatók által szűrt objektumot.

    • Mivel egyszerre több bemeneti forrás is aktív lehet (például két aktív kéz), több olyan objektum is lehet, amely egyszerre koncentrál.
  3. Az eszközkezelő, miután felfedezte, hogy egy vezérlőforrás elveszett, lebontja az elveszett vezérlőhöz társított mutatókat.