Sdílet prostřednictvím


Přehled Řešitele – MRTK2

Hlavní řešitel

Řešitelé jsou komponenty, které usnadňují výpočet umístění a orientace objektu podle předdefinovaného algoritmu. Příkladem může být umístění objektu na povrch, na který aktuálně narazí paprskový paprsek uživatele.

Systém Řešitel navíc 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 dalším příkladem by byl objekt značky, který najet myší 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é mohou být bezpečně skládaný, například chování značky + magnetismus povrchu + dynamika.

Jak používat řešitele

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

  • Solver: Základní abstraktní 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í referenční objekt pro sledování (např. transformace hlavní kamery, paprsek ruky 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 sadě uživatelem definovaných hranic odkazovaného objektu.
  • InBetween: Udržuje objekt mezi dvěma sledovanými objekty.
  • SurfaceMagnetism: přetypuje paprsky na povrchy na světě 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: Omezuje objekt na 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 IMixedRealityHand , ale také pracuje s IMixedRealityController.
  • HandConstraintPalmUp: Odvozuje z HandConstraint, ale obsahuje logiku pro testování, zda je palma před aktivací uživatele. Tento řešitel funguje pouze s kontrolery IMixedRealityHand , s jinými typy kontrolerů se tento řešitel bude chovat stejně jako jeho základní třída.

Pokud chcete použít systém Řešitel, stačí přidat 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 paprskové vysílání z hlavy a ve směru pohledu uživatele pro řešení toho, jaký 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 (tj. původ ukazatele na ovladači pohybu nebo kontroleru ruky) směřující ve směru paprsku čáry.
    • TrackedHandedness Pomocí vlastnosti vyberte předvolbu předání (tj. zleva, doprava, obě).
  • HandJoint: Point of reference is the transform of a specific hand joint
    • TrackedHandedness Pomocí vlastnosti vyberte předvolbu předání (tj. zleva, doprava, obě).
    • 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/ruční transformaci a pak vpravo, pokud první není k dispozici nebo pokud TrackedHandedness vlastnost neurčí jinak.

Řešitel – sledovaný objektPříklad různých vlastností přidružených ke každému trackedTargetType

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 je to vektor nahoru, který ukazuje nahoru přes palmu (tj. zelený vektor je nahoru, modrý vektor je vpřed).

Vpřed nahoru – vektor

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

Další otočení

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 tak zřetězovat jejich algoritmy. Komponenty SolverHandler zpracovávají aktualizaci všech řešitelů na stejném GameObjectu. Ve výchozím nastavení SolverHandler volání GetComponents<Solver>() při spuštění vrátí Řešitele v pořadí, v jakém se zobrazí v inspektoru.

Nastavení vlastnosti Aktualizované propojené transformace na hodnotu true navíc dává pokyn, aby Solver uložila svou počítanou pozici, orientaci a měřítko na zprostředkující proměnnou přístupnou všemi Řešiteli (tjGoalPosition. ). 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í mohou 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é GoalPositionGoalRotation a GoalScale vlastnosti na požadované hodnoty. Kromě toho je obecně 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 2m před SolverHandler.TransformTarget. SolverHandler.TrackedTargetType Pokud je uživatel nastaven jako Head, pak SolverHandler.TransformTarget bude fotoaparát transformován, a proto tento Řešitel umístí připojený GameObject 2m 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 v průběhu času. Rychlost této změny je určena každou transformační komponentou LerpTime vlastnost. 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.

Základní vlastnosti řešitele
Společné vlastnosti zděděné všemi komponentami Řešitele

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 na úrovni pasu atd. kolem uživatele. To se provádí úpravou 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 polohu atd.

Orbitální příklad
Příklad orbitální dráhy

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í, jak velká část GameObjectu musí být vždy v zobrazení.

Vlastnosti Minimální a maximální vzdálenost určují, jak daleko má Objekt GameObject být zachován od uživatele. Například procházka k Objektu GameObject s minimální vzdáleností 1 min. odsune GameObject pryč, aby se zajistilo, že se nikdy blíží 1 min. uživateli.

Obecně platí, že RadialView se používá ve spojení se sledovaným cílovým typem nastaveným tak Head , 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.

Příklad radialView
Příklad RadialView

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ý (a.k.a. tag-along), aby se nesledoval, dokud se sledovaný cíl nepřesune za hranicemi definovanými uživatelem.

Funguje podobně jako řešitel RadialView s dalšími ovládacími prvky pro správu Max Horizontal &Vertical View Degrees a mechanismy pro změnu orientace objektu.

Sledování vlastností
Sledování vlastností

Sledování ukázkové scény
Sledování ukázkové scény (prostředky/MRTK/Examples/Demos/Solvers/Scene/FollowSolverExample.unity)

InBetween

Třída InBetween zachová připojený GameObject mezi dvěma transformacemi. Tyto dva koncové body transformace jsou definovány vlastním SolverHandler tracked target typem GameObject a InBetween vlastností Second Tracked Target Type komponenty. Obecně platí, že oba typy budou nastaveny na CustomOverride výsledné SolverHandler.TransformOverride a InBetween.SecondTransformOverride hodnoty nastavené na dva sledované koncové body.

Za běhu vytvoří komponenta další SolverHandler komponentu založenou na vlastnosti Second Tracked Target Type a Second Transform Override.InBetween

Definuje PartwayOffset , kde podél přímky mezi dvěma transformacemi musí být objekt umístěn s 0,5 v polovině, 1,0 v první transformaci a 0,0 v druhé transformaci.

Příklad InBetween
Příklad použití řešitele InBetween k zachování objektu mezi dvěma transformacemi

SurfaceTuristism

Funguje SurfaceMagnetism tak, že provede raycast proti nastavené vrstvěMask povrchů a umístí GameObject v daném okamžiku kontaktu.

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. Proto 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říklad Zařízení Surface Surface

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 komponenta funguje tak, že provádí různé typy paprskových vysílání, aby bylo možné určit, jaký povrch "magnet" sám proti. Pokud řešitel GameObject má koladér na jedné z vrstev uvedených ve MagneticSurfaces vlastnosti SurfaceMagnetism, pak raycast pravděpodobně dosáhne samotného výsledku GameObject připojení 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 Raycast nebo odpovídajícím způsobem upravit MagneticSurfaces pole LayerMask.

SurfaceMagnetism GameObject naopak nebude kolidovat s povrchy na vrstvě, která není uvedena MagneticSurfaces ve vlastnosti. Obecně se doporučuje 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.

Požadovaný bod v prostoru se určuje prostřednictvím vlastnosti Směrový cíl .

Pokud je směrový cíl zobrazitelný uživatelem nebo jakýkoli 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. možná fotoaparát) tato vlastnost definuje, jak daleko má být objekt ve směru ukazatele od středu výřezu.

Směrové vlastnosti ukazatele
Směrové vlastnosti ukazatele

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

Hand menu with HandConstraint and HandConstraintPalmUp

Příklad uživatelského rozhraní nabídky ruky

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 na stránce Nabídky ruky.

Viz také