Přehled řešení

Solver Main

Řešiteeři jsou komponenty, které usnadňují výpočet pozice objektu & orientaci podle předdefinovaného algoritmu. Příkladem může být umístění objektu na povrch, na který uživatel v současnosti narazí na paprskové vysílání.

Kromě toho systém Solver deterministicky definuje pořadí operací pro tyto transformační výpočty, protože pro Unity neexistuje spolehlivý způsob, jak určit pořadí aktualizací komponent.

Řešitely 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 tag-along, který najede myší před uživatele (podle fotoaparátu). Řešitel může být také připojený ke kontroleru a objektu, aby se značka objektu nasaděla podél kontroleru. Všechny řešiteče je možné bezpečně naskládat, například chování pomocí značek + povrchový šmouh a moment.

Jak používat řešitel

Systém Solver se skládá ze tří kategorií skriptů:

  • Solver: Základní abstraktní třída, ze které jsou odvozeni všichni řešiteeři. Poskytuje sledování stavu, vyhlazování parametrů a implementace, automatickou integraci systému řešitel a pořadí aktualizací.
  • SolverHandler: Nastaví referenční objekt, který se má sledovat (např. transformace hlavního fotoaparátu, ruční paprsky atd.), zpracuje shromažďování komponent řešitelé a provede jejich aktualizaci ve správném pořadí.

Třetí kategorií je samotný řešitel. Následující řešiteeři 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: Zachová objekt v rámci přetypování cone zobrazení odkazovaným objektem.
  • Follow: Uchovává objekt v sadě uživatelem definovaných hranic odkazovaného objektu.
  • InBetween: Uchovává objekt mezi dvěma sledovaných objekty.
  • SurfaceMagnetism: přetypuje paprsky na povrchy ve světě a zarovná objekt na tento povrch.
  • DirectionalIndicator: Určuje umístění a orientaci objektu jako směrový indikátor. Od referenčního bodu sledovaného cíle SolverHandler se tento indikátor bude orientovat na zadaný DirectionalTarget.
  • Momentum: Použije akceleraci,rychlost/třecí plochy k simulaci momentu a springiness objektu přesouvaného jinými řešiteli nebo komponentami.
  • HandConstraint: Omezuje objekt tak, aby sledoval ruce v oblasti, která neprotíná GameObject pomocí 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 IMixedRealityHandem, ale také s IMixedRealityController.
  • HandConstraintPalmUp: Je odvozený od HandConstraint, ale obsahuje logiku k otestování, jestli uživatel před aktivací čelí uživateli. Tento řešitel funguje jenom 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 Solver, jednoduše přidejte do objektu GameObject jednu z výše uvedených komponent. Vzhledem k tomu, že všechny řešiteče vyžadují , Unity ho SolverHandler vytvoří automaticky.

Poznámka

Příklady použití systému Solvers najdete v souboru SolverExamples.scene.

Jak změnit referenční informace ke sledování

Vlastnost Sledovaný cílový typ komponenty definuje referenční bod, který budou všichni řešiteři používat SolverHandler k výpočtu svých algoritmů. Například typ hodnoty s jednoduchou komponentou bude mít za následek paprskové vysílání z hlavy a ve směru pohledu uživatele k řešení toho, na jaký povrch Head SurfaceMagnetism se narazilo. Možné hodnoty pro TrackedTargetType vlastnost jsou:

  • Hlavička: Referenčním bodem je transformace hlavního fotoaparátu.
  • ControllerRay: Referenčním bodem LinePointer je transformace kontroleru (tj. počátek ukazatele na ovladači pohybu nebo ručním kontroleru) odkazující ve směru paprsku čáry
    • Pomocí TrackedHandedness vlastnosti vyberte předvolbu předanosti (tj. Left, Right, Both)
  • HandJoint: Referenční bod je transformace konkrétní spojované ruky.
    • Pomocí TrackedHandedness vlastnosti vyberte předvolbu předanosti (tj. Left, Right, Both)
    • K určení TrackedHandJoint společné transformace, která se má využít, použijte vlastnost .
  • CustomOverride: Referenční bod z přiřazeného TransformOverride

Poznámka

Pro typy ControllerRay i HandJoint se obslužná rutina řešitel pokusí nejprve poskytnout transformaci levého kontroleru nebo ruky a pak doprava, pokud první z těchto typů není k dispozici, nebo pokud vlastnost neurčí TrackedHandedness jinak.

Příklad sledovaného objektu Solver s různými vlastnostmi přidruženými ke každému trackedTargetType

Důležité

Většina řešitelů používá dopředný vektor sledovaného cíle transformace dodaného objektem SolverHandler . Při použití sledovaných cílových typů Hand Joint může dopředný vektor spojování směřovat přes hroudu a ne přes šátek. To závisí na platformě, která poskytuje ruční společná data. Pro simulaci vstupu a Windows Mixed Reality je to up vector, který ukazuje nahoru přes smyšlový graf (tj. zelený vektor je v nastavení, modrý vektor je dopředu).

