Přehled Řešitele

Vyřešiteli – hlavní

Ř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 Surface, kterou uživatel pohledu raycast aktuálně narazí.

Kromě toho systém Řešitele deterministickém způsobem definuje pořadí operací pro tyto výpočty transformace, protože neexistuje spolehlivý způsob, jak určit, že se má v rámci aktualizace pro součásti zařadit do Unity.

Ř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 s tagem, který se najede před uživatele (na základě kamery). K řadiči je možné připojit také Řešitele a objekt, který vytvoří značku objektu – podél kontroleru. Všechny Řešitele můžou být bezpečně skládané, například chování značek a rozpotenciálch Surface +.

Použití řešitele

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

  • Solver: Základní abstraktní třída, ze které jsou odvozeny všechny Řešitele. Poskytuje sledování stavu, vyhlazení parametrů a implementaci, automatickou integraci systému Řešitele a pořadí aktualizací.
  • SolverHandler: Nastaví referenční objekt, který se má sledovat (např. hlavní fotoaparát, ruky atd.), zpracovává shromažďování komponent Řešitele a provádí jejich aktualizaci ve správném pořadí.

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

  • Orbital: Zamkne zadanou pozici a posun od odkazovaného objektu.
  • ConstantViewSize: Škáluje pro zachování konstantní velikosti vzhledem k zobrazení odkazovaného objektu.
  • RadialView: Udržuje objekt v rámci zobrazení přetypování na základě odkazovaného objektu.
  • Follow: Udržuje objekt v rámci sady uživatelsky definované meze odkazovaného objektu.
  • InBetween: Udržuje objekt mezi dvěma sledovanými objekty.
  • SurfaceMagnetism: přetypování paprsků na povrchy na světě a zarovnání objektu na tento povrch.
  • DirectionalIndicator: Určuje polohu a orientaci objektu jako Směrový ukazatel. Z odkazu na sledovaný cíl SolverHandler se tento ukazatel orientuje směrem k dodanému DirectionalTarget.
  • Momentum: Aplikuje akceleraci/rychlost/tření pro simulaci potenciál a Springiness pro objekt, který přesouvá jiné Řešitelé nebo komponenty.
  • HandConstraint: Omezuje objekt tak, aby následoval za ruce v oblasti, která GameObject neprotínají s rukou. Hodí se k ručnímu interaktivnímu obsahu, jako jsou nabídky atd. Tento Řešitel je určený pro práci s IMixedRealityHand , ale také spolupracuje s IMixedRealityController.
  • HandConstraintPalmUp: Je odvozen z HandConstraint, ale obsahuje logiku k otestování, jestli je Palm před aktivací uživateli. Tento Řešitel funguje pouze s řadiči IMixedRealityHand a s jinými typy řadičů se tento Řešitel bude chovat stejně jako základní třída.

Chcete-li použít systém Řešitel, stačí přidat jednu z výše uvedených součástí do GameObject. Vzhledem k tomu, že všechny Řešitele vyžadují a, vytvoří se SolverHandler automaticky v Unity.

Poznámka

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

Postup změny sledovacího odkazu

Vlastnost sledovaného cílového typu komponenty definuje bod odkazu, který se použije k výpočtu jejich algoritmů pomocí všech řešitelů. Například hodnota typu Head s jednoduchou SurfaceMagnetism komponentou bude mít za následek raycast z hlav a ve směru pohledu uživatele, aby se vyhodnotí, jaké povrchy se dosáhly. Možné hodnoty pro TrackedTargetType vlastnost jsou:

  • Head : bod odkazu je transformace hlavní kamery.
  • ControllerRay: bod odkazu je transformace na řadiči (tj. počátek ukazatele na řadiči pohybu nebo na ručním řadiči) ukazující ve směru čáry ray.
    • Použijte TrackedHandedness vlastnost pro výběr předvolby pro uchopení pera (tj. vlevo, vpravo, obojí).
  • HandJoint: bod odkazu je transformace konkrétního spoje ručně.
    • Použijte TrackedHandedness vlastnost pro výběr předvolby pro uchopení pera (tj. vlevo, vpravo, obojí).
    • Pomocí TrackedHandJoint vlastnosti určete společnou transformaci, která se má využít.
  • CustomOverride: odkaz na bod z přiřazené

