Solvers – MRTK3
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ővelXRNode
dolgozik: .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őkkelXRNode
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 mutatTrackedHandedness
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 SolverHandler
nyomon 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ékreSolverHandler
Head
van á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 RadialView
nyomon 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 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 é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 Head
van á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.