A Solver áttekintése – MRTK2
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 mutatTrackedHandedness
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.
Pé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).
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.
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.TransformTarget
elé 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.
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
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
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
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.
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.
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
SurfaceMagnetism
felsorolt 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
Head
a 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, SolverHandler
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á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ányított mutató példajelképe (Assets/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)
Hand menu with HandConstraint and HandConstraintPalmUp
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.