Poznámka

V případě typů ControllerRay i HandJoint se obslužná rutina Řešitele pokusí zadat levou transformaci řadiče/kolaci a pak právo, pokud není k dispozici, nebo pokud Vlastnost neurčuje jinak.

Příklad sledovaných objektů Řešitelerůzných vlastností přidružených ke každému TrackedTargetType

Důležité

Většina řešitelů používá přední vektor sledovaného cíle transformace, který poskytuje SolverHandler . Při použití ručního společného sledovaného cílového typu se může dopředný vektor kapesního zařízení od ruky Ukázat prsty, ne přes Palm. To závisí na platformě, která poskytuje ruční data. pro vstupní simulaci a Windows Mixed Reality se jedná o vektor , který směřuje přes palm (tj. zelený vektor je zapnutý, modrý vektor je zasílaný).

Přeposlání vektoru

Chcete-li to překonat, aktualizujte Další vlastnost rotace na hodnotu až 90, > 0, 0. Tím se zajistí, že dodávanému vektoru pro Řešitele prochází od ruky a směrem ven od ruky.

Další rotace

Alternativně můžete pomocí typu cílový typ adaptéru kontroleru sledovat podobné chování jako při ukázání s praktickými postupy.

Postup řetězení řešitelů

Je možné přidat více Solver komponent do stejného GameObject, což řetězuje jejich algoritmy. SolverHandlerKomponenty zpracovávají aktualizace všech řešitelů na stejném GameObject. Ve výchozím nastavení SolverHandler volání GetComponents<Solver>() funkce Start, která vrátí Řešitele v pořadí, v jakém se zobrazují v inspektoru.

Kromě toho nastavení aktualizované propojené transformační vlastnosti na hodnotu true bude dát pokyn k tomu, aby uložilo svou vypočítanou pozici, orientaci, & měřítko na zprostředkující proměnnou přístupnou všemi Řešiteli (tj GoalPosition .). Je-li nastavena hodnota false, Solver bude přímo transformace GameObject aktualizována. Uložením vlastností transformace do zprostředkujícího umístění mohou jiné Řešitele provádět jejich výpočty počínaje od zprostředkující proměnné. Důvodem je to, že Unity nepovoluje aktualizace gameObject. Transformujte na stack ve stejném rámci.

Poznámka

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

Postup vytvoření nového Řešitele

Všechny Řešitele musí dědit od 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 měli vývojáři aktualizovat zděděné GoalPositionGoalRotation a GoalScale vlastnosti na požadované hodnoty. Kromě toho je všeobecně výhodné využít SolverHandler.TransformTarget jako rámec odkazu, který požaduje příjemce.

Níže uvedený kód obsahuje příklad nové komponenty Řešitele InFront s názvem, která umístí připojený objekt 2 min před SolverHandler.TransformTarget . Pokud SolverHandler.TrackedTargetType je nastaven příjemcem jako Head , pak bude SolverHandler.TransformTarget transformace fotoaparátu, a proto tento Řešitel umístí připojené GameObject 2 min před pohledu uživatele do každého snímku.

/// <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ůvodce implementací Řešitele

Běžné vlastnosti Řešitele

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

Pokud je povoleno vyhlazení , pak Řešitel postupně aktualizuje transformaci GameObject v čase na počítané hodnoty. Rychlost této změny je určena každou vlastností LerpTime součásti transformace. Například vyšší hodnota MoveLerpTime bude mít za následek pomalejší zvýšení pohybu mezi snímky.

Pokud je povolená možnost MaintainScale , využije Řešitel výchozí místní měřítko GameObject.

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

Orbital

OrbitalTřída je komponentou s tagem, která se chová jako planet v slunečním systému. Tento Řešitel zajistí, aby se připojená GameObjecta kolem sledované transformace. Proto pokud sledovaný cílový typ je nastaven na Head , pak se GameObject kolem hlavní pozice uživatele s použitým pevným posunem.

