Megosztás a következőn keresztül:


Solvers – MRTK3

Solver Main

A solverek olyan összetevők, amelyek megkönnyítik az objektumok pozíciójának és tájolásának előre meghatározott algoritmusok szerinti kiszámítását. Példa: olyan objektum elhelyezése a felületre, amellyel a felhasználó tekintete metszi a raycastot.

A Solver-rendszer determinisztikus módon határozza meg a műveletek sorrendjét ezekhez az átalakítás-számításokhoz, 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ímkealapú objektum, amely a kamera alapján a felhasználó elé mutat. A feloldó egy vezérlőhöz és egy objektumhoz is csatolható, hogy az objektumcímke a vezérlő mentén legyen. Minden solver biztonságosan halmozható, például címke mentén viselkedhet, valamint a felületi mágnesség és a lendület.

Használat

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

  • Solver: Az az absztrakt alaposztály, amelyből minden solver 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 referenciaobjektum nyomon követését (például: a fő kamera átalakítóját, a kézi sugarat stb.), kezeli a solver-összetevők összegyűjtését, és a megfelelő sorrendben végrehajtja a frissítésüket.

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 kötöttségei között tartja.
  • InBetween: Egy objektumot két követett objektum között tart.
  • SurfaceMagnetism: sugarakat vet a világ felületé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: Megkötések objektumot, hogy kövesse a kezeket egy régióban, amely nem metszi a GameObject a kezekkel. Hasznos a korlátozott interaktív tartalmakhoz, például menükhöz stb. Ez a solver a következővel XRNodedolgozik: .
  • 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 vezérlőkkel XRNode működik, és ugyanúgy fog viselkedni, mint az alaposztálya más vezérlőtípusokkal.
  • Overlap: Átfedésben van a követett objektummal.

A Solver-rendszer használatához 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. Például egy egyszerű SurfaceMagnetism összetevővel rendelkező értéktípus Head egy sugár leadását eredményezi a fejből, és a felhasználó tekintetének irányába, hogy megoldja, melyik felületet éri el. 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 preferenciát (azaz Balra, Jobbra, Mindkettőt)
  • HandJoint: Referenciapont egy adott kézcsukó transzformációja
    • TrackedHandedness A tulajdonság használatával válassza ki a kézhasználati preferenciát (azaz Balra, Jobbra, Mindkettőt)
    • 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.

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 a felfelé vektor a tenyéren keresztül mutat (más szóval a zöld vektor felfelé, a kék vektor előrefelé halad).

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.

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 az algoritmusok láncba kapcsolhatóak. 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 és 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. Az átalakító tulajdonságok közvetítő helyre való mentésével a többi solver elvégezheti 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, , GoalRotationés GoalScale tulajdonságokat a kívánt értékekre. Emellett érdemes 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 A fogyasztó állítja be SolverHandler.TrackedTargetType a Head, majd a SolverHandler.TransformTarget lesz a kamera átalakító, és így ez a Solver helyezi a mellékelt GameObject 2 m 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 szabályozzák a Solver alapvető viselkedését.

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. Minden átalakítási összetevő LerpTime tulajdonsága határozza meg a változás sebességét. 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, a Solver a GameObject alapértelmezett helyi skáláját fogja használni.

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 úgy, hogy a menük vagy más jelenetösszetevők szem- vagy derékszinten maradjanak a felhasználó körül. Ez a helyi eltolás és a világeltolás tulajdonságainak 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 tartania az eredeti forgatást, vagy mindig szembe kell néznie a kamerával vagy az arccal bármilyen átalakítással, amely a pozícióját alakítja.

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 mennyinek 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 1 m minimális távolsággal , akkor a GameObject el lesz küldve, hogy 1 m-nél közelebb legyen a felhasználóhoz.

Általában a RadialViewnyomon követett céltípustHead használja, így az összetevő követi a felhasználó tekintetét. Ez az összetevő azonban bármely követett céltípus"nézetében" tárolható.

Követés

Az Follow osztály elhelyez egy elemet a követett cél előtt a helyi előretolt tengelyhez képest. Az elem lazán korlátozható (más néven "tag-along"), hogy ne kövesse, amíg a nyomon követett cél nem lép túl a felhasználó által megadott korlátokon.

A RadialView solverhez hasonlóan működik, és további vezérlőkkel kezeli a Max Horizontal & Vertical View Degrees (Függőleges nézetfokok) és az objektum tájolásának módosítására szolgáló mechanizmusokat.

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 CustomOverride , az eredmény SolverHandler.TransformOverride és InBetween.SecondTransformOverride az értékek pedig a két nyomon követett végpontra lesznek állítva.

Az InBetween összetevő egy másik SolverHandler összetevőt hoz létre futásidőben 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.

A két átalakítás közötti vonal mentén a PartwayOffset határozza meg, hogy az objektum hol lesz elhelyezve a 0,5-ös félúton, 1,0 az első átalakításnál, és 0,0 a második átalakításnál.

SurfaceMagnetism

Ez SurfaceMagnetism úgy működik, hogy egy adott LayerMask felületi Rétegmaszkon végez sugáradást, és a GameObjectet az adott érintkezési ponton helyezi el.

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, 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-s értékek 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.

Átfedés

Az Overlap egy egyszerű megoldás, amely az objektum átalakítását az átalakítási célhelyével SolverHandler's megegyező pozícióban és forgásban tartja.

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ő különböző raycast-eket hajt végre annak meghatározására, hogy melyik felülethez "mágnes" magát. Tegyük fel, hogy a GameObject solver egy ütközővel rendelkezik a tulajdonságában MagneticSurfaces felsorolt rétegek egyikén SurfaceMagnetism. Ebben az esetben a raycast valószínűleg megüti magát, ami azt eredményezi, hogy a GameObject a saját ütközőpontjához csatlakozik. Ezt a furcsa viselkedést elkerülheti, ha a fő GameObject és az összes gyermek elemét a Ray öntött réteg figyelmen kívül hagyása vagy a MagneticSurfaces LayerMask tömb megfelelő módosítása mellett állítja be.

Ezzel szemben a SurfaceMagnetism GameObject nem ütközik a tulajdonságban MagneticSurfaces nem szereplő réteg felületeivel. Javasoljuk, hogy helyezze az összes kívánt felületet egy dedikált rétegre (azaz Felületek), és állítsa a tulajdonságot erre a MagneticSurfaces rétegre. 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él típusaSolverHandler értékre Headvan állítva. 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. Ezt a pontot a Directional Target tulajdonság határozza meg.

Ha a felhasználó megtekintheti az iránycélt, vagy bármelyik 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 (vagyis a kamera) és a mutató iránya szempontjából ez a tulajdonság határozza meg, hogy az objektum milyen messze van a nézetport közepétől.

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

Hand menu with HandConstraint and HandConstraintPalmUp

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 név HandConstraintPalmUp származtatott osztályát HandConstraint is tartalmazza, amely bemutatja 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ézmenük létrehozására való használatával kapcsolatos példákért tekintse meg a Hand Menu dokumentációját.