A Solver áttekintése – MRTK2

Solver Main

A solverek olyan összetevők, amelyek megkönnyítik az objektumok pozíciójának kiszámítását & előre meghatározott algoritmus szerint. Ilyen lehet például, ha egy objektumot helyez a felületre, amelyre a felhasználó raycastja jelenleg beüt.

Emellett a Solver-rendszer determinisztikusan meghatározza az átalakítások műveleteinek sorrendjét, mivel nem lehet megbízható módon megadni a Unity számára az összetevők frissítési sorrendjét.

A Solverek számos viselkedést kínálnak az objektumok más objektumokhoz vagy rendszerekhez való csatolásához. Egy másik példa egy címke mentén lévő objektum, amely a felhasználó elé mutat (a kamera alapján). A feloldó egy vezérlőhöz és egy objektumhoz is csatolható, hogy az objektum a vezérlő mentén legyen címkézve. Minden megoldás biztonságosan halmozható, például tag-along viselkedés + felületi mágnesség + lendület.

A solver használata

A Solver-rendszer a szkriptek három kategóriájából áll:

  • Solver: Az az alap absztrakt osztály, amelyből az összes fizető származik. Állapotkövetést, simítási paramétereket és megvalósítást, automatikus solver-rendszerintegrációt és frissítési sorrendet biztosít.
  • SolverHandler: Beállítja a referenciaobjektumot, hogy nyomon kövesse azokat (pl. a fő kamera átalakítás, kézi sugár stb.), kezeli a solver-összetevők összegyűjtését, és végrehajtja a frissítésüket a megfelelő sorrendben.

A harmadik kategória maga a solver. A következő megoldási lehetőségek biztosítják az alapszintű működés építőelemét:

  • Orbital: Egy megadott helyre zárolja, és eltolást hoz létre a hivatkozott objektumból.
  • ConstantViewSize: Skálázás a hivatkozott objektum nézetéhez viszonyított állandó méret fenntartásához.
  • RadialView: Az objektumot a hivatkozott objektum által leadott nézettűn belül tartja.
  • Follow: Az objektumot a hivatkozott objektum felhasználó által definiált határainak halmazában tartja.
  • InBetween: Egy objektumot két követett objektum között tart.
  • SurfaceMagnetism: sugarakat vet a világ felszínére, és az objektumot ehhez a felülethez igazítja.
  • DirectionalIndicator: Egy objektum helyzetét és tájolását határozza meg irányjelzőként. A SolverHandler nyomon követett cél referenciapontjától kezdve ez a mutató a megadott DirectionalTarget felé fog irányulni.
  • Momentum: Gyorsulást/sebességet/súrlódást alkalmaz a más solvers/components által áthelyezett objektumok lendületének és rugósságának szimulálására.
  • HandConstraint: Korlátozza az objektumot, hogy olyan régióban kövesse a kezeket, amely nem metszi a GameObjectet a kezekkel. Hasznos a korlátozott interaktív tartalmakhoz, például menükhöz stb. Ez a solver az IMixedRealityHandtal való együttműködésre szolgál, de az IMixedRealityControllerrel is működik.
  • HandConstraintPalmUp: A HandConstraintből származik, de tartalmaz logikát annak teszteléséhez, hogy a tenyér az aktiválás előtt a felhasználóval szemben áll-e. Ez a solver csak az IMixedRealityHand vezérlőkkel működik, más vezérlőtípusokkal ez a solver ugyanúgy viselkedik, mint az alaposztálya.

A Solver-rendszer használatához egyszerűen adja hozzá a fent felsorolt összetevők egyikét a GameObjecthez. Mivel minden solvernek szüksége van egyre SolverHandler, a Unity automatikusan létrehoz egyet.

Megjegyzés

A Solvers-rendszer használatára a SolverExamples.scene fájlban talál példákat.

Nyomkövetési referencia módosítása

Az összetevő Nyomon követett céltípus tulajdonsága SolverHandler határozza meg azt a referenciapontot, amelyet minden solver használni fog az algoritmusaik kiszámításához. Egy egyszerű SurfaceMagnetism összetevővel rendelkező értéktípus Head például a fejről és a felhasználó tekintetének irányába irányuló sugáradást eredményez a felületi találatok megoldásához. A tulajdonság lehetséges értékei a TrackedTargetType következők:

  • Fej : Referenciapont a fő kamera átalakítása
  • ControllerRay: Referenciapont a LinePointer vezérlőn (azaz a mozgásvezérlőn vagy a kézi vezérlőn) lévő átalakítás, amely a vonalsugár irányába mutat
    • TrackedHandedness A tulajdonság használatával válassza ki a kézhasználati beállításokat (például Balra, Jobbra, Mindkettő)
  • HandJoint: Referenciapont egy adott kézkötés átalakítása
    • TrackedHandedness A tulajdonság használatával válassza ki a kézhasználati beállításokat (például Balra, Jobbra, Mindkettő)
    • TrackedHandJoint A tulajdonság használatával határozza meg a közös átalakítást a használathoz
  • CustomOverride: A hozzárendelt hivatkozási pont TransformOverride

