A Solver áttekintése

Solver Main

A megoldók olyan összetevők, amelyek megkönnyítik az objektumok pozíciójának és & előre meghatározott algoritmusnak megfelelő tájolás kiszámításának módszerét. 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 +bolia.

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 tartson 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 SolverHandler az algoritmusokat. Ha például egy értéktípus egyszerű összetevővel van, akkor a fejről és a felhasználó tekintetének irányában egy sugárképet fog eredményezni, hogy meg tudja oldani, milyen felületet Head SurfaceMagnetism ér el. 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 LinePointer (pl. a mozgásvezérlőre vagy a kézvezérlőre mutató nyíl), amely a vonal sugarának irányára mutat
    • A tulajdonság TrackedHandedness használatával válassza ki a beéklét beállítását (pl. Bal, Jobb, Mindkettő)
  • HandJoint: Hivatkozási pont egy adott kéz közös átalakítása
    • A tulajdonság TrackedHandedness használatával válassza ki a beéklét beállítását (pl. 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 TransformOverride

Megjegyzés

A ControllerRay és a HandJoint típus esetén 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 TrackedHandedness rendelkezik.

Solver Tracked Object Example (Példa a TrackedTargetType-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 Windows Mixed Reality a felfelé mutatnak a nyelvben (azaz zöld vektor felfelé, a kék vektor előre).

Előrefelé vektor

Ennek áthidalásaként frissítse az Additional Rotation (További rotáció) tulajdonságot a(<SolverHandler 90, 0, 0)>. 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ó, ami összefűszi Solver az algoritmusokat. 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 SolverHandler GetComponents<Solver>() Solverst.

Továbbá a Csatolt átalakítás frissítve tulajdonság igazra való beállítása arra utasítja, hogy mentse & számított pozícióját, tájolását és skálázható legyen egy olyan köztes változóra, amely minden megoldó Solver 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é InFront SolverHandler.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.TrackedTargetType Head 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 összes átalakítási összetevő 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övetett céltípusa , akkor SolverHandler a GameObject rögzített eltolás alkalmazásával a felhasználó feje körül fog Head pályára á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 milyen messze legyen a GameObject a felhasználótól. Ha például a GameObjectet 1 ezredm 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, így az összetevő a felhasználó RadialView Head tekintetét követi. Ez az összetevő azonban bármely Nyomon követett 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 a helyi továbbítási tengelyhez viszonyítva a nyomon követett cél előtt Follow pozícióba hoz. Az elem lazán korlátozható (más néven tag-along), hogy ne kövesse, amíg a nyomon követési cél a felhasználó által megadott korláton túl nem halad.

Hasonlóan működik, mint a RadialView megoldó, és további vezérlőkkel kezeli a Max Horizontal & Vertical View Degrees(Függőleges nézet foka) és a objektum tájolásának megváltoztatására szolgáló mechanizmusokat.

A tulajdonságok nyomon követhetők
A tulajdonságok nyomon követhetők

Kövesse a példa jelenetét
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 (Második nyomon követett céltípus) SolverHandler InBetween tulajdonsága határozza meg. Általában mindkét típus értéke , az eredményül kapott és az érték pedig a CustomOverride SolverHandler.TransformOverride két InBetween.SecondTransformOverride nyomonott 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 InBetween SolverHandler felülbírálása tulajdonságok alapján.

A határozza meg, hogy a két átalakítás közötti vonal mentén az objektumot a 0,5-öst félútként, 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-példa
Példa az InBetween solver két átalakítás közötti megtartott objektumra

SurfaceMagnetism

A úgy működik, hogy egy sugárképet helyez el egy felületeket halmaz layerMask (Rétegek maszkja) halmazon, és a GameObjectet erre a pontra SurfaceMagnetism helyezi.

A Normál felület eltolása egy megadott távolságot ad meg a GameObjectnek méterben a felülettől a normál irányban, a felszínen található találati pontnál.

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

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

  • Nincs – Nincs rotáció alkalmazva
  • TrackedTarget – Az objektum a sugárcímzést vezető nyomonott átalakítást fogja látni
  • SurfaceNormal – Az objektum a normál értéknek megfelelően igazodik a felületen található találati ponthoz
  • Kevert – Az objektum a normál értéknek megfelelően igazodik a felület találati pontjához, ÉS a nyomonott átalakítás felé nézőktől függően.

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

Megjegyzés

A Tájolási kevert tulajdonság használatával szabályozhatja a forgó tényezők közötti egyensúlyt, ha a Tájolás mód Blended (Kevert) beállításra van á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ületről "kell" maga a "test". 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 fog ütközni, és a GameObject a saját illesztőponthoz lesz MagneticSurfaces SurfaceMagnetism csatolva. Ez a páratlan viselkedés elkerülhető, ha a fő GameObjectet és az összes gyermekét a Raycast-réteg figyelmen kívül hagyása rétegre módosítja, vagy megfelelően módosítja a MagneticSurfaces LayerMask tömböt.

Ezzel szemben a GameObject nem ütközik a tulajdonságban nem szereplő réteg SurfaceMagnetism MagneticSurfaces felületekkel. Általában ajánlott az összes kívánt felületet egy dedikált rétegre (pl. Felület ) a tulajdonságot MagneticSurfaces pedig csak erre a rétegre. 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árkezelések figyelmen kívül hagyják a tulajdonságbeállításnál távolabbi MaxRaycastDistance SurfaceMagnetism felületeket.

DirectionalIndicator

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

Leggyakrabban akkor használatos, ha a Nyomon követhető céltípusa SolverHandler 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 helyet DirectionalIndicator figyelje meg.

A kívánt térben található pontot 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 referenciakeret van beállítva a fájlban, akkor ez a megoldó letiltja az alatta lévő SolverHandler Renderer összes összetevőt. Ha nem látható, akkor minden engedélyezve lesz a jelzőn.

A mutató mérete csökkenni fog, minél közelebb van a felhasználó a kétirányú cél rögzítéséhez a FOV-ban.

  • Jelző 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ő – Szorzó a FOV növeléséhez vagy csökkentéséhez, amely meghatározza, hogy a kétirányú célpont megtekinthető-e vagy sem

  • Nézet eltolása – A referenciakeret nézőpontból (pl. camera (kamera) tulajdonság azt határozza meg, hogy milyen messze legyen a mutató iránya a nézetport közepétől.

Iránymutató tulajdonságai
Iránymutató tulajdonságai

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

Kézi 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 metszik egymást a kézzel. A származtatott osztálya is megtalálható, amely bemutatja a megoldó által nyomon követett objektum aktiválásának gyakori viselkedését, amikor a rendszer a HandConstraint HandConstraintPalmUp felhasználóhoz tartozik.

A Kéz menülapon talál példákat arra, hogyan lehet kézi menüket létrehozni a Kézmegkötéses megoldó használatával.

Lásd még