Sdílet prostřednictvím


Řešitelé – MRTK3

Hlavní řešitel

Řešitelé jsou komponenty, které usnadňují výpočet pozice a orientace objektu podle předdefinovaného algoritmu. Příklad: umístění objektu na povrch, se kterým se protíná paprsek pohledu uživatele.

Systém Řešitel deterministicky definuje pořadí operací pro tyto výpočty transformace, protože neexistuje žádný spolehlivý způsob, jak určit pořadí aktualizací pro komponenty Unity.

Řešitelé nabízejí řadu chování pro připojení objektů k jiným objektům nebo systémům. Jedním z dalších příkladů by byl objekt značky, který najet před uživatelem na základě kamery. Řešitel může být také připojen k kontroleru a objektu, aby se značka objektu podél kontroleru. Všichni řešitelé můžou být bezpečně skládaný – například chování značky plus magnetismus povrchu plus dynamika.

Způsob použití

Systém Řešitel se skládá ze tří kategorií skriptů:

  • Solver: Abstraktní základní třída, ze které jsou odvozeni všichni řešitelé. Poskytuje sledování stavu, vyhlazování parametrů a implementaci, automatickou integraci systému řešitele a pořadí aktualizací.
  • SolverHandler: Nastaví sledování referenčních objektů (například: transformace hlavní kamery, paprsek rukou atd.), zpracovává shromažďování komponent řešitele a provádí jejich aktualizaci ve správném pořadí.

Třetí kategorií je samotný řešitel. Následující řešitelé poskytují stavební bloky pro základní chování:

  • Orbital: Zamkne se na zadanou pozici a posun od odkazovaného objektu.
  • ConstantViewSize: Škáluje tak, aby se zachovala konstantní velikost vzhledem k zobrazení odkazovaného objektu.
  • RadialView: Udržuje objekt v rámci kužele zobrazení přetypování odkazovaným objektem.
  • Follow: Udržuje objekt v rámci sady uživatelem definovaných hranic odkazovaného objektu.
  • InBetween: Udržuje objekt mezi dvěma sledovanými objekty.
  • SurfaceMagnetism: přetypuje paprsky na povrchy světa a zarovná objekt na tento povrch.
  • DirectionalIndicator: Určuje pozici a orientaci objektu jako směrový indikátor. Z referenčního bodu sledovaného cíle ŘešitelHandler se tento indikátor orientuje k zadanému SměralTargetu.
  • Momentum: Použije akceleraci/rychlost/tření pro simulaci dynamiky a pružiny objektu, který se přesouvá jinými řešiteli/komponentami.
  • HandConstraint: Objekt Omezení pro sledování rukou v oblasti, která neprotíná GameObject rukama. Užitečné pro ručně omezený interaktivní obsah, jako jsou nabídky atd. Tento řešitel je určen pro práci s XRNode.
  • HandConstraintPalmUp: Odvozuje z HandConstraint, ale obsahuje logiku pro testování, zda je palma před aktivací uživatele. Tento řešitel funguje jenom s XRNode kontrolery a bude se chovat stejně jako jeho základní třída s jinými typy kontrolerů.
  • Overlap: Překrývá sledovaný objekt.

Chcete-li použít systém Řešitel, přidejte jednu z výše uvedených komponent do Objektu GameObject. Vzhledem k tomu, že všichni Řešitelé vyžadují , SolverHandlervytvoří ji Unity automaticky.

Poznámka:

Příklady použití systému Řešitele najdete v souboru SolverExamples.scene .

Referenční informace ke sledování změn

Vlastnost SolverHandler Tracked Target Type komponenty definuje bod odkazu všichni řešitelé budou používat k výpočtu jejich algoritmů. Například typ Head hodnoty s jednoduchou SurfaceMagnetism komponentou bude mít za následek přetypování paprsku z hlavy a ve směru pohledu uživatele pro řešení toho, který povrch je zasažen. Potenciální hodnoty pro TrackedTargetType vlastnost jsou:

  • *Hlava: Bod odkazu je transformace hlavní kamery
  • ControllerRay: Bod odkazu je LinePointer transformace na kontroleru (to znamená původ ukazatele na ovladači pohybu nebo kontroleru ruky) ukazující ve směru paprsku čáry.
    • TrackedHandedness Pomocí vlastnosti vyberte předvolbu předání (to znamená levý, pravý, oba)
  • HandJoint: Bod odkazu je transformace konkrétního kloubu ruky
    • TrackedHandedness Pomocí vlastnosti vyberte předvolbu předání (to znamená levý, pravý, oba)
    • TrackedHandJoint Použití vlastnosti k určení společné transformace, která se má využít
  • CustomOverride: Bod odkazu z přiřazeného TransformOverride

