A Solver áttekintése

Solver Main

A megoldók olyan összetevők, amelyek lehetővé teszik egy objektum pozíció tájolásának kiszámítását egy előre definiált & algoritmus alapján. Például elhelyezhet egy objektumot a felhasználó tekintete által aktuálisan eltalált felületen.

A Solver rendszer determinisztikusan határozza meg ezen átalakítási számítások műveleti sorrendjét, mivel nincs megbízható módszer az összetevők frissítési sorrendjének megadására a Unityben.

A megoldók számos viselkedést kínálnak az objektumok más objektumokhoz vagy rendszerekhez való csatolásához. Egy másik példa lehet egy címke mentén objektum, amely a felhasználó előtt rámutat (a kamera alapján). A megoldó 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 halmozott, például címke mentén való viselkedés + surfaceism +jd.

A megoldó használata

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

  • Solver: Az alap absztrakt osztály, amelyből minden megoldó származik. Állapotkövetést, zökkenőmentes paramétereket és megvalósítást, automatikus megoldórendszer-integrációt és frissítési sorrendet biztosít.
  • SolverHandler: Beállítja a referenciaobjektumot a nyomon követéséhez (például a fő kamera-átalakítást, a kézi sugárét stb.), kezeli a megoldó összetevők gyűjtését, és végrehajtja azok frissítését a megfelelő sorrendben.

A harmadik kategória maga a megoldó. A következő megoldók biztosítják az alapvető működés építőelemét:

  • Orbital: Zárolja a megadott pozíciót, és eltolja a hivatkozott objektumtól.
  • ConstantViewSize: Úgy méretez, hogy állandó méretet tartsunk fenn a hivatkozott objektum nézetével kapcsolatban.
  • RadialView: Megtartja az objektumot a hivatkozott objektum által a nézetvetűn belül.
  • Follow: A hivatkozott objektum felhasználó által megadott határán belül tartja az objektumot.
  • InBetween: Egy objektumot két nyomon követett objektum között tart meg.
  • SurfaceMagnetism: a világ felszínére veti a sugarakat, és az objektumot a felszínhez igazítja.
  • DirectionalIndicator: Meghatározza egy objektum pozícióját és tájolását irányjelzőként. A SolverHandler nyomon követéses cél hivatkozási pontjától ez a mutató a megadott DirectionalTarget felé fog tájékozódni.
  • Momentum: Gyorsulás/sebesség/súrlódás alkalmazással szimulálja a más megoldók/összetevők által mozgatott objektumok erősségét és gyorsaságát.
  • HandConstraint: Úgy korlátozza a objektumot, hogy olyan régióban kövesse a kézeket, amely nem metszi a GameObjectet a kézzel. Hasznos korlátozott interaktív tartalmakhoz, például menüket stb. Ez a megoldó az IMixedRealityHand, de az IMixedRealityControllervezérlővel is működik.
  • HandConstraintPalmUp: A HandConstraintből származik, de olyan logikát tartalmaz, amely teszteli, hogy a rendszer az aktiválás előtt a felhasználóhoz áll-e. Ez a megoldó csak az IMixedRealityHand vezérlők esetében működik, más vezérlőtípusokkal ez a megoldó ugyanúgy fog viselkedni, mint az alaposztálya.

A Solver rendszer használata érdekében egyszerűen adja hozzá a fent felsorolt összetevők valamelyikét egy GameObjecthez. Mivel minden Solvernek szüksége van SolverHandler egy -re, a Unity automatikusan létrehoz egyet.

Megjegyzés

A Solvers rendszer használatának példái a SolverExamples.scene fájlban találhatók.

Változáskövetési referencia

Az összetevő Nyomon követett céltípus tulajdonsága határozza meg azt a hivatkozási pontot, amely alapján az összes megoldó kiszámítja az algoritmusokat. Ha például egy értéktípus egy egyszerű összetevővel van meg, akkor a fejről és a felhasználó tekintetének irányában sugárképet fog eredményezni, hogy meg tudja oldani, milyen felületet HeadSurfaceMagnetism ér el a felület. A tulajdonság lehetséges TrackedTargetType értékei a következőek:

  • Fej: A referenciapont a fő kamera átalakítása
  • ControllerRay:Hivatkozási pont a vezérlő átalakítása (azaz a mozgásvezérlőn vagy a kézvezérlőn található mutató eredete), amely a vonali sugár irányára mutat
    • A tulajdonság használatával válassza ki a be- és behozás TrackedHandedness beállításait (például Bal, Jobb, Mindkettő)
  • HandJoint:Hivatkozási pont egy adott kéz közös átalakítása
    • A tulajdonság használatával válassza ki a be- és behozás TrackedHandedness beállításait (például Bal, Jobb, Mindkettő)
    • A tulajdonság TrackedHandJoint használatával határozza meg a használni fogja a közös átalakítást
  • CustomOverride:Hivatkozási pont a hozzárendeltből

