Ruční sledování

Profil sledování rukou

Profil Hand Tracking najdete v profilu vstupního systému. Obsahuje nastavení pro přizpůsobení reprezentace rukou.

Profil sledování rukou

Společné předfabs

Společné předfabs jsou vizualizovány pomocí jednoduchých předfád. Šmoudové a Index Finger mají zvláštní význam a mají vlastní předfab, zatímco všichni ostatní sdílejí stejné předfab.

Ve výchozím nastavení jsou ručně spojované předfabs jednoduché geometrické primitivy. V případě potřeby je možné je nahradit. Pokud není žádné předfab vůbec zadáno, vytvoří se místo toho prázdné objekty GameObject.

Upozornění

Vyhněte se používání složitých skriptů nebo nákladného vykreslování ve společných předfázech, protože společné objekty se transformují na každém snímku a mohou mít značné náklady na výkon.

Výchozí ruční společná reprezentace Společné popisky
Articulated hand uchycená Input Hand

Předfab ruční sítě

Ruční síť se používá, pokud zařízení pro sledování rukou poskytuje plně definovaná data ze sítě. Mesh renderable in the prefab isreplaced by data from the device, so a fiktivní mesh such as a cube is sufficient. Materiál předfabu se používá pro ruční síť.

Vstupní síť rukou

Zobrazení ruční sítě může mít znatelný dopad na výkon, a proto ho můžete úplně zakázat zrušením zaškrtnutí možnosti Povolit vizualizaci pomocí sítě Hand Mesh.

Nastavení ruční vizualizace

Ruční síť a ručně spojované vizualizace je možné vypnout nebo zapnout prostřednictvím nastavení Režimy vizualizace ruční sítě a režimy ruční spojované vizualizace. Tato nastavení jsou specifická pro režim aplikace, což znamená, že je možné zapnout některé funkce v editoru (abyste viděli, jak je vidět například při simulaci v editoru), a zároveň mít při nasazení do zařízení vypnuté stejné funkce (v sestavách přehrávače).

Všimněte si, že obecně se doporučuje zapnout v editoru ručně sdružované vizualizace (aby simulace v editoru ukázala, kde jsou ruky) a mít v přehrávači vypnutou rukou spojnou vizualizaci a vizualizaci ruční sítě (protože u ní dochází k hitu výkonu).

Skriptování

Pozici a otočení lze vyžádat ze vstupního systému pro každou jednotlivou rukou, která je spojná jako MixedRealityPose .

Systém také umožňuje přístup k objektům GameObject, které následují po návěsce. To může být užitečné v případě, že by jiný objekt GameObject měl průběžně sledovat objekt .

Dostupná zařízení jsou uvedená TrackedHandJoint ve výčtu.

Poznámka

Při ztrátě sledování rukou se zničí společný objekt. Ujistěte se, že všechny skripty používající společný objekt případ řádně zvládnou, null aby se zabránilo chybám.

Přístup k danému kontroleru rukou

Často je k dispozici konkrétní ruční kontroler, například při zpracování vstupních událostí. V takovém případě je možné o společná data požádat přímo ze zařízení pomocí IMixedRealityHand rozhraní .

Dotazování společné pozice z kontroleru

Funkce TryGetJoint vrátí hodnotu , pokud požadované spojení z nějakého důvodu není k false dispozici. V takovém případě bude výsledná pozice MixedRealityPose.ZeroIdentity .

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

O společné objekty je možné požádat z vizualizéru 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 předání společných dat. Tyto funkce si vyžádají společná data z prvního aktuálně sledovaného ručního zařízení.

Dotazování společné pozice z HandJointUtils

HandJointUtils je statická třída, která se dotazuje na první aktivní zařízení.

if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
    // ...
}

Společná transformace z ruční společné služby

IMixedRealityHandJointService udržuje trvalou sadu IMixedRealityHandJointService sledování průšecích.

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 z kontrolerů přímo.

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 articulated hand mesh.

Všimněte si, že ve výchozím nastavení nejsou povolené ruční sítě.

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ím sestavením používajícím back-end .NET. V .NET Native nelze ukazatele zařadit z nativního na IInspectable spravovaný kód pomocí Marshal.GetObjectForIUnknown . MRTK pomocí této funkce získá z platformy data o ručním zpracování SpatialCoordinateSystem a pohledu.

Jako alternativní řešení tohoto problému jsme v nativním Mixed Reality Toolkit knihovnu DLL. Postupujte podle pokynů v souboru README a zkopírujte výsledné binární soubory do složky modulů plug-in ve vašich programech Unity. Potom tento alternativní řešení vyřeší skript WindowsMixedRealityUtilities, který je k dispozici v mrtku.

Pokud chcete vytvořit vlastní knihovnu DLL nebo zahrnout toto alternativní řešení do existující knihovny, je základní řešení následující:

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;
    }
}