Megjegyzés

A ControllerRay és a HandJoint típus esetén a solver kezelő először megkísérli megadni a bal oldali vezérlő/kéz átalakítást, majd a jobb oldalt, ha az előbbi nem érhető el, vagy ha a TrackedHandedness tulajdonság másként nem rendelkezik.

Solver tracked objectExample of various properties associated with each TrackedTargetType

Fontos

A legtöbb solver a által megadott SolverHandlernyomon követett transzformációs cél előrevektorát használja. Kézi kötéssel nyomon követett céltípus használatakor a tenyérkötés előrevektora az ujjakon keresztül, nem pedig a tenyéren keresztül mutathat. Ez attól függ, hogy a platform biztosítja-e a kéz közös adatait. A bemeneti szimuláció és a Windows Mixed Reality esetében ez a felfelé irányuló vektor, amely a tenyéren keresztül mutat (azaz a zöld vektor felfelé, a kék vektor előre halad).

Előre felfelé vektor

Ennek leküzdéséhez frissítse a További forgatás tulajdonságot a SolverHandler<90, 0, 0> értékűre. Ez biztosítja, hogy a solvereknek biztosított előrevektor a tenyéren keresztül és a kéztől kifelé mutasson.

További forgatás

Másik lehetőségként használja a Controller Ray tracked céltípust, hogy hasonló viselkedést kapjon a kézre mutatáshoz.

A megoldásláncok láncba kapcsolásához

Több összetevőt is hozzáadhat Solver ugyanahhoz a GameObjecthez, így láncba helyezheti az algoritmusokat. Az SolverHandler összetevők kezelik az ugyanazon a GameObjecten lévő összes solver frissítését. Alapértelmezés szerint a SolverHandler starton lévő hívások GetComponents<Solver>() , amelyek a solvereket az ellenőrben megjelenő sorrendben küldik vissza.

Továbbá a Frissített csatolt átalakítás tulajdonság igaz értékre állítása arra utasítja, hogy Solver mentse számított pozícióját, tájolását, & skálázását egy olyan köztes változóra, amely minden Solver számára elérhető (azaz GoalPosition). Ha hamis, a Solver program közvetlenül frissíti a GameObject átalakítóját. A transzformációs tulajdonságok közvetítő helyre való mentésével a többi solver képes elvégezni a számításokat a köztes változótól kezdve. Ennek az az oka, hogy a Unity nem engedélyezi a gameObject.transform frissítéseit, hogy ugyanazon a kereten belül halmozhassanak fel.

Megjegyzés

A fejlesztők közvetlenül a tulajdonság beállításával módosíthatják a Solvers végrehajtási sorrendjét SolverHandler.Solvers .

Új solver létrehozása

Minden solvernek örökölnie kell az absztrakt alaposztályt( Solver). A Solver-bővítmény elsődleges követelményei közé tartozik a SolverUpdate metódus felülbírálása. Ebben a módszerben a fejlesztőknek frissítenie kell az örökölt GoalPositionés GoalRotationGoalScale a tulajdonságokat a kívánt értékekre. Emellett általában hasznos a fogyasztó által kívánt referenciakeretként használni SolverHandler.TransformTarget .

Az alábbi kód egy új Solver-összetevőre mutat példát, InFront amely a csatolt objektumot 2 m-rel a elé helyezi.SolverHandler.TransformTarget Ha a SolverHandler.TrackedTargetType felhasználó Headállítja be , akkor a SolverHandler.TransformTarget lesz a kamera átalakítása, és így ez a Solver helyezi a mellékelt GameObject 2m előtt a felhasználók tekintete minden keret.

/// <summary>
/// InFront solver positions an object 2m in front of the tracked transform target
/// </summary>
public class InFront : Solver
{
    ...

    public override void SolverUpdate()
    {
        if (SolverHandler != null && SolverHandler.TransformTarget != null)
        {
            var target = SolverHandler.TransformTarget;
            GoalPosition = target.position + target.forward * 2.0f;
        }
    }
}

A Solver implementálási útmutatói

A solver gyakori tulajdonságai

Minden Solver-összetevő azonos tulajdonságokkal rendelkezik, amelyek az alapvető Solver-viselkedést szabályozzák.

Ha a Simítás engedélyezve van, a Solver fokozatosan frissíti a GameObject időbeli átalakítását a számított értékekre. A változás sebességét minden átalakítási összetevő LerpTime tulajdonsága határozza meg. Egy magasabb MoveLerpTime érték például lassabb mozgást eredményez a keretek között.