Megjegyzés

A ControllerRay és a HandJoint típus esetében is a kezelő először a bal oldali vezérlőt/kézi átalakítást próbálja meg biztosítani, majd a jobb oldalit, ha az előbbi nem érhető el, vagy ha a tulajdonság másként nem rendelkezik.

Solver Tracked Object Example(Példa aTrackedTargetType-hez társított különböző tulajdonságokra)

Fontos

A legtöbb megoldó a által biztosított nyomonott átalakítási cél továbbítóvektorát SolverHandler használja. Kéz közös nyomon követését használó céltípus használata esetén a labdás egyesített cél vektora a fogaton, és nem a fogon keresztül mutathat. Ez a közös adatokat szállító platformtól függ. A bemeneti szimulációk és Windows Mixed Reality a felfelé mutatnak a vektoron keresztül (azaz a zöld vektor felfelé mutat, a kék vektor előre mutat).

Előrefelé vektor

Ennek áthidalásaként frissítse az Additional Rotation (További rotáció) tulajdonságot a 90, 0, 0 tulajdonságra. > Ez biztosítja, hogy a megoldóknak biztosított továbbító vektor a labdán keresztül a kéztől kifelé mutasson.

További rotáció

Másik lehetőségként a Controller Ray tracked céltípust is használhatja a kézen keresztüli rámutatáshoz.

Megoldók láncba láncba láncolata

Ugyananhoz a GameObjecthez több összetevő is hozzáadható, így az Solver algoritmusok láncba vannak láncolva. Az SolverHandler összetevők kezelik az összes megoldó frissítését ugyanazon a GameObjecten. Alapértelmezés szerint a Start menü hívása, amely a vizsgálóban megjelenő sorrendben adja vissza a SolverHandlerGetComponents<Solver>() Solverst.

A Frissített csatolt átalakítás tulajdonság true (igaz) beállítása arra utasítja a függvényt, hogy mentse annak számított pozícióját, tájolását, skálázható egy köztes változóra, amely minden megoldó számára elérhető & (pl. GoalPosition ). Ha hamis, a közvetlenül frissíti a Solver GameObject átalakítását. Ha az átalakítás tulajdonságait egy köztes helyre menti, más megoldók a köztes változótól kezdve végezhetik el a számításaikat. Ennek az az oka, hogy a Unity nem engedélyezi a gameObject.transform frissítéseit, hogy ugyanazon a kereten belül halmozhatóak.

Megjegyzés

A fejlesztők a tulajdonság közvetlen beállításával módosíthatják a Megoldók végrehajtási SolverHandler.Solvers sorrendjét.

Új megoldó létrehozása

Minden megoldónak örökölnie kell az absztrakt alaposztályt( Solver ). A Solver-bővítmények elsődleges követelményei a metódus SolverUpdate felülbírálása. Ebben a módszerben a fejlesztőknek frissíteni kell az örökölt GoalPosition , GoalRotation és GoalScale tulajdonságokat a kívánt értékekre. Emellett általában hasznos a fogyasztó által kívánt SolverHandler.TransformTarget referenciakeretként használni.

Az alábbi kód egy nevű új Solver-összetevőre mutat példát, amely a csatolt objektumot 2m-et a elé InFrontSolverHandler.TransformTarget teszi. Ha a fogyasztó a következőt adja meg: , akkor a lesz a kamera-átalakítás, így ez a Solver a hozzácsatolt SolverHandler.TrackedTargetTypeHead GameObject 2m-et a felhasználó minden képkockája elé fogja SolverHandler.TransformTarget állítani.

/// <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ációval kapcsolatos útmutatói

A megoldó gyakori tulajdonságai

Minden Solver-összetevő azonos tulajdonságokból áll, amelyek az alapvető Solver viselkedését irányítják.

Ha a Smoothing engedélyezve van, a Solver fokozatosan frissíti a GameObject átalakítását a számított értékekre. A módosítás sebességét az egyes átalakítási összetevők LerpTime tulajdonsága határozza meg. Egy magasabb MoveLerpTime érték például lassabb növekményeket eredményez a képkockák közötti mozgásban.

Ha a MaintainScale engedélyezve van, 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 általános tulajdonságok

Orbitális

