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


A Solver áttekintése – MRTK2

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. Ilyen lehet például, ha egy objektumot helyez a felületre, amelyen a felhasználó jelenleg a raycastot nézi.

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

A solverek számos viselkedést kínálnak, hogy objektumokat csatoljanak más objektumokhoz vagy rendszerekhez. Egy másik példa egy címke menti 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 címkéje a vezérlő mentén legyen. Minden megoldó biztonságosan halmozható, például címke mentén történő viselkedés + felületi mágnesesség + lendület.

A solver használata

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

  • Solver: Az alap absztrakciós osztály, amelyből az összes 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 referenciaobjektumot, hogy nyomon kövesse azokat (például a fő kameraátalakítás, a kézi sugár stb.), kezeli a solver-összetevők összegyűjtését, és végrehajtja a megfelelő sorrendben történő frissítésüket.

A harmadik kategória maga a solver. A következő megoldási lehetőségek biztosítják az alapvető viselkedé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ézetkontúlon belül tartja.
  • Follow: Az objektumot a hivatkozott objektum felhasználó által meghatározott határai között tartja.
  • InBetween: Két követett objektum között tart egy objektumot.
  • 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 hivatkozási pontjá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 mozgatott 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 kezét, amely nem metszi a GameObject-et a kézzel. Hasznos korlátozott interaktív tartalmakhoz, például menükhöz stb. Ez a megoldás az IMixedRealityHandtal való együttműködésre szolgál, de az IMixedRealityControllerrel is működik.
  • HandConstraintPalmUp: A HandConstraintből származik, de logikát is tartalmaz annak ellenőrzé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 fog viselkedni, 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 Solverhez szükség van egyre SolverHandler, a Unity automatikusan létrehoz egyet.

Feljegyzés

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

A nyomon követés referenciáinak 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ál 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ában sugárszórást eredményez a 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 egy LinePointer vezérlőn (azaz egy mozgásvezérlőn vagy kézi vezérlőn lévő mutató eredete) az átalakítás, amely a vonalsugár irányára mutat
    • TrackedHandedness A tulajdonság használatával válassza ki a kézhasználati beállítást (például Balra, Jobbra, Mindkettő)
  • HandJoint: Referenciapont egy adott kézízület átalakítása
    • TrackedHandedness A tulajdonság használatával válassza ki a kézhasználati beállítást (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: Referenciapont a hozzárendeltből TransformOverride

Feljegyzés

A ControllerRay és a HandJoint típusok esetében a solver-kezelő először megkísérli megadni a bal oldali vezérlőt/kézi á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 ObjectPélda az egyes TrackedTargetType-okhoz társított különböző tulajdonságokra

Fontos

A legtöbb megoldáskezelő a nyomon követett transzformációs cél előrevektorát használja.SolverHandler Kézi ízület nyomon követett céltípus használatakor a tenyérízület előrevivő vektora 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 fel van állítva, a kék vektor előrefelé halad).

Előrefelé vektor

A megoldáshoz frissítse a További elforgatá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 által követett céltípust, hogy hasonló viselkedést kapjon a kézzel való rámutatáshoz.

A solverek láncba kapcsolásához

Több összetevőt is hozzáadhat Solver ugyanahhoz a GameObject-hez, így az algoritmusok láncolásával. Az SolverHandler összetevők kezelik az összes megoldó frissítését ugyanazon a GameObjecten. Alapértelmezés szerint a SolverHandler Start hívásai GetComponents<Solver>() , amelyek a Solverst a felügyelőben megjelenő sorrendben küldik vissza.

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

Feljegyzé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ények elsődleges követelményei a metódus felülbírálásával SolverUpdate járnak. Ebben a módszerben a fejlesztőknek frissítenie kell az örökölt GoalPositionés GoalRotation GoalScale a tulajdonságokat a kívánt értékekre. Emellett általánosan hasznos lehet a fogyasztó által kívánt referenciakeretként használni SolverHandler.TransformTarget .

Az alábbi kód egy új Solver-összetevőre InFront mutat példát, amely a csatolt objektumot 2 m-rel a SolverHandler.TransformTargetelé helyezi. Ha a SolverHandler.TrackedTargetType fogyasztó Headállítja be, akkor a SolverHandler.TransformTarget kamera átalakítja, é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;
        }
    }
}

Solver implementációs útmutatók

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. A változás sebességét minden átalakító ö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 MaintainScale 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-mentén összetevő, amely úgy viselkedik, mint a bolygók a naprendszerben. Ez a Solver biztosítja, hogy a csatlakoztatott GameObject pályára álljon a nyomon követett átalakítás körül. Így ha a tracked target type of the SolverHandler be van állítva Head, akkor a GameObject a felhasználó feje körül fog keringeni rögzített eltolás alkalmazásával.

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 legyenek stb. 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 őriznie az eredeti forgását, 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