Poznámka:

U obou typů ControllerRay i HandJoint se obslužná rutina řešitele pokusí nejprve poskytnout levý kontroler nebo transformaci rukou a pak vpravo, pokud první není k dispozici nebo pokud TrackedHandedness vlastnost neurčuje jinak.

Důležité

Většina řešitelů používá dopředu vektor sledovaného transformačního cíle poskytnutého objektem SolverHandler. Pokud používáte typ sledovaného kloubu ruky , může dopředu vektor dlaně ukazovat prsty, a ne přes dlaň. To závisí na platformě poskytující podkladová data. Pro vstupní simulaci a Windows Mixed Reality ukazuje vektor nahoru přes palmu (jinými slovy, zelený vektor je nahoru, modrý vektor je vpřed).

Chcete-li tuto možnost překonat, aktualizujte vlastnost Další otočení na SolverHandler hodnotu< 90, 0, 0>. Tím se zajistí, že dopředu zadaný vektor řešitelům ukazuje rukou a směrem ven od ruky.

Alternativně můžete použít typ cíle sledovaného raye kontroleru, abyste získali podobné chování pro bodování rukou.

Jak zřetězovat řešitele

Do stejného Objektu GameObject je možné přidat více Solver komponent, a tím zřetězovat jejich algoritmy. Komponenty SolverHandler zpracovávají aktualizaci všech řešitelů na stejném Objektu GameObject. Ve výchozím nastavení volání GetComponents<Solver>() startu, která vrátí Řešitele v pořadí, SolverHandler v jakém se zobrazí v inspektoru.

Kromě toho nastavení vlastnosti Aktualizované propojené transformace na hodnotu true dává pokyn, aby Solver uložil jeho počítanou pozici, orientaci a měřítko do zprostředkující proměnné přístupné všemi Řešiteli (to znamená GoalPosition). Pokud je tato hodnota false, Solver aktualizuje se transformace GameObjectu přímo. Uložením vlastností transformace do zprostředkujícího umístění můžou ostatní Řešitelé provádět výpočty počínaje zprostředkující proměnnou. Je to proto, že Unity neumožňuje aktualizaci gameObject.transform na stack v rámci stejného rámce.

Poznámka:

Vývojáři můžou změnit pořadí provádění Řešitelů nastavením SolverHandler.Solvers vlastnosti přímo.

Jak vytvořit nového řešitele

Všichni řešitelé musí dědit z abstraktní základní třídy , Solver. Primární požadavky rozšíření Řešitele zahrnují přepsání SolverUpdate metody. V této metodě by vývojáři měli aktualizovat zděděné GoalPositionGoalRotationa GoalScale vlastnosti na požadované hodnoty. Navíc je užitečné využít SolverHandler.TransformTarget jako referenční rámec požadovaný spotřebitelem.

Níže uvedený kód poskytuje příklad nové komponenty Řešitel, InFront která umístí připojený objekt 2 m před SolverHandler.TransformTarget. Spotřebitel nastaví SolverHandler.TrackedTargetType jako Head, pak SolverHandler.TransformTarget bude fotoaparát transformovat, a tak tento Řešitel umístí připojený GameObject 2 m před pohled uživatele každý rám.

/// <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;
        }
    }
}

Průvodci implementací Řešitele

Běžné vlastnosti řešitele

Každá komponenta Řešitel má základní sadu identických vlastností, které řídí základní chování Řešitele.

Pokud je technologie Smoothing povolená, Řešitel postupně aktualizuje transformaci GameObjectu na počítané hodnoty. Vlastnost LerpTime každé součásti transformace určuje rychlost této změny. Například vyšší hodnota MoveLerpTime způsobí pomalejší přírůstky pohybu mezi snímky.