Ha a Karbantartási skálázás engedélyezve van, akkor a Solver a GameObject alapértelmezett helyi skáláját fogja használni.

Alapvető solver-tulajdonságok
Az összes Solver-összetevő által örökölt gyakori tulajdonságok

Orbitális

Az Orbital osztály egy tag-along összetevő, amely úgy viselkedik, mint a bolygók a naprendszerben. Ez a Solver biztosítja, hogy a csatlakoztatott GameObject a nyomon követett átalakítás körül kering. Így, ha a Követett cél típusa értékreSolverHandlerHeadvan állítva, akkor a GameObject rögzített eltolással kering a felhasználó feje körül.

A fejlesztők módosíthatják ezt a rögzített eltolást, hogy a menük vagy más jelenetösszetevők szem- vagy derékmagasságban stb. maradjanak a felhasználó körül. Ez a Helyi eltolás és a Világeltolás tulajdonságok módosításával történik. A Tájolás típusa tulajdonság határozza meg az objektumra alkalmazott forgatást, ha meg kell őriznie az eredeti forgatást, vagy mindig szembe kell néznie a kamerával vagy az arccal, bármilyen átalakítás is vezet a helyzetéhez stb.

Orbitális példa
Orbitális példa

RadialView

A RadialView egy másik címkealapú összetevő, amely a GameObject egy adott részét a felhasználó nézetének frustumában tartja.

A Min & Max View Degrees tulajdonság határozza meg, hogy a GameObject egy részének mindig mekkoranak kell lennie.

A Minimális & Maximális távolság tulajdonság határozza meg, hogy a GameObject mennyire legyen távol a felhasználótól. Ha például a GameObject felé halad egy 1 méteres minimális távolsággal , akkor a GameObject el lesz küldve, hogy az soha ne legyen 1 m-nél közelebb a felhasználóhoz.

A általában a RadialViewtracked target type (Nyomon követett céltípus ) értékre van állítva Head , így az összetevő a felhasználó tekintetét követi. Ez az összetevő azonban bármely nyomon követett céltípus"nézetében" tárolható.

Példa RadialView-ra
Példa RadialView-ra

Követés

Az Follow osztály egy elemet a követett cél előtt a helyi előretolt tengelyhez viszonyítva elhelyez. Az elem lazán korlátozható (más néven címke mentén), hogy ne kövesse, amíg a nyomon követett cél nem lépi túl a felhasználó által meghatározott korlátokat.

Hasonlóan működik a RadialView solverhez, további vezérlőkkel a Max Horizontal & Vertical View Degrees kezeléséhez, valamint az objektum tájolásának módosítására szolgáló mechanizmusokkal.

Tulajdonságok követése
Tulajdonságok követése

Példajelenet követése
Példajelenet követése (Assets/MRTK/Examples/Demos/Solvers/Scenes/FollowSolverExample.unity)

Inbetween

Az InBetween osztály két átalakítás között megőrzi a csatolt GameObject objektumot. Ezt a két átalakítási végpontot a GameObject saját SolverHandlerNyomon követett céltípusa és az InBetween összetevő Második nyomon követett céltípus tulajdonsága határozza meg. Általában mindkét típus értéke, az eredmény SolverHandler.TransformOverride és InBetween.SecondTransformOverride az értékek pedig a két nyomon követett végpontra lesznek CustomOverride állítva.

Futásidőben az InBetween összetevő létrehoz egy másik SolverHandlerösszetevőt a Második nyomon követett céltípus és a Második átalakítás felülbírálása tulajdonságok alapján.

Az PartwayOffset határozza meg, hogy a két átalakítás közötti vonal mentén az objektumot a 0,5-ös félúton, az első átalakításnál 1,0-val, a második átalakításnál pedig 0,0-val kell elhelyezni.

Példa az InBetweenre
Példa az InBetween solver használatára az objektum két átalakítás közötti megtartásához

SurfaceMagnetism

Ez SurfaceMagnetism úgy működik, hogy sugárszórást végez egy adott RétegMaszk felületeken, és elhelyezi a GameObject-et az adott érintkezési ponton.

A Surface Normál Eltolás a GameObject beállítási távolságát méter távolságra helyezi a felülettől a normál irányban a felületi találati pont irányába.

Ezzel szemben a Surface Ray Offset a GameObject beállítási távolságát méter távolságra helyezi a felülettől, de az elvégzett raycast ellenkező irányában. Így, ha a raycast a felhasználó tekintete, akkor a GameObject közelebb kerül a vonal mentén a találati pont a felszínen a kamera.

A Tájolási mód határozza meg, hogy milyen forgástípust kell alkalmazni a normál felülethez képest.

  • Nincs – Nincs forgatás alkalmazva
  • TrackedTarget – Az objektum szembe fog nézni a raycastet vezető korrektúrával
  • SurfaceNormal – Az objektum a normálhoz igazodik a felületi találati ponton
  • Kevert – Az objektum a normál felületi találati pont és a nyomon követett átalakítás alapján igazodik.

