Sledování rukou – MRTK2
Profil sledování rukou
Profil sledování rukou se nachází v profilu vstupního systému. Obsahuje nastavení pro přizpůsobení reprezentace rukou.
![Profil sledování rukou](../images/input/handtrackingprofile.png?view=mrtkunity-2022-05)
Společné prefaby
Společné prefaby jsou vizualizovány pomocí jednoduchých prefab. Klouby dlaně a ukazováčku mají zvláštní význam a mají svůj vlastní prefab, zatímco všechny ostatní klouby sdílejí stejný prefab.
Ve výchozím nastavení jsou prefaby pro ruční spojení jednoduchá geometrická primitiva. V případě potřeby je možné je nahradit. Pokud není zadán žádný prefab vůbec, vytvoří se místo toho prázdné objekty GameObjects .
Upozornění
Vyhněte se používání složitých skriptů nebo nákladného vykreslování ve společných prefabech, protože společné objekty se transformují na každém snímku a můžou mít značné náklady na výkon.
Výchozí znázornění rukou | Společné popisky |
---|---|
![]() |
![]() |
Ruční síťovina prefab
Síť rukou se používá, pokud plně definovaná data sítě poskytuje zařízení pro sledování rukou. Síť vykreslovatelná v prefabu je nahrazena daty ze zařízení, takže stačí fiktivní síť, například datová krychle. Materiál prefabu se používá pro ruční síť.
![Vstupní síť rukou](../images/input-simulation/mrtk_core_input_hands_articulatedhandmesh.png?view=mrtkunity-2022-05)
Zobrazení ruční sítě může mít znatelný dopad na výkon, proto ho můžete úplně zakázat zrušením zaškrtnutí políčka Povolit vizualizaci ruční sítě .
Nastavení vizualizace rukou
Vizualizace ruční sítě a ručního spojení je možné vypnout nebo zapnout pomocí nastavení Režimy vizualizace sítě rukou a Režimy vizualizace ručního spojení . Tato nastavení jsou specifická pro režim aplikace, což znamená, že je možné zapnout některé funkce v editoru (například abyste viděli spojení s simulací v editoru), přičemž stejné funkce jsou vypnuté při nasazení do zařízení (v buildech přehrávače).
Mějte na paměti, že obecně se doporučuje mít v editoru zapnutou vizualizaci rukou (aby simulace v editoru ukázala, kde jsou klouby rukou) a aby se v přehrávači vypnula vizualizace dlaně i vizualizace sítě rukou (protože u nich dojde k dosažení výkonu).
Skriptování
Umístění a otočení lze požadovat ze vstupního systému pro každý jednotlivý ruční spoj jako MixedRealityPose
.
Případně systém umožňuje přístup k objektům GameObjects , které následují za spoji. To může být užitečné, pokud by jiný objekt GameObject měl sledovat spojení nepřetržitě.
Dostupné spoje jsou uvedeny v výčtu TrackedHandJoint
.
Poznámka
Společné objekty jsou zničeny při ztrátě sledování rukou! Ujistěte se, že všechny skripty používající společný objekt zpracovávají null
případ elegantně, aby se zabránilo chybám.
Přístup k danému ručnímu ovladači
Často je k dispozici konkrétní ruční ovladač, například při zpracování vstupních událostí. V tomto případě je možné společná data vyžádat přímo ze zařízení pomocí IMixedRealityHand
rozhraní.
Společná pozice dotazování z kontroleru
Funkce TryGetJoint
vrátí false
, pokud požadovaný spoj není z nějakého důvodu k dispozici. V takovém případě bude MixedRealityPose.ZeroIdentity
výsledná pozice .
public void OnSourceDetected(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
if (hand != null)
{
if (hand.TryGetJoint(TrackedHandJoint.IndexTip, out MixedRealityPose jointPose)
{
// ...
}
}
}
Společná transformace z vizualizéru
O společné objekty je možné požádat vizualizér kontroleru.
public void OnSourceDetected(SourceStateEventData eventData)
{
var handVisualizer = eventData.Controller.Visualizer as IMixedRealityHandVisualizer;
if (handVisualizer != null)
{
if (handVisualizer.TryGetJointTransform(TrackedHandJoint.IndexTip, out Transform jointTransform)
{
// ...
}
}
}
Zjednodušený společný přístup k datům
Pokud není poskytnut žádný konkrétní kontroler, jsou k dispozici třídy nástrojů pro pohodlný přístup k datům v rukou. Tyto funkce požadují společná data z prvního aktuálně sledovaného zařízení.
Společné hlasování z HandJointUtils
HandJointUtils
je statická třída, která se dotazuje na zařízení první ruky.
if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
// ...
}
Společná transformace z ruční společné služby
IMixedRealityHandJointService
uchovává trvalou sadu GameObjects pro sledování kloubů.
var handJointService = CoreServices.GetInputSystemDataProvider<IMixedRealityHandJointService>();
if (handJointService != null)
{
Transform jointTransform = handJointService.RequestJointTransform(TrackedHandJoint.IndexTip, Handedness.Right);
// ...
}
Události sledování rukou
Vstupní systém také poskytuje události, pokud není žádoucí dotazování dat přímo z kontrolerů.
Společné akce
IMixedRealityHandJointHandler
zpracovává aktualizace společných pozic.
public class MyHandJointEventHandler : IMixedRealityHandJointHandler
{
public Handedness myHandedness;
void IMixedRealityHandJointHandler.OnHandJointsUpdated(InputEventData<IDictionary<TrackedHandJoint, MixedRealityPose>> eventData)
{
if (eventData.Handedness == myHandedness)
{
if (eventData.InputData.TryGetValue(TrackedHandJoint.IndexTip, out MixedRealityPose pose))
{
// ...
}
}
}
}
Události sítě
IMixedRealityHandMeshHandler
manipuluje změny kloubové sítě rukou.
Všimněte si, že mřížky rukou nejsou ve výchozím nastavení povolené.
public class MyHandMeshEventHandler : IMixedRealityHandMeshHandler
{
public Handedness myHandedness;
public Mesh myMesh;
public void OnHandMeshUpdated(InputEventData<HandMeshInfo> eventData)
{
if (eventData.Handedness == myHandedness)
{
myMesh.vertices = eventData.InputData.vertices;
myMesh.normals = eventData.InputData.normals;
myMesh.triangles = eventData.InputData.triangles;
if (eventData.InputData.uvs != null && eventData.InputData.uvs.Length > 0)
{
myMesh.uv = eventData.InputData.uvs;
}
// ...
}
}
}
Známé problémy
.NET Native
V současné době je známý problém s hlavními buildy používajícími back-end .NET. V .NET Native IInspectable
nelze pomocí příkazu zařaďte ukazatele z nativního kódu na spravovaný kódMarshal.GetObjectForIUnknown
. MRTK ho používá k získání SpatialCoordinateSystem
dat z ruky a očí z platformy.
Jako alternativní řešení tohoto problému jsme v nativním úložišti sady Mixed Reality Toolkit zadali zdroj knihovny DLL. Postupujte podle pokynů v souboru README a zkopírujte výsledné binární soubory do složky Plugins v prostředcích Unity. Poté skript WindowsMixedRealityUtilities poskytnutý v MRTK vyřeší alternativní řešení za vás.
Pokud chcete vytvořit vlastní knihovnu DLL nebo zahrnout toto alternativní řešení do existující knihovny DLL, jádro alternativního řešení je:
extern "C" __declspec(dllexport) void __stdcall MarshalIInspectable(IUnknown* nativePtr, IUnknown** inspectable)
{
*inspectable = nativePtr;
}
A jeho použití v kódu Unity jazyka C#:
[DllImport("DotNetNativeWorkaround.dll", EntryPoint = "MarshalIInspectable")]
private static extern void GetSpatialCoordinateSystem(IntPtr nativePtr, out SpatialCoordinateSystem coordinateSystem);
private static SpatialCoordinateSystem GetSpatialCoordinateSystem(IntPtr nativePtr)
{
try
{
GetSpatialCoordinateSystem(nativePtr, out SpatialCoordinateSystem coordinateSystem);
return coordinateSystem;
}
catch
{
UnityEngine.Debug.LogError("Call to the DotNetNativeWorkaround plug-in failed. The plug-in is required for correct behavior when using .NET Native compilation");
return Marshal.GetObjectForIUnknown(nativePtr) as SpatialCoordinateSystem;
}
}