Sledování rukou – MRTK2
Profil sledování rukou
Profil sledování rukou najdete v profilu vstupního systému. Obsahuje nastavení pro přizpůsobení reprezentace rukou.

Společné předpřipravené
Společné předfaby jsou vizualizovány pomocí jednoduchých předfab. Klouby palmového a indexového prstu mají zvláštní důležitost a mají vlastní prefab, zatímco všechny ostatní klouby sdílejí stejný prefab.
Ve výchozím nastavení jsou prefaby rukou jednoduché geometrické primitivy. V případě potřeby je možné je nahradit. Pokud není vůbec zadán žádný prefab, vytvoří se místo toho prázdné objekty GameObjects .
Upozornění
Nepoužívejte složité skripty nebo nákladné vykreslování ve společných předfabech, protože společné objekty jsou transformovány na každém snímku a můžou mít značné náklady na výkon.
Výchozí reprezentace rukou | Štítky s klouby |
---|---|
![]() |
![]() |
Předpřipravená mřížka rukou
Síť rukou se používá v případě, že zařízení pro sledování rukou poskytuje plně definovaná data. Vykreslení sítě v prefabu se nahradí daty ze zařízení, takže fiktivní síť, jako je například datová krychle, stačí. Materiál prefab se používá pro ruční síť.

Zobrazení s ručním okem může mít znatelný dopad na výkon, z tohoto důvodu je možné ho zcela zakázat zrušením zaškrtnutí políčka Povolit vizualizaci rukou .
Nastavení ruční vizualizace
Vizualizace ručních ok a ručně společnou vizualizací je možné vypnout nebo zapnout pomocí nastavení režimů vizualizace rukou a režimy ruční vizualizace . Tato nastavení jsou specifická pro aplikaci, což znamená, že je možné zapnout některé funkce v editoru (viz klouby s simulací v editoru, například) a mít stejné funkce vypnuté při nasazení do zařízení (v buildech přehrávače).
Obecně se doporučuje mít v editoru zapnutou vizualizaci společného kloubu (aby simulace v editoru ukázala, kde jsou klouby rukou) a aby byla vizualizace ručně společná i vizualizace s oky rukou vypnutá v přehrávači (protože se u nich objeví dosažení výkonu).
Skriptování
Pozice a otočení lze požadovat ze vstupního systému pro každý jednotlivý kloub rukou MixedRealityPose
jako .
Alternativně systém umožňuje přístup k GameObjects , které následují klouby. To může být užitečné, pokud by jiný Objekt GameObject měl průběžně sledovat spojení.
Dostupné klouby 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 ovladači ruky
Při zpracování vstupních událostí je často k dispozici konkrétní kontroler rukou, například při zpracování vstupních událostí. V takovém případě je možné vyžadovat společná data přímo ze zařízení pomocí IMixedRealityHand
rozhraní.
Dotazování společné pozice z kontroleru
Funkce TryGetJoint
se 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 rukou
Z vizualizéru kontroleru je možné požadovat společné objekty.
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í zadán žádný konkrétní kontroler, jsou třídy nástrojů k dispozici pro pohodlný přístup k údajům o spojení. Tyto funkce požadují společná data z prvního dostupného ručního zařízení, které je aktuálně sledováno.
Hlasování společné pozice od HandJointUtils
HandJointUtils
je statická třída, která se dotazuje na první aktivní ruční zařízení.
if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
// ...
}
Společná transformace z rukou
IMixedRealityHandJointService
udržuje 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 dotazování dat z kontrolerů přímo není žádoucí.
Společné události
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
zpracovává změny artikulované rukou.
Všimněte si, že ruční sítě nejsou ve výchozím nastavení povoleny.
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ě existuje známý problém s hlavními sestaveními pomocí back-endu .NET. V .NET Native IInspectable
nelze ukazatele zařaďte z nativního na spravovaný kód pomocí Marshal.GetObjectForIUnknown
. MRTK to používá k získání SpatialCoordinateSystem
údajů rukou a očí z platformy.
Jako alternativní řešení tohoto problému jsme poskytli zdroj knihovny DLL v nativním úložišti Mixed Reality Toolkit. Postupujte podle pokynů v souboru README a zkopírujte výsledné binární soubory do složky Plugins ve vašich prostředcích Unity. Potom skript WindowsMixedRealityUtilities zadaný 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, je jádrem alternativního řešení:
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;
}
}