Přehled řešitele — MRTK2

Řešitel – hlavní

Řešitelé jsou komponenty, které usnadňují způsob výpočtu pozice objektu & orientaci podle předdefinovaného algoritmu. Příkladem může být umístění objektu na povrch, na který aktuálně dopadá pohled uživatele.

Kromě toho systém Řešitele deterministicky definuje pořadí operací pro tyto výpočty transformace, protože neexistuje žádný spolehlivý způsob, jak určit pro Unity pořadí aktualizací komponent.

Řešitelé nabízejí řadu chování pro připojení objektů k jiným objektům nebo systémům. Dalším příkladem může být objekt značky, který se nanáší 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šechny řešitele je možné bezpečně naskládat, například chování značky + magnetismus povrchu + hybnost.

Jak používat řešitele

Systém Řešitele 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, parametry vyhlazování a implementaci, automatickou integraci systému řešitele a pořadí aktualizací.
  • SolverHandler: Nastaví referenční objekt pro sledování (např. transformace hlavní kamery, ruční paprsek 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: Uzamkne se na zadanou pozici a posune od odkazovaného objektu.
  • ConstantViewSize: Umožňuje zachovat konstantní velikost vzhledem k zobrazení odkazovaného objektu.
  • RadialView: Udržuje objekt v kuželu zobrazení přetypované odkazovaným objektem.
  • Follow: Udržuje objekt v sadě uživatelem definovaných mezí odkazovaného objektu.
  • InBetween: Uchovává objekt mezi dvěma sledovanými objekty.
  • SurfaceMagnetism: odlétá paprsky na povrchy na světě a zarovná objekt s tímto povrchem.
  • DirectionalIndicator: Určuje polohu a orientaci objektu jako směrového ukazatele. Od referenčního bodu sledovaného cíle obslužné rutiny řešitele se tento indikátor bude orientovat na zadaný směrový cíl.
  • Momentum: Použije akceleraci/rychlost/tření k simulaci hybnosti a pružnosti objektu, který se přesouvá jinými řešiteli nebo komponentami.
  • HandConstraint: Omezuje objekt, aby sledoval ruce v oblasti, která neprotíná GameObject s rukama. Užitečné pro interaktivní obsah omezený rukou, jako jsou nabídky atd. Tento řešitel je určen pro práci s IMixedRealityHand, ale také pracuje s IMixedRealityController.
  • HandConstraintPalmUp: Odvozuje se z HandConstraint, ale obsahuje logiku pro testování, jestli je dlaň před aktivací směrem k uživateli. Tento řešitel pracuje pouze s kontrolery IMixedRealityHand , s jinými typy kontrolerů se bude tento řešitel chovat stejně jako jeho základní třída.

Chcete-li použít Řešitel systém, jednoduše přidejte jednu z výše uvedených komponent do GameObject. Vzhledem k tomu, že všichni řešitelé vyžadují SolverHandler, unity vytvoří jeden automaticky.

Poznámka

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

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

Vlastnost SolverHandlerSledovaný typ cíle komponenty definuje referenční bod, který budou všichni řešitelé používat k výpočtu svých algoritmů. Například typ hodnoty Head s jednoduchou SurfaceMagnetism komponentou bude mít za následek paprsek z hlavy a ve směru pohledu uživatele, aby se vyřešilo, na jakou plochu dojde. Potenciální hodnoty vlastnosti TrackedTargetType jsou:

  • Head : Point of reference is the transform of the main camera
  • ControllerRay: Referenční bod je LinePointer transformace na ovladači (tj. počátek ukazatele na ovladači pohybu nebo ručním ovladači) směřující ve směru paprsku čáry.
    • TrackedHandedness Pomocí vlastnosti vyberte předvolbu pro odevzdání (tj. Vlevo, Vpravo, Obě).
  • HandJoint: Point of reference is the transform of a specific hand joint
    • TrackedHandedness Pomocí vlastnosti vyberte předvolbu pro odevzdání (tj. Vlevo, Vpravo, Obě).
    • TrackedHandJoint Pomocí vlastnosti určete společnou transformaci, která se má použít.
  • CustomOverride: Referenční bod z přiřazeného TransformOverride

Poznámka

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

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

Důležité

Většina řešitelů používá vektor dopředný cíl sledované transformace zadaný objektem SolverHandler. Pokud používáte typ sledovaného cíle dlaňového kloubu, může směrový vektor dlaňového kloubu míjet prsty, a ne přes dlaň. To závisí na platformě, která poskytuje data z ruky. Pro simulaci vstupu a Windows Mixed Reality je to vektor nahoru, který ukazuje nahoru dlaní (tj. zelený vektor je nahoru, modrý vektor je vpřed).

Vektor dopředu nahoru

Chcete-li tento postup vyřešit, aktualizujte vlastnost Další otočení na SolverHandler<90, 0, 0>. Tím zajistíte, že vektor dopředný dodaný řešitelům bude mířit přes dlaň a směrem ven od ruky.

Další otočení

Případně můžete použít typ sledovaného cíle Controller Ray , abyste získali podobné chování pro ukazování rukou.

Jak zřetědět řešitele

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

Kromě toho nastavením vlastnosti Aktualizovaná propojená transformace na hodnotu true budete instruovat, aby Solver se její vypočítaná pozice, orientace & škálování na zprostředkující proměnnou dostupnou všemi řešiteli (tj GoalPosition. ). Pokud je false, Solver aktualizuje přímo transformaci GameObject. 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 aktualizace gameObject.transform, aby se skládaly ve stejném rámci.

Poznámka

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

Vytvoření 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é GoalPositionvlastnosti a GoalRotationGoalScale 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šitele s názvem InFront , která umístí připojený objekt 2 m před SolverHandler.TransformTarget. SolverHandler.TrackedTargetType Pokud je uživatel nastaven jako Head, pak SolverHandler.TransformTarget bude kamera transformace, a proto tento Řešitel umístí připojený GameObject 2m před pohled uživatele každý snímek.

/// <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šitele má základní sadu identických vlastností, které řídí základní chování Řešitele.

Pokud je povoleno vyhlazování , Pak Řešitel bude postupně aktualizovat transformaci GameObject v průběhu času na počítané hodnoty. Rychlost této změny je určena vlastností LerpTime každé součásti transformace. Například vyšší hodnota MoveLerpTime bude mít za následek pomalejší přírůstky v pohybu mezi snímky.

Pokud je povolená možnost MaintainScale , bude Řešitel využívat výchozí místní škálování Objektu GameObject.

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

Orbitální

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

Vývojáři mohou tento pevný posun upravit tak, aby nabídky nebo jiné komponenty scény zůstaly na úrovni očí, v pase atd. kolem uživatele. To se provádí úpravou vlastností Local Offset a World Offset . Vlastnost Typ orientace určuje otočení použité u objektu, pokud by měl zachovat původní otočení nebo vždy čelit kameře nebo obličeji bez ohledu na transformaci, která je hnacím faktorem jeho pozice atd.

Orbitální příklad
Orbitální příklad

RadialView

Je RadialView další komponenta spolu se značkami, která uchovává určitou část objektu GameObject v rámci zobrazení uživatele.

Vlastnosti Min & Max View Degrees určují, jak velká část objektu GameObject musí být vždy zobrazena.

Vlastnost Min & Max Distance určuje, jak daleko se má objekt GameObject uchovávat od uživatele. Když například přejdete k objektu GameObject s minimální vzdáleností 1 m, odsunete objekt GameObject pryč, abyste zajistili, že nikdy nebude blíž než 1 m k uživateli.

RadialView Obecně se používá ve spojení se sledovaným cílovým typem nastaveným na Head , aby komponenta sledovala pohled uživatele. Tato komponenta však může být zachována v "zobrazení" libovolného sledovaného cílového typu.

RadialView – příklad
Příklad objektu RadialView

Sledovat

Třída Follow umístí prvek před sledovaný cíl vzhledem k jeho místní dopředné ose. Element může být volně omezen (také značky) tak, aby nenásledoval, dokud se sledovaný cíl neposune za hranice definované uživatelem.

Funguje podobně jako řešitel RadialView s dalšími ovládacími prvky pro správu maximálních vodorovných & vertikálních stupňů zobrazení 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 (Assets/MRTK/Examples/Demos/Solvers/Scenes/FollowSolverExample.unity)

InBetween

Třída InBetween zachová připojený GameObject mezi dvěma transformacemi. Tyto dva koncové body transformace jsou definovány vlastním SolverHandlertypem sledovaného cílového objektu GameObject a InBetween vlastností Typu druhého sledovaného cíle komponenty. Obecně platí, že oba typy se nastaví na CustomOverride a výsledné SolverHandler.TransformOverride a InBetween.SecondTransformOverride hodnoty se nastaví na dva sledované koncové body.

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

Definuje PartwayOffset , kde podél přímky mezi dvěma transformacemi má být objekt umístěn s 0,5 jako polovinou, 1,0 na první transformaci a 0,0 při druhé transformaci.

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

Surface Magneticism

Funguje SurfaceMagnetism tak, že provede raycast proti nastavené vrstvě masky povrchů a umístí GameObject na tento bod kontaktu.

Normální posun povrchu umístí GameObject na nastavenou vzdálenost v metrech od povrchu ve směru normálního bodu zásahu na povrchu.

Naopak, Surface Ray Offset umístí GameObject nastavenou vzdálenost v metrech od povrchu, ale v opačném směru než provádí raycast. Pokud je tedy raycast pohledem uživatele, pak se GameObject posune blíž podél čáry od bodu zásahu na povrchu ke kameře.

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á bude řídit raycast.
  • SurfaceNormal – objekt se zarovná podle normálního bodu zásahu na povrchu.
  • Blended – Objekt se zarovná na základě normálního bodu zásahu na povrchu A podle toho, jak směřuje ke sledované transformaci.

Chcete-li vynutit, aby přidružený objekt GameObject zůstal svisle v jiném režimu než None, povolte možnost Zachovat orientaci svisle.

Poznámka

Vlastnost Prolnutí orientace slouží k řízení rovnováhy mezi faktory otáčení, pokud 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 výhradně SurfaceNormal.

Surface Magneticism – příklad

Určení povrchů, na které lze narazit

Při přidávání SurfaceMagnetism komponenty do objektu GameObject je důležité zvážit vrstvu objektu GameObject a její podřízené objekty, pokud nějaké mají kolidátory. Komponenta funguje tak, že provádí různé typy paprskových vysílání, aby určila, na jaký povrch se má "magnetovat". Pokud má řešitel GameObject kolider na jedné z vrstev uvedených ve MagneticSurfaces vlastnosti SurfaceMagnetism, pak raycast pravděpodobně narazí sám na sebe, což způsobí, že GameObject se připojí k vlastnímu bodě s collider. Tomuto nestandardnímu chování se dá předejít nastavením hlavního objektu GameObject a všech podřízených objektů na vrstvu Ignore Raycast nebo MagneticSurfaces úpravou pole LayerMask odpovídajícím způsobem.

SurfaceMagnetism Naopak GameObject 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 komponenty uživatelského rozhraní nebo kurzory přispívají řešiteli.

Nakonec budou raycasty ignorovat SurfaceMagnetism povrchy dále, než MaxRaycastDistance je nastavení vlastnosti.

DirectionalIndicator

Třída DirectionalIndicator je komponenta značky, která se orientuje na směr požadovaného bodu v prostoru.

Nejčastěji se používá, když je typ sledovanéhoSolverHandler cíle nastaven na Headhodnotu . Komponenta uživatelského prostředí s DirectionalIndicator řešitelem tímto způsobem nasměruje uživatele, aby se podíval na požadovaný bod v prostoru.

Požadovaný bod v prostoru je určen pomocí vlastnosti Směrový cíl .

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

Velikost indikátoru se zmenší, čím blíže bude uživatel zachytávat směrový cíl v jeho 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 – multiplikátor pro zvýšení nebo snížení FOV, který určuje, jestli je směrový cílový bod zobrazitelný nebo ne.

  • Odsazení zobrazení – z pohledu referenčního rámce (tj. možná fotoaparátu) tato vlastnost definuje, jak daleko ve směru ukazatele by měl být objekt od středu pohledu.

Vlastnosti ukazatele směru
Vlastnosti ukazatele směru

Ukázková scéna se směrovým indikátorem
Ukázková scéna směrových ukazatelů (Assets/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)

Hand menu with HandConstraint and HandConstraintPalmUp

Příklad uživatelského prostředí pro ruční nabídku

Toto HandConstraint chování poskytuje řešitele, který omezuje sledovaný objekt na oblast, která je bezpečná pro ručně omezený obsah (například uživatelské rozhraní rukou, nabídky atd.). Bezpečné oblasti jsou považovány za oblasti, které se neprotínají s rukou. Odvozená třída volaná HandConstraintHandConstraintPalmUp je také zahrnuta, aby demonstrovala běžné chování aktivace objektu sledovaného řešitelem, když je dlaň směrem k uživateli.

Příklady použití hand constraint řešitele k vytváření ručních nabídek najdete na stránce Hand Menu.

Viz také