Ha azt szeretné, hogy a társított GameObject a Nincs módtól eltérő módban is függőleges maradjon, engedélyezze a Tájolás függőlegesen tartása beállítást.

Megjegyzés

A Tájolás keverése tulajdonság használatával szabályozhatja a forgatási tényezők közötti egyensúlyt, ha a Tájolási módblended értékre van állítva. A 0,0 érték tájolását teljes egészében a TrackedTarget mód vezérli, az 1,0-s érték pedig teljes egészében a SurfaceNormal által vezérelt tájolással rendelkezik.

SurfaceMagnetism példa

Annak meghatározása, hogy milyen felületeket lehet eltalálni

Amikor összetevőt SurfaceMagnetism ad hozzá a GameObjecthez, fontos figyelembe venni a GameObject és gyermekei rétegét, ha vannak ütközők. Az összetevő úgy működik, hogy különböző típusú raycasteket hajt végre annak meghatározására, hogy milyen felülettel szemben "mágnes" magát. Ha a GameObject solver egy ütközővel rendelkezik a tulajdonságában MagneticSurfacesSurfaceMagnetismfelsorolt rétegek egyikén, akkor a raycast valószínűleg önmagába ütközik, és a GameObject a saját ütközőpontjához csatlakozik. Ez a furcsa viselkedés elkerülhető, ha a fő GameObject és minden gyermek a Raycast figyelmen kívül hagyása rétegre van állítva, vagy megfelelően módosítja a MagneticSurfaces LayerMask tömböt.

Ezzel szemben a SurfaceMagnetism GameObject nem ütközik a tulajdonságban MagneticSurfaces nem szereplő réteg felületeivel. Általában ajánlott az összes kívánt felületet egy dedikált rétegre helyezni (pl. Felületek), és a tulajdonságot csak erre a MagneticSurfaces rétegre állítani. Az alapértelmezett vagy minden elem használata felhasználói felületi összetevőket vagy kurzorokat eredményezhet, amelyek hozzájárulnak a solverhez.

Végül a MaxRaycastDistance tulajdonságbeállításnál távolabbi felületeket a SurfaceMagnetism raycastek figyelmen kívül fogják hagyni.

DirectionalIndicator

Az DirectionalIndicator osztály egy címke mentén elhelyezkedő összetevő, amely a kívánt térpont irányához igazodik.

Leggyakrabban akkor használják, ha a Nyomon követett céltípus értéke SolverHandlerHead. Ily módon a solverrel rendelkező felhasználói felületi összetevő arra utasítja a DirectionalIndicator felhasználót, hogy vizsgálja meg a kívánt helyet a térben.

A tér kívánt pontját a Directional Target tulajdonság határozza meg.

Ha a felhasználó megtekintheti az iránycélt, vagy bármilyen hivatkozási keret be van állítva a SolverHandler-ben, akkor ez a solver letiltja az alatta lévő összes Renderer összetevőt. Ha nem látható, akkor minden engedélyezve lesz a mutatón.

A mutató mérete annál közelebb zsugorodik a felhasználóhoz, hogy rögzítse az iránycélt a FOV-ban.

  • Minimális mutatóméret – A mutatóobjektum minimális skálája

  • Maximális mutatóméret – A mutatóobjektum maximális skálája

  • Láthatósági skálázási tényező – Szorzó az FOV növeléséhez vagy csökkentéséhez, amely meghatározza, hogy az irányított célpont látható-e vagy sem

  • Nézeteltolás – A hivatkozási keret (azaz a kamera) szempontjából ez a tulajdonság határozza meg, hogy az objektum milyen messze legyen a mutató irányától.

Iránymutató tulajdonságai
Iránymutató tulajdonságai

Példa jelenet iránymutatóra
Példa jelenet iránymutatóra (Assets/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)

Hand menu with HandConstraint and HandConstraintPalmUp

Példa a Hand Menu UX-ra

A HandConstraint viselkedés egy olyan megoldási megoldást biztosít, amely a nyomon követett objektumot egy biztonságos régióra korlátozza a korlátozott tartalom (például a kézi felhasználói felület, a menük stb.) számára. A biztonságos régiók olyan területeknek minősülnek, amelyek nem kapcsolódnak egymáshoz. A rendszer a meghívott HandConstraintPalmUp származtatott osztályt HandConstraint is tartalmazza, hogy bemutassa a solver tracked objektum aktiválásának gyakori viselkedését, amikor a tenyér a felhasználóval néz szembe.

A Hand Constraint solver kézi menük létrehozására vonatkozó példákért tekintse meg a Hand Menu (Kéz menü) oldalt.

Lásd még