Ez RadialView egy másik tag-along összetevő, amely megtartja a GameObject egy adott részét a felhasználói nézet frustumában.

A Min > Maximális nézetfok tulajdonságai határozzák meg, hogy a GameObject egy részének mindig mekkoranak kell lennie.

A Minimális és maximális távolság tulajdonságai határozzák meg, hogy a GameObject milyen távolságra legyen a felhasználótól. Ha például a GameObject felé halad egy 1 m minimális távolsággal , a GameObject el lesz küldve, hogy az soha ne legyen 1 m-nél közelebb a felhasználóhoz.

A rendszer általában a RadialView nyomon követett céltípussal Head együtt használja, í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 elhelyez egy elemet a nyomon 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.

Hasonlóan működik a RadialView solverhez, további vezérlőkkel a maximális vízszintes és függőleges nézetfokok 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 tartja a csatolt GameObject-et. Ezt a két átalakító végpontot a GameObject saját SolverHandler nyomon 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 CustomOverride értéke és az eredmény SolverHandler.TransformOverride és InBetween.SecondTransformOverride az értékek a két nyomon követett végpontra lesznek állítva.

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

Meghatározza PartwayOffset , hogy a két átalakítás közötti vonal mentén az objektumot 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.

InBetween példa
Példa az InBetween solver két átalakítás közötti objektum megtartására

SurfaceMagnetism

A SurfaceMagnetism munka úgy működik, hogy raycastot végez a felületek egy meghatározott Rétegmaszkja ellen, és a GameObject-et az adott érintkezési ponton helyezi el.

A Surface Normál Eltolás a GameObject-et a felülettől távol lévő mérőkben a normál irányban helyezi el a felületi találati ponton.

Ezzel szemben a Surface Ray Offset egy megadott távolságot helyez el a GameObject-et a felülettől távolodó, de a sugárszórás ellentétes 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 kell alkalmazni a normál felülethez képest.

  • Nincs – Nincs elforgatá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 pontnál
  • Blended – Az objektum a normálhoz igazodik a felületi találati ponton és a nyomon követett átalakítás alapján.

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ását.

Feljegyzés

A Tájolás keveréke tulajdonság használatával szabályozhatja a forgatási tényezők közötti egyensúlyt, ha a Tájolási mód blended (Blended) értékre van állítva. A 0.0-s é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 hajtott tájolással rendelkezik.

SurfaceMagnetism példa

Annak meghatározása, hogy milyen felületek ütközhetnek

Ha ö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ú raycast-okat végez annak meghatározására, hogy milyen felületre "mágnes" magát. Ha a GameObject solver rendelkezik egy ütközővel a tulajdonságban MagneticSurfaces SurfaceMagnetismfelsorolt rétegek egyikén, akkor 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. Ez a furcsa viselkedés elkerülhető a fő GameObject és az összes gyermek beállításával a Raycast-réteg figyelmen kívül hagyása vagy a MagneticSurfaces LayerMask tömb megfelelő módosítása.

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 tulajdonságbeállításnál MaxRaycastDistance távolabbi felületeket a SurfaceMagnetism raycasts figyelmen kívül hagyja.

DirectionalIndicator

Az DirectionalIndicator osztály egy címke mentén álló összetevő, amely a kívánt térbeli pont irányához orientált.

Leggyakrabban akkor használják, ha a nyomon követett céltípus értéke SolverHandler Heada következő. Ilyen módon a solverrel rendelkező UX-ö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ának meghatározása az Irányított cél tulajdonságon keresztül történik.

Ha a felhasználó megtekintheti az iránycélt, vagy bármilyen referenciakeret van beállítva, SolverHandlerakkor 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ányított célt az FOV-ban.

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

  • Maximális mutatóméret – A mutatóobjektum maximális méretezése

  • Láthatósági méretezé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 referenciakeret (azaz a kamera) szempontjából ez a tulajdonság határozza meg, hogy az objektum milyen távolságra legyen a mutató irányától a nézetport közepétől.

Irányjelző tulajdonságai
Irányjelző tulajdonságai

Irányított mutató példajelképe
Irányított mutató példajelképe (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 solvert 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 metsződnek a kézzel. A rendszer egy származtatott osztályt HandConstraint HandConstraintPalmUp is tartalmaz, amely bemutatja a solver nyomon követett objektum aktiválásának gyakori viselkedését, amikor a tenyér a felhasználóval néz szembe.

A hand menük létrehozásához a Hand Constraint solver használatával kapcsolatos példákért tekintse meg a Kézi menü oldalt .

Lásd még