Vývojáři mohou tento pevný posun upravit tak, aby zachoval nabídky nebo jiné komponenty scény na úrovni očí nebo na úrovni pasu atd. kolem uživatele. To se provádí změnou vlastností posunu místního posunu a světa . Vlastnost typ orientace určuje rotaci použitou u objektu, pokud má zachovat jeho původní rotaci, nebo vždycky na kameře nebo na tváři, ať už je v rámci své pozice navázána žádná transformace.

Příklad Orbital
Příklad Orbital

RadialView

RadialViewJe další komponentou s tagem, která udržuje určitou část GameObject v rámci frustum zobrazení uživatele.

Minimální počet stupňů zobrazení minima určuje, jak velká část GameObject musí být vždy v zobrazení.

Vlastnost min Max Distance určuje, jak daleko by měl být GameObject udržován od uživatele. Například procházení k GameObject s minimální vzdáleností 1 milion bude nabízet GameObject, aby bylo zajištěno, že pro uživatele není nikdy blíže než 1 milion.

Obecně se RadialView používá společně se RadialView nastaveným na Head tak, že komponenta bude postupovat podle pohledu uživatele. Tato součást ale může fungovat tak, aby se udržovala v "zobrazení" libovolného sledovaného cílového typu.

Příklad RadialView
Příklad RadialView

Sledovat

FollowTřída umístí prvek před sledovaný cíl vzhledem k místní ose vpřed. Element může být uvolněn omezením (označuje se také jako značka) tak, aby nenásledoval, dokud sledovaný cíl nepřesune nad rámec uživatelem definovaných hranic.

Funguje podobně jako u Řešitele RadialView, s dalšími ovládacími prvky pro správu maximálního vodorovného svislého zobrazenía mechanismů pro změnu orientace objektu.

Sledovat vlastnosti
Sledovat vlastnosti

Následovat příklad scény.
Sledujte příklad scény (Assety/MRTK/příklady/ukázky/Řešitelé/scény/FollowSolverExample. Unity).

Mezi

InBetweenTřída bude uchovávat připojené GameObject mezi dvěma transformacemi. Tyto dva koncové body transformace jsou definovány vlastním SolverHandlerSolverHandler GameObject a InBetweenInBetween . Obecně platí, že oba typy budou nastaveny na CustomOverride a výsledné SolverHandler.TransformOverride hodnoty a jsou InBetween.SecondTransformOverride nastaveny na dva sledované koncové body.

V době běhu InBetween Komponenta vytvoří další komponentu na SolverHandler základě InBetween a SolverHandler .

PartwayOffsetDefinuje, kde podél čáry mezi dvěma transformacemi se objekt umístí s 0,5 jako uprostřed, 1,0 při první transformaci a 0,0 při druhé transformaci.

Mezi příkladem
Příklad použití mezi řešitelem k zachování objektu mezi dvěma transformacemi

SurfaceMagnetism

SurfaceMagnetismFunguje tak, že raycast na LayerMasky povrchu a umístíte GameObject v tomto kontaktním bodě.

Normální posun povrchu umístí GameObjectou vzdálenost v metrech od povrchu ve směru normálního v bodě volání na povrchu.

V opačném případě posunu Surface nastaví GameObjectou vzdálenost v metrech od povrchu, ale v opačném směru raycast. Proto pokud je raycast uživatelem pohledu, pak se GameObject přesune blíž k čáře z místa volání na povrchu na fotoaparát.

Režim orientace určuje typ otočení, který se má použít v souvislosti s normálním na povrchu.

  • Žádné – neaplikuje se žádná rotace
  • TrackedTarget -Object vytvoří sledovanou transformaci, která řídí raycast.
  • SurfaceNormal – objekt se bude zarovnávat na základě normálního bodu volání na povrchu.
  • Blendd -Object bude zarovnán na základě normálního bodu volání na povrchu a na základě sledované transformace.

Pokud chcete přinutit, aby přidružené GameObject zůstaly vertikálně v jakémkoli režimu, který je jiný než none, povolte možnost zachovat orientaci vertikálně.