Vektor dopředu

Chcete-li to překonat, aktualizujte vlastnost Additional Rotation objektu na SolverHandler<90, 0, 0>. Tím se zajistí, že dopředný vektor dodaný řešitelům bude směrovat směrem ven z ruky.

Další otočení

Další možností je použít cílový typ sledování Controller Ray a získat podobné chování při nasměřování pomocí rukou.

Řetězení řešitelů

Do stejného objektu GameObject je možné přidat více Solver komponent, čímž se jejich algoritmy zřetězují. Komponenty SolverHandler se stará o aktualizaci všech řešitelů na stejném objektu GameObject. Ve výchozím nastavení se volání funkce Start vrátí řešitelům v pořadí, ve kterém SolverHandler GetComponents<Solver>() se zobrazují v inspektoru.

Kromě toho se při nastavení vlastnosti Aktualizovaná propojená transformace na true uloží počítaná pozice, orientace & škálování na zprostředkující proměnnou přístupnou všem Solver řešitelům (tj. GoalPosition). Pokud je false, Solver aktualizuje se transformace GameObjectu přímo. Uložením vlastností transformace do zprostředkujícího umístění mohou ostatní řešiteři provádět výpočty od zprostředkující proměnné. Je to proto, že Unity neumožňuje, aby se aktualizace gameObject.transform zásobníku v rámci stejného snímku.

Poznámka

Vývojáři mohou změnit pořadí provádění solverů tím, že nastaví SolverHandler.Solvers vlastnost přímo.

Jak vytvořit nový řešitel

Všichni řešiteeři musí dědit z abstraktní základní třídy Solver . Primární požadavky rozšíření Solver zahrnují přepsání SolverUpdate metody . V této metodě by vývojáři měli aktualizovat zděděné GoalPosition vlastnosti a na požadované GoalRotation GoalScale hodnoty. Kromě toho je obecně užitečné využít jako referenční rámec požadovaný SolverHandler.TransformTarget příjemcem.

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

/// <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í solveru

Běžné vlastnosti řešitel

Každá komponenta Solver má sadu základních identických vlastností, které řídí základní chování Solveru.

Pokud je vyhlazování povolené, solver postupně aktualizuje transformaci objektu GameObject v průběhu času na počítané hodnoty. Rychlost této změny je určená vlastností LerpTime každé komponenty transformace. Například vyšší hodnota MoveLerpTime bude mít za následek pomalejší přírůstky v pohybu mezi snímky.

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

Základní vlastnosti solveru
Společné vlastnosti zděděné všemi komponentami Solveru

Orbitální

Třída Orbital je komponenta se značkou along, která se chová jako planety ve sluneční soustavě. Tento řešitel zajistí, že připojený objekt GameObject obíhá kolem sledované transformace. Proto pokud je typ sledovaného cíle objektu nastavený na hodnotu , bude objekt GameObject obíhá kolem hlavičky uživatele SolverHandler s Head použitým pevným posunem.

Vývojáři mohou tento pevný posun upravit tak, aby nabídky nebo jiné komponenty scény byly na úrovni oka nebo na úrovni scény atd. kolem uživatele. To se provádí úpravou vlastností Místní posun a Posun světa. Vlastnost Typ orientace určuje otočení použité na objekt, pokud má zachovat původní otočení nebo vždy čelit fotoaparátu nebo tváře jakékoli transformaci, která řídí jeho pozici atd.

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

RadialView

je RadialView další komponenta typu značka-along, která uchovává určitou část objektu GameObject v rámci frustum zobrazení uživatele.

Vlastnosti Min & Maximální stupeň zobrazení určují, jak velká část objektu GameObject musí být vždy v zobrazení.

Vlastnosti Min & Maximální vzdálenost určuje, jak daleko se má GameObject od uživatele uchovávat. Když například při cestě k objektu GameObject docílíte minimální vzdálenosti 1 m, objekt GameObject se odsoudí, aby se zajistilo, že se k uživateli nikdy nepřiblíží více než 1 min.

Obecně se RadialView používá společně se sledovaným cílovým typem 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 volně omezený (označuje se také jako tagem) tak, aby nenásledovala, dokud sledovaný cíl nepřesune za hranice definované uživatelem.

Funguje podobně jako v Řešiteli RadialView, s dalšími ovládacími prvky pro správu maximálního vodorovného zobrazení & svislých stupňů zobrazení a mechanismy 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 SolverHandler sledovaným cílovým typem GameObject a InBetween druhou sledovanou vlastností cílového typu . 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ě druhého sledovaného cílového typu a druhých vlastností přepsání transformace .

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 MagneticSurfaces 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. Povrchy) a nastavte MagneticSurfaces 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 SolverHandler 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í – od stanoviska rámce Reference (tj. kamera možná), tato vlastnost definuje, jak daleko má směr indikátoru v ukazateli, že objekt je 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é