A osztály egy tag-along összetevő, amely a naprendszer Orbital bolygóihoz hasonlóan viselkedik. Ez a Solver gondoskodik arról, hogy a csatolt GameObject a nyomonott átalakítás körül halad. Így ha a Nyomon követése céltípusa , akkor a GameObject rögzített eltolás alkalmazásával a felhasználó fej körül fog Head állni.

A fejlesztők módosíthatják ezt a rögzített eltolást úgy, hogy a menüket vagy más jelenetösszetevőket szemszinten vagy szinten, stb. a felhasználók körül tövik. Ez a Helyi eltolás és a Világeltolás tulajdonság módosításával történik. A Tájolás típusa tulajdonság határozza meg az objektumra alkalmazott rotációt, ha meg kell tartania az eredeti elforgatását, vagy mindig a kamerával vagy arccal néz, amely a pozícióját meghatározza stb.

Orbital Example
Orbital-példa

RadialView

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

A Minimális maximális megtekintési fok tulajdonság határozza meg, hogy a GameObject egy részének mekkoranek kell lennie.

A Minimális távolság tulajdonság határozza meg, hogy a GameObject milyen messze legyen a felhasználótól. Ha például a GameObjectet 1 ezredm minimális távolsággal haladja meg, azzal a GameObjectet is eltolja, hogy soha ne legyen 1m-esnél közelebb a felhasználóhoz.

A általában a Nyomon követési céltípus beállítással együtt használatos, hogy az összetevő kövesse a felhasználó RadialViewRadialViewHead tekintetét. Ez az összetevő azonban bármilyen nyomon követhető céltípus "nézetében"tartható.

Példa RadialView-nézetre
Példa RadialView-nézetre

Követés

A osztály egy elemet pozícióba hoz a nyomonott cél előtt a helyi Follow továbbítási tengelyhez viszonyítva. A elem lazán korlátozható (más néven tag-along), hogy csak akkor kövesse a elemet, ha a nyomon követési cél túllép a felhasználó által megadott korláton.

A RadialView-megoldóhoz hasonlóan működik, és további vezérlőkkel kezeli a maximális vízszintes függőleges nézet fokát, valamint az objektum tájolását megváltoztató mechanizmusokat.

Tulajdonságok nyomon követése
Tulajdonságok nyomon követése

Kövesse a példa jelenet
Kövesse a példajelenetet (Assets/MRTK/Examples/Demos/Solvers/Scenes/FollowSolverExample.unity)

Inbetween

A InBetween osztály megtartja a csatolt GameObjectet két átalakítás között. Ezt a két átalakító végpontot a GameObject saját nyomonott céltípusa és az összetevő Second Tracked Target Type tulajdonsága SolverHandlerSolverHandlerInBetweenInBetween meg. Általában mindkét típus értéke , az eredményül kapott és érték pedig a két nyomon követhető CustomOverrideSolverHandler.TransformOverrideInBetween.SecondTransformOverride végpontra lesz beállítva.

Futásidőben az összetevő egy másik összetevőt hoz létre a Második nyomon követhető céltípus és a Második átalakítás InBetweenSolverHandlerSolverHandlerInBetween alapján.

A határozza meg, hogy a két átalakítás közötti vonal mentén az objektumot a 0,5-öt félúton, 1.0-t az első átalakításnál, a 0,0-t pedig a második átalakításnál PartwayOffset kell elhelyezni.

InBetween Example
Példa az InBetween solver használatának két átalakítás közötti tartásához

SurfaceMagnetism (SurfaceMagnetism)

A úgy működik, hogy egy sugárcímzést végez egy meghatározott felületrétegi maszkon, és a SurfaceMagnetism GameObjectet a kapcsolati pontra helyezi.

A Surface Normal Offset egy megadott távolságot ad meg a GameObjectnek a felülettől a normál érték irányában, a felszínen található találati pontnál.

Ezzel szemben a Surface Ray Offset a GameObjectet egy megadott távolságban, méterben a felülettől, de az elvégzett sugárcímzés ellentétes irányában adja meg. Így ha a sugárcímzés a felhasználó tekintete, akkor a GameObject közelebb kerül a vonal mentén a felületről a kamerához.

A tájolási mód határozza meg a normál felülethez viszonyított elforgatás típusát.

  • Nincs – Nincs alkalmazva rotáció
  • TrackedTarget – Az objektum a sugárcímzést vezető nyomon követhető transzformációval fog szembesülni
  • SurfaceNormal – Az objektum a normál értéknek megfelelően igazodik a felület találati pontjához
  • Elegyed – Az objektum a normál értéknek megfelelően igazodik a surface és a felület találati pontjához, a nyomonott átalakítás felé néző alapján.

