Přehled Řešitele – MRTK2
Ř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í , SolverHandler
vytvoří 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.
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á 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).
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.
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é GoalPosition
GoalRotation
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.
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.
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
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í 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 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.
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 Head
hodnotu . 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 SolverHandler
sadě , 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
Příklad scény směrových indikátorů (prostředky/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)
Hand menu with HandConstraint and HandConstraintPalmUp
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.