Přehled Řešitele – MRTK2

Solver Main

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

Kromě toho 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 Unity pořadí aktualizací pro komponenty.

Řešitelé nabízejí celou ř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 spolu se značkou, 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í při označování + povrchové magnetismus + 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ř. hlavní fotoaparát transformace, 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 zadanou pozici a posun od odkazovaného objektu.
  • ConstantViewSize: Škáluje se, aby se zachovala konstantní velikost vzhledem k zobrazení odkazovaného objektu.
  • RadialView: Udržuje objekt v rámci kužele zobrazení přetypovaný odkazovaným objektem.
  • Follow: Udržuje objekt v sadě uživatelem definovaných hranic odkazovaného objektu.
  • InBetween: Uchovává objekt mezi dvěma sledovanými objekty.
  • SurfaceMagnetism: přetypuje paprsky na povrchy na světě a zarovná objekt na daný povrch.
  • DirectionalIndicator: Určuje pozici a orientaci objektu jako směrový indikátor. Od referenčního bodu řešitelhandler sledovaného cíle se tento indikátor orientuje na zadaný SměralTarget.
  • Momentum: Použije akceleraci/ rychlost/třecí plochy 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 rukou. 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 se z HandConstraint, ale zahrnuje logiku, která se má otestovat, pokud je dlaň před aktivací uživatelem. Tento řešitel funguje pouze s kontrolery IMixedRealityHand s jinými typy kontrolerů, které tento řešitel bude chovat stejně jako její základní třída.

Pokud chcete použít systém Řešitel, jednoduše přidejte jednu z výše uvedených komponent do Objektu GameObject. Vzhledem k tomu, že všichni Řešitelé vyžadují , SolverHandlervytvoří se automaticky unity.

Poznámka

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

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

Vlastnost SolverHandlerTracked Target Type komponenty definuje bod odkazu všechny řešitele 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 vlastnosti TrackedTargetType 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 je transformace konkrétního kloubu ruky
    • 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: Point of reference from the assigned TransformOverride

Poznámka

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

Solver Tracked ObjectPříklad různých vlastností přidružených k jednotlivým trackedTargetType

Důležité

Většina řešitelů používá dopředu vektor sledovaného transformačního cíle dodaného .SolverHandler Při použití sledovaného cílového typu dlaně může směrovat dopředu vektor dlaně prsty a ne přes dlaň. To závisí na platformě, která dodává data o ručním spojení. Pro simulaci vstupu a Windows Mixed Reality je to vektor nahoru, který ukazuje nahoru přes palmu (tj. zelený vektor je nahoru, modrý vektor je vpřed).

Forward Up vector

Chcete-li tuto možnost překonat, aktualizujte vlastnost Další otočení na SolverHandler<90, 0, 0>. Tím zajistíte, že vektor vpřed poskytnutý řešitelům ukazuje na dlaň a ven od ruky.

Additional Rotation

Alternativně použijte typ sledovaného cíle Controller Ray k získání podobného 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 Objektu GameObject. Ve výchozím nastavení SolverHandler volání GetComponents<Solver>() při spuštění, která vrátí Řešitele v pořadí, v jakém se zobrazí v inspektoru.

Kromě toho nastavení vlastnosti Aktualizovaná propojená transformace na hodnotu true instruuje, aby Solver uložila svou počítanou pozici, orientaci, & měřítko na zprostředkující proměnnou dostupnou všemi řešiteli (tj GoalPosition. ). Pokud je 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 své výpočty počínaje zprostředkující proměnnou. Je to proto, že Unity neumožňuje aktualizace gameObject.transform na zásobník 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é GoalPositionGoalRotation hodnoty a GoalScale vlastnosti na požadované hodnoty. Kromě toho je obecně cenné využít SolverHandler.TransformTarget jako rámec odkazu požadovaný spotřebitelem.

Níže uvedený kód obsahuje příklad nové komponenty Řešitel, která umístí InFront 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živatelů 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šitele má základní sadu identických vlastností, které řídí základní chování Řešitele.

Pokud je povoleno vyhlazování , řešitel postupně aktualizuje transformaci GameObject 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 bude mít za následek pomalejší přírůstky pohybu mezi snímky.

Pokud je funkce MaintainScale povolená, řešitel použije výchozí místní měřítko GameObjectu.