Ha arra szeretné kényszeríteni a gameObjectet, hogy függőlegesen maradjon a Nincs módtól függetlenül,engedélyezze a Tájolás függőlegesen beállítását.

Megjegyzés

A Tájolási színegyensúly tulajdonság használatával szabályozhatja a forgó tényezők közötti egyensúlyt, ha a Tájolás móda Blended (Kevert) beállításra van beállítva. A 0,0 érték tájolását teljes egészében a TrackedTarget mód, az 1.0 érték pedig teljes egészében a SurfaceNormal által vezérelt tájolást fogja követni.

SurfaceMagnetism példa

A visszaható felületek meghatározása

Amikor összetevőt ad hozzá egy GameObjecthez, fontos figyelembe venni a GameObject rétegét és annak gyermekeit, ha vannak SurfaceMagnetism ütköztetők. Az összetevő különböző típusú sugárcímzések elvégzésével határozza meg, hogy milyen felületen "toljuk" meg magát. Ha a solver GameObject egyik rétege a tulajdonságában felsorolt valamelyik rétegben található, akkor a sugárcímzés valószínűleg magától ütközik, és a GameObject a saját összecsukóponthoz lesz MagneticSurfacesSurfaceMagnetism csatolva. Ez a páratlan viselkedés elkerülhető, ha a fő GameObjectet és az összes gyermekét a Raycast figyelmen kívül hagyása rétegre módosítja, vagy megfelelően módosítja a LayerMask tömböt.

Ezzel szemben a GameObject nem ütközik a tulajdonságban nem szereplő rétegen SurfaceMagnetism található MagneticSurfaces felületekkel. Általában ajánlott az összes kívánt felületet egy dedikált rétegre (vagyis felületre)helyezze, és a tulajdonságot csak erre a rétegre helyezze. Az alapértelmezett vagy minden használata azt eredményezheti, hogy a felhasználói felület összetevői vagy a kurzorok hozzájárulnak a megoldóhoz.

Végül a sugárcímzések figyelmen kívül hagyják a tulajdonságbeállításnál távolabbi MaxRaycastDistanceSurfaceMagnetism felületeket.

DirectionalIndicator

A osztály egy tag-along összetevő, amely a kívánt térbeli pont DirectionalIndicator irányában tájékozódik.

Leggyakrabban akkor használatos, ha a Nyomon követhető céltípusa a következőre van beállítva: Head . Így a megoldó UX-összetevő arra fogja irányítani a felhasználót, hogy a kívánt pontot figyelje meg DirectionalIndicator a térben.

A kívánt térpontot a Kétirányú cél tulajdonság határozza meg.

Ha a felhasználó megtekintheti a kétirányú célt, vagy bármilyen hivatkozáskeret van beállítva a fájlban, akkor ez a megoldó letiltja az alatta lévő összes SolverHandlerRenderer összetevőt. Ha nem látható, akkor minden engedélyezve lesz a jelzőn.

A mutató mérete annál közelebb lesz a felhasználóhoz, hogy a FOV-ban rögzítsen egy iránymutatót.

  • Kijelző minimális skálája – A jelzőobjektum minimális skálája

  • Jelző maximális skálája – A jelzőobjektum maximális skálája

  • Láthatósági méretezési tényező – Multiplikátor a FOV növeléséhez vagy csökkentéséhez, amely meghatározza, hogy a kétirányú célpont megtekinthető-e

  • Nézeteltolás – Ez a tulajdonság a referenciakeret (valószínűleg kamera) nézőpontjában határozza meg, hogy milyen messze legyen a mutató irányában az objektum a nézőpont közepétől.

Irányjelző tulajdonságok
Irányjelző tulajdonságok

Irányjelző példa jelenet
Irányjelző példajelenet (Assets/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)

Kéz menü a HandConstraint és a HandConstraintPalmUp parancsokkal

Példa a Kéz menü felhasználói felületének példáira

A viselkedés olyan megoldó megoldást biztosít, amely a nyomon követhető objektumot a korlátozott tartalmak (például a felhasználói felület, menük stb.) számára biztonságos régióra HandConstraint korlátozza. Széf a régiók olyan területek, amelyek nem ékesednek össze a kézzel. Egy származtatott nevű osztálya is megtalálható, amely bemutatja a megoldó által nyomonott objektum aktiválásának gyakori viselkedését, amikor a felhasználó a HandConstraintHandConstraintPalmUp felhasználóval szemben áll.

A Kéz menülapon talál példákat arra, hogyan hozhatók létre kézzel készített menük a Kéz constraint-megoldó használatával.

Lásd még