A Solver áttekintése – MRTK2
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 mutatTrackedHandedness
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.
Example of various properties associated with each TrackedTargetType
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 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).
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 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 GoalRotation
GoalScale
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.
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é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, 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
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 RadialView
tracked 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
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
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 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, 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 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.
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 MagneticSurfaces
SurfaceMagnetism
felsorolt 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 SolverHandler
Head
. 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
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 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.