Core Solver Properties
Společné vlastnosti zděděné všemi komponentami Řešitele

Orbitální

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

Vývojáři mohou tento pevný posun upravit tak, aby nabídky nebo jiné komponenty scény byly 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 pozici atd.

Orbital Example
Příklad oběžné dráhy

Paprskové zobrazení

Jedná se RadialView o další komponentu spolu se značkou, 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 zobrazena.

Vlastnosti Minimální & maximální vzdálenost určují, jak daleko má Objekt GameObject zůstat od uživatele. Například procházka směrem k GameObject s minimální vzdáleností 1m posune GameObject pryč, aby se zajistilo, že se nikdy blíž než 1 min. k uživateli.

Obecně platí, že se používá ve spojení 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.

RadialView Example
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 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 a mechanismy pro změnu orientace objektu.

Follow properties
Sledovat vlastnosti

Follow example scene
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 SolverHandlertracked 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 InBetween další SolverHandler komponentu založenou na vlastnostech druhé sledovaného cílového typu a přepsání druhé transformace .

Definuje PartwayOffset , kde podél čáry mezi dvěma transformacemi musí být objekt umístěn s 0,5 jako poloviční, 1.0 v první transformaci a 0,0 v druhé transformaci.

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

SurfaceTuristism

Práce SurfaceMagnetism provedením raycastu proti nastavené vrstvě Masky povrchů a umístění GameObject v daném okamžiku kontaktu.

Odsazení Surface Normal umístí GameObject nastavenou vzdálenost v metrech od povrchu směrem normálního bodu na povrchu.

Naopak Surface Ray Offset umístí GameObject nastavenou vzdálenost v metrech od povrchu, ale v opačném směru raycast proveden. Proto, pokud raycast je uživatelský pohled, GameObject se přesune 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álnímu stavu 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 bodu na povrchu
  • Blended – Objekt se zarovná na základě normálního bodu na povrchu A na základě směrem k sledované transformaci.

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

Poznámka

Pomocí vlastnosti Orientation Blend můžete řídit rovnováhu mezi faktory otoč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.

SurfaceMagnetism Example

Určení toho, jaké povrchy je možné narazit

Při přidávání SurfaceMagnetism komponenty do Objektu GameObject je důležité zvážit vrstvu Objektu GameObject a jejích dětí, pokud některé mají kolidátory. Komponenta funguje provedením různých typů raycastů, aby bylo možné určit, proti jakému povrchu se "magnet". Pokud řešitel GameObject má kolid na jedné z vrstev uvedených ve MagneticSurfaces vlastnosti SurfaceMagnetism, pak raycast pravděpodobně dojde k samotnému výsledku GameObject připojit k vlastnímu kolizní bodu. Toto liché chování se dá vyhnout nastavením hlavního objektu GameObject a všech dětí na vrstvu Ignore Raycast nebo úpravou MagneticSurfaces pole LayerMask odpovídajícím způsobem.

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 zobrazí dál, než MaxRaycastDistance je nastavení vlastnosti, budou paprsky ignorovat SurfaceMagnetism .

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 sledovaný cílový typSolverHandler nastavené na Head. V tomto případě bude komponenta DirectionalIndicator uživatelského rozhraní s ř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 Directional Target .

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, bude na indikátoru povolené všechno.

Velikost ukazatele se zmenší, čím blíž se uživatel zachytí směrového cíle 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. kamera možná), tato vlastnost definuje, jak daleko ve směru ukazatele by měl být objekt od středu pohledu.

Directional Indicator properties
Vlastnosti směrových ukazatelů

Directional Indicator example scene
Ukázková scéna směrových indikátorů (prostředky/MRTK/Examples/Demos/Solvers/Scene/DirectionalIndicatorSolverExample.unity)

Hand menu with HandConstraint and HandConstraintPalmUp

Hand Menu UX Example

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.). Sejf oblasti se považují za oblasti, které se neprotínají rukou. Odvozená třída HandConstraint volané HandConstraintPalmUp je také zahrnuta k předvedení běžného chování aktivace řešitele sledovaného objektu, když je dlaň směřující k uživateli.

Příklady použití řešitele omezení rukou k vytvoření nabídek najdete na stránce Nabídky ruky.

Viz také