Pokud je funkce MaintainScale povolená , Řešitel použije výchozí místní škálování GameObjectu.

Orbitální

Třída Orbital je komponenta, která se chová jako planety ve sluneční soustavě. Tento Řešitel zajistí, že připojený GameObject obíhají kolem sledované transformace. Pokud je tedy typ sledovaného SolverHandler cíle nastaven na Head, GameObject bude obíhají kolem hlavy uživatele s pevným posunem použitým.

Vývojáři můžou tento pevný posun upravit tak, aby se nabídky nebo jiné součásti scény zachovaly na úrovni očí nebo pasu atd. kolem uživatele. To se provádí změnou vlastností místního posunu a posunu světa. Vlastnost Typ orientace určuje otočení použité u objektu, pokud by mělo zachovat původní otočení nebo vždy čelit fotoaparátu nebo tváři, ať už transformace řídí jeho pozici.

Paprskové zobrazení

Jedná se RadialView o další komponentu, která uchovává určitou část GameObjectu v rámci frustum zobrazení uživatele.

Vlastnosti Min & Max View Degrees určují, kolik části GameObjectu musí být vždy v zobrazení.

Vlastnosti Minimální a maximální vzdálenost určují, jak daleko by se objekt GameObject měl uchovávat od uživatele. Například procházka k Objektu GameObject s minimální vzdáleností 1 m posune GameObject pryč, aby se zajistilo, že je nikdy blíž než 1 m k uživateli.

Obecně se používá se sledovaným cílovým typem nastaveným takHead, RadialView aby komponenta sledovala pohled uživatele. Tato komponenta ale může fungovat tak, aby byla zachována v zobrazení libovolného sledovaného cílového typu.

Sledovat

Třída Follow umístí prvek před sledovaný cíl vzhledem k místní osě dopředu. Prvek může být volně omezený (označovaný také jako "tag-along") tak, aby se nesledoval, dokud sledovaný cíl nepřejde mimo hranice definované uživatelem.

Funguje podobně jako řešitel RadialView s dalšími ovládacími prvky pro správu Max Horizontal &Vertical View Degrees and mechanisms to alter the object's Orientation.

InBetween

Třída InBetween zachová připojený GameObject mezi dvěma transformacemi. Vlastnost Typu druhého sledovaného cíle objektu GameObject SolverHandler a vlastnost Second Tracked Target Type definují tyto dva koncové body transformace. InBetween Obecně platí, že oba typy se nastaví na CustomOverride výsledné SolverHandler.TransformOverride a výsledné a InBetween.SecondTransformOverride hodnoty se nastaví na dva sledované koncové body.

Komponenta InBetween vytvoří další SolverHandler komponentu za běhu na základě vlastností Přepsání druhého sledovaného cíle a druhé transformace.

Podél čáry mezi dvěma transformacemi definuje, PartwayOffset kde bude objekt umístěn s 0,5 v polovině, 1,0 při první transformaci a 0,0 při druhé transformaci.

SurfaceTuristism

Funguje SurfaceMagnetism tak, že provede raycast proti nastavené vrstvěMask povrchů a umístí GameObject do tohoto kontaktního bodu.

Odsazení normálního povrchu umístí GameObject nastavenou vzdálenost v metrech od povrchu ve směru normálního stavu v místě dosažení na povrchu.

Naopak Surface Ray Offset umístí GameObject nastavenou vzdálenost v metrech od povrchu, ale v opačném směru provedeného raycastu. Takže pokud je paprskový vysílání pohledem uživatele, GameObject se posune blíž podél přímky od bodu hitu na povrchu k fotoaparátu.

Režim orientace určuje typ otáčení, který se má použít ve vztahu k normálu na povrchu.

  • Žádné – nepoužívá se žádná rotace
  • TrackedTarget – objekt bude čelit sledované transformaci, která řídí raycast
  • SurfaceNormal – Objekt se zarovná na základě normálního stavu na povrchu
  • Blended – Objekt se zarovná na základě normálního stavu na povrchu A na základě nasměrované transformace.

Chcete-li vynutit, aby přidružený Objekt GameObject zůstal svislý v jakémkoli jiném režimu než Žádný, povolte možnost Zachovat orientaci svisle.

