Řešitelé – MRTK3
Řešitelé jsou komponenty, které usnadňují výpočet pozice a orientace objektu podle předdefinovaného algoritmu. Příklad: umístění objektu na povrch, se kterým se protíná paprsek pohledu uživatele.
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 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 z dalších příkladů by byl objekt značky, který najet 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é můžou být bezpečně skládaný – například chování značky plus magnetismus povrchu plus dynamika.
Způsob použití
Systém Řešitel se skládá ze tří kategorií skriptů:
Solver
: Abstraktní základní 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í sledování referenčních objektů (například: transformace hlavní kamery, paprsek rukou 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 rámci sady uživatelem definovaných hranic odkazovaného objektu.InBetween
: Udržuje objekt mezi dvěma sledovanými objekty.SurfaceMagnetism
: přetypuje paprsky na povrchy světa 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
: Objekt Omezení pro 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 sXRNode
.HandConstraintPalmUp
: Odvozuje z HandConstraint, ale obsahuje logiku pro testování, zda je palma před aktivací uživatele. Tento řešitel funguje jenom sXRNode
kontrolery a bude se chovat stejně jako jeho základní třída s jinými typy kontrolerů.Overlap
: Překrývá sledovaný objekt.
Chcete-li použít systém Řešitel, přidejte 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 přetypování paprsku z hlavy a ve směru pohledu uživatele pro řešení toho, který 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 (to znamená původ ukazatele na ovladači pohybu nebo kontroleru ruky) ukazující ve směru paprsku čáry.TrackedHandedness
Pomocí vlastnosti vyberte předvolbu předání (to znamená levý, pravý, oba)
- HandJoint: Bod odkazu je transformace konkrétního kloubu ruky
TrackedHandedness
Pomocí vlastnosti vyberte předvolbu předání (to znamená levý, pravý, oba)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 nebo transformaci rukou a pak vpravo, pokud první není k dispozici nebo pokud TrackedHandedness
vlastnost neurčuje jinak.
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 ukazuje vektor nahoru přes palmu (jinými slovy, 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 se zajistí, ž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 tím zřetězovat jejich algoritmy. Komponenty SolverHandler
zpracovávají aktualizaci všech řešitelů na stejném Objektu GameObject. Ve výchozím nastavení volání GetComponents<Solver>()
startu, která vrátí Řešitele v pořadí, SolverHandler
v jakém se zobrazí v inspektoru.
Kromě toho nastavení vlastnosti Aktualizované propojené transformace na hodnotu true dává pokyn, aby Solver
uložil jeho počítanou pozici, orientaci a měřítko do zprostředkující proměnné přístupné všemi Řešiteli (to znamená GoalPosition
). 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í 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 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. Navíc je 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 2 m před SolverHandler.TransformTarget
. Spotřebitel nastaví SolverHandler.TrackedTargetType
jako Head
, pak SolverHandler.TransformTarget
bude fotoaparát transformovat, a tak tento Řešitel umístí připojený GameObject 2 m 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. Vlastnost LerpTime každé součásti transformace určuje rychlost této změny. 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.
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 pasu atd. kolem uživatele. To se provádí změnou 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.
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í, kolik části GameObjectu musí být vždy v zobrazení.
Vlastnosti Minimální a maximální vzdálenost určují, jak daleko by se objekt GameObject měl uchovávat od uživatele. Například procházka k Objektu GameObject s minimální vzdáleností 1 m posune GameObject pryč, aby se zajistilo, že je nikdy blíž než 1 m k uživateli.
Obecně se používá 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.
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ý (označovaný také jako "tag-along") tak, aby se nesledoval, dokud sledovaný cíl nepřejde 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 and mechanisms to alter the object's Orientation.
InBetween
Třída InBetween
zachová připojený GameObject mezi dvěma transformacemi. Vlastnost Typu druhého sledovaného cíle objektu GameObject SolverHandler
a vlastnost Second Tracked Target Type definují tyto dva koncové body transformace. InBetween
Obecně platí, že oba typy se nastaví na CustomOverride
výsledné SolverHandler.TransformOverride
a výsledné a InBetween.SecondTransformOverride
hodnoty se nastaví na dva sledované koncové body.
Komponenta InBetween
vytvoří další SolverHandler
komponentu za běhu na základě vlastností Přepsání druhého sledovaného cíle a druhé transformace.
Podél čáry mezi dvěma transformacemi definuje, PartwayOffset
kde bude objekt umístěn s 0,5 v polovině, 1,0 při první transformaci a 0,0 při druhé transformaci.
SurfaceTuristism
Funguje SurfaceMagnetism
tak, že provede raycast proti nastavené vrstvěMask povrchů a umístí GameObject do tohoto kontaktního bodu.
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. Takže 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.
Překrytí
Jedná se Overlap
o jednoduchý řešitel, který zachová transformaci objektu na stejné pozici a otočení jako SolverHandler's
cíl transformace.
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 součást funguje tak, že provádí různé paprskové vysílání, aby bylo možné určit, který povrch "magnet" sám proti. Předpokládejme, že řešitel GameObject má kolaci na jedné z vrstev uvedených ve MagneticSurfaces
vlastnosti SurfaceMagnetism
. V takovém případě se raycast pravděpodobně trefil sám, což vede k objektu GameObject, který se připojí 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 přetypování Ray nebo odpovídajícím způsobem upravit MagneticSurfaces
pole LayerMask.
SurfaceMagnetism
GameObject naopak nebude kolidovat s povrchy na vrstvě, která není uvedená ve MagneticSurfaces
vlastnosti. Doporučujeme 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. Tento bod je určen directional Target vlastnost.
Pokud je směrový cíl zobrazitelný uživatelem nebo podle toho, který 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. kamery možná) a ve směru ukazatele tato vlastnost definuje, jak daleko je objekt od středu oblasti zobrazení.
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 v dokumentaci k nabídce Ruky.