Poznámka

Chcete-li řídit rovnováhu mezi součiniteli rotace v případě, že je režim orientace nastaven na Blended, použijte vlastnost problend Orientation . Hodnota 0,0 bude mít orientaci zcela řízená TrackedTarget režimem a hodnota 1,0 bude mít orientaci zcela pod SurfaceNormal.

Příklad SurfaceMagnetism

Určení, které povrchy je možné dosáhnout

Při přidávání SurfaceMagnetism komponenty do GameObject je důležité vzít v úvahu vrstvu GameObject a jejích podřízených objektů, pokud některé mají kokolize. Komponenta pracuje pomocí různých typů raycasts k určení toho, na jakou plochu má "magnetická". Pokud má Řešitel GameObject kolizi na jedné z vrstev uvedených ve MagneticSurfaces vlastnosti SurfaceMagnetism , pak se raycast nejspíš projeví v GameObject připojení ke svému vlastnímu bodu konfliktu. Toto liché chování se může vyhnout nastavením hlavní GameObject a všech podřízených na vrstvu ignorování Raycast nebo příslušným příslušným úpravou LayerMask pole.

Naopak SurfaceMagnetism GameObject nebude kolidovat s povrchy na vrstvě, která není uvedená ve MagneticSurfaces Vlastnosti. Obecně se doporučuje umístit všechny požadované plochy do vyhrazené vrstvy (tj. plochy) a nastavit vlastnost pouze na tuto vrstvu. Použití výchozích nebo všech položek může způsobit, že součásti uživatelského rozhraní nebo kurzory přispívají k Řešiteli.

Nakonec jsou povrchy více než MaxRaycastDistance Nastavení vlastností ignorovány SurfaceMagnetism raycasts.

DirectionalIndicator

DirectionalIndicatorTřída je komponentou s tagem, která se orientuje směrem k požadovanému bodu v prostoru.

Nejčastěji se používá v případě, že je sledovaný cílový typ nastaven na Head . V takovém případě bude komponenta uživatelského prostředí s DirectionalIndicator řešitelem nasměrovat uživatele na požadované místo v prostoru.

Požadovaný bod v prostoru je určen pomocí vlastnosti směrovou cílovou .

Pokud je směrový cíl viditelný uživatelem nebo je-li v nástroji nastaven libovolný rámec reference SolverHandler , pak tento Řešitel zakáže všechny součásti, které jsou Renderer pod ním. Pokud není možné zobrazit, bude na indikátoru povolena vše.

Velikost indikátoru zmenší blíže, že uživatel zachytí směrový cíl ve svých FOV.

  • Minimální měřítko indikátoru – minimální měřítko pro objekt indikátoru

  • Maximální měřítko indikátoru – maximální měřítko pro objekt indikátoru

  • Viditelnost stupnice – násobitel pro zvýšení nebo snížení FOV, která určuje, zda je směrový cílový bod zobrazitelný nebo ne

  • Posun zobrazení – z pohledu na rámec Reference (to znamená fotoaparát), tato vlastnost definuje, jak daleko v směru indikátoru má být objekt ze středu zobrazení.

Vlastnosti směrového indikátoru
Vlastnosti směrového indikátoru

Směrovou indikaci – příklad scény
Směrovou indikaci – příklad scény (Assety/MRTK/příklady/ukázky/Řešitelé/scény/DirectionalIndicatorSolverExample. Unity)

Nabídka ruky s HandConstraint a HandConstraintPalmUp

Příklad uživatelského prostředí v nabídce

HandConstraintChování poskytuje Řešitel, který omezuje sledovaný objekt na oblast bezpečnou pro ruční omezení obsahu (například uživatelského rozhraní, nabídky atd.). oblasti Sejf jsou považovány za oblasti, které se s rukou neprotínají. HandConstraintSoučástí je i odvozená třída volané třídy HandConstraintPalmUp , která předvádí běžné chování při aktivaci sledovaného objektu řešitele, když se na zařízení uživatele Palm.

Příklady použití řešitele omezení ruky pro vytváření nabídek najdete na stránce s nabídkou ruky .

Viz také