Poznámka:

Pomocí vlastnosti Blend orientace můžete řídit rovnováhu mezi faktory otáčení, když je režim orientace nastaven na Blended. Hodnota 0,0 bude mít orientaci zcela řízenou režimem TrackedTarget a hodnota 1,0 bude mít orientaci řízenou zcela SurfaceNormal.

Překrytí

Jedná se Overlap o jednoduchý řešitel, který zachová transformaci objektu na stejné pozici a otočení jako SolverHandler's cíl transformace.

Určení toho, jaké povrchy se dají stisknout

Při přidávání SurfaceMagnetism komponenty do Objektu GameObject je důležité zvážit vrstvu Objektu GameObject a jejích podřízených objektů, pokud některé mají kolidátory. Tato součást funguje tak, že provádí různé paprskové vysílání, aby bylo možné určit, který povrch "magnet" sám proti. Předpokládejme, že řešitel GameObject má kolaci na jedné z vrstev uvedených ve MagneticSurfaces vlastnosti SurfaceMagnetism. V takovém případě se raycast pravděpodobně trefil sám, což vede k objektu GameObject, který se připojí k vlastnímu koliznímu bodu. Toto liché chování se dá vyhnout nastavením hlavního objektu GameObject a všech dětí na vrstvu ignorovat přetypování Ray nebo odpovídajícím způsobem upravit MagneticSurfaces pole LayerMask.

SurfaceMagnetism GameObject naopak nebude kolidovat s povrchy na vrstvě, která není uvedená ve MagneticSurfaces vlastnosti. Doporučujeme umístit všechny požadované povrchy na vyhrazenou vrstvu (tj . Povrchy) a nastavit MagneticSurfaces vlastnost pouze na tuto vrstvu. Použití výchozího nastavení nebo všeho může vést k tomu, že součásti uživatelského rozhraní nebo kurzory přispívají k řešiteli.

Nakonec se paprskové vysílání přeskočí SurfaceMagnetism dál, než MaxRaycastDistance je nastavení vlastnosti.

DirectionalIndicator

Třída DirectionalIndicator je komponenta podél značky, která se orientuje na směr požadovaného bodu v prostoru. Nejčastěji se používá, když je typ sledovaného SolverHandler cíle nastaven na Headhodnotu . V tomto případě bude komponenta uživatelského rozhraní s DirectionalIndicator řešitelem nasměrovat uživatele, aby se podíval na požadovaný bod v prostoru. Tento bod je určen directional Target vlastnost.

Pokud je směrový cíl zobrazitelný uživatelem nebo podle toho, který rámec odkazu je nastaven v SolverHandlersadě , pak tento řešitel zakáže všechny Renderer komponenty pod ním. Pokud není možné zobrazit, všechno se povolí na indikátoru.

Velikost indikátoru se zmenší blíž, než uživatel zachytí směrový cíl ve svém FOV.

  • Minimální měřítko ukazatele – minimální měřítko objektu ukazatele

  • Maximální měřítko ukazatele – maximální měřítko objektu ukazatele

  • Faktor měřítka viditelnosti – Násobitel pro zvýšení nebo snížení FOV, který určuje, jestli je směrový cílový bod zobrazitelný nebo ne

  • Odsazení zobrazení – z pohledu rámce odkazu (tj. kamery možná) a ve směru ukazatele tato vlastnost definuje, jak daleko je objekt od středu oblasti zobrazení.

Příklad scény směrových indikátorů (prostředky/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)

Hand menu with HandConstraint and HandConstraintPalmUp

Toto HandConstraint chování poskytuje řešitele, který omezuje sledovaný objekt na oblast bezpečnou pro ručně omezený obsah (například uživatelské rozhraní ruky, nabídky atd.). Bezpečné oblasti jsou považovány za oblasti, které se neprotínají rukou. Součástí odvozené HandConstraint třídy volané HandConstraintPalmUp je také předvedení běžného chování aktivace řešitele sledovaného objektu, když je palma směřující k uživateli.

Příklady použití řešitele hand constraint k vytvoření ručních nabídek najdete v dokumentaci k nabídce Ruky.