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

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
Kloubové klouby Vstupní spáry rukou

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

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

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