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.

Profil sledování 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
Kloubové klouby rukou Vstupní klouby rukou

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íť.

Vstupní síť rukou

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 MixedRealityPosejako .

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.ZeroIdentityvý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;
    }
}