Kézkövetés – MRTK2

Kézkövetési profil

A Hand Tracking profil a bemeneti rendszer profilja alatt található. A kézi ábrázolás testreszabására vonatkozó beállításokat tartalmaz.

Kézkövetési profil

Közös előfarak

A közös előfabák egyszerű előfabák használatával vannak vizualizálva. A Palm és az Index Finger ízületei különleges jelentőséggel bírnak, és saját előfabjuk van, míg minden más ízület ugyanazt az előfabot használja.

Alapértelmezés szerint a kézi kötés előtagjai egyszerű geometriai primitívek. Ezek igény szerint lecserélhetők. Ha egyáltalán nincs megadva előfab, a rendszer üres GameObjects objektumokat hoz létre.

Figyelmeztetés

Ne használjon összetett szkripteket vagy költséges renderelést a közös előképekben, mivel a közös objektumok minden kereten át lesznek alakítva, és jelentős teljesítményköltséggel járhatnak!

Alapértelmezett közös kéz ábrázolása Közös címkék
Csuklós kézkötések Bemeneti kézi kötések

Kézi hálós előfab

A kézi hálót akkor használja a rendszer, ha a kézkövető eszköz teljes körűen definiált hálóadatokat biztosít. Az előfabában renderelhető hálót az eszköz adatai váltják fel, így elegendő egy olyan háló, mint egy kocka. Az előfab anyagát a kézi hálóhoz használják.

Bemeneti kézi háló

A kézhálós megjelenítésnek észrevehető hatása lehet a teljesítményre, ezért teljes egészében letiltható a Hand Mesh-vizualizáció engedélyezése lehetőség bejelölésének jelölésének bejelölésével.

Kézvizualizációs beállítások

A kézi háló és a kéz közös vizualizációi ki- vagy bekapcsolhatók a Kézháló vizualizációs módok beállítással, illetve a Kéz közös vizualizációs módokkal . Ezek a beállítások alkalmazásmód-specifikusak, ami azt jelenti, hogy a szerkesztőben egyes funkciók bekapcsolhatók (például a szerkesztőn belüli szimulációval való együttműködések megtekintéséhez), miközben ugyanezek a funkciók ki vannak kapcsolva az eszközön (a lejátszó buildjeiben).

Vegye figyelembe, hogy a szerkesztőben általában ajánlott bekapcsolni a kézi közös vizualizációt (hogy a szerkesztőben történő szimuláció be tudja mutatni, hogy hol vannak a kézkötések), és hogy a kézi izületi vizualizáció és a kézháló vizualizáció is ki legyen kapcsolva a lejátszóban (mivel teljesítménybeli találatot jelentenek).

Parancsprogramok használata

A bemeneti rendszertől a bemenő rendszertől lekért pozíció és forgatás kérhető minden egyes kézkötéshez MixedRealityPosemint egy .

Másik lehetőségként a rendszer hozzáférést biztosít az ízületeket követő GameObject-ekhez . Ez akkor lehet hasznos, ha egy másik GameObjectnek folyamatosan nyomon kell követnie egy ízületet.

Az elérhető kötések felsorolása az TrackedHandJoint enumerálásban szerepel.

Megjegyzés

A közös tárgy megsemmisül, ha a kézkövetés elveszik! Győződjön meg arról, hogy a közös objektumot használó szkriptek megfelelően kezelik az esetet a null hibák elkerülése érdekében!

Hozzáférés egy adott kézi vezérlőhöz

Egy adott kézi vezérlő gyakran elérhető, például a bemeneti események kezelésekor. Ebben az esetben a közös adatok közvetlenül az eszközről kérhetők le az IMixedRealityHand interfész használatával.

A vezérlő közös pózának lekérdezése

A TryGetJoint függvény akkor ad false vissza, ha a kért kötés valamilyen okból nem érhető el. Ebben az esetben az eredményként kapott póz lesz MixedRealityPose.ZeroIdentity.

public void OnSourceDetected(SourceStateEventData eventData)
{
  var hand = eventData.Controller as IMixedRealityHand;
  if (hand != null)
  {
    if (hand.TryGetJoint(TrackedHandJoint.IndexTip, out MixedRealityPose jointPose)
    {
      // ...
    }
  }
}

Közös átalakítás kézábrázolóból

Közös objektumok kérhetők a vezérlőábrázolótól.

public void OnSourceDetected(SourceStateEventData eventData)
{
  var handVisualizer = eventData.Controller.Visualizer as IMixedRealityHandVisualizer;
  if (handVisualizer != null)
  {
    if (handVisualizer.TryGetJointTransform(TrackedHandJoint.IndexTip, out Transform jointTransform)
    {
      // ...
    }
  }
}

Egyszerűsített közös adathozzáférés

Ha nem ad meg külön vezérlőt, akkor a közműosztályok biztosítják a közös adatokhoz való kényelmes hozzáférést. Ezek a függvények közös adatokat kérnek le az első elérhető kézi eszközről, amely jelenleg nyomon van követve.

A HandJointUtils közös pózának lekérdezése

HandJointUtils A egy statikus osztály, amely lekérdezi az első aktív kézi eszközt.

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

Közös átalakítás kézi közös szolgáltatásból

IMixedRealityHandJointService A állandó GameObjects-készletet tart fenn az ízületek nyomon követéséhez.

var handJointService = CoreServices.GetInputSystemDataProvider<IMixedRealityHandJointService>();
if (handJointService != null)
{
    Transform jointTransform = handJointService.RequestJointTransform(TrackedHandJoint.IndexTip, Handedness.Right);
    // ...
}

Kézkövetési események

A bemeneti rendszer eseményeket is biztosít, ha az adatok közvetlenül a vezérlőkről történő lekérdezése nem kívánatos.

Közös események

IMixedRealityHandJointHandler kezeli a közös álláspontok frissítését.

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))
            {
                // ...
            }
        }
    }
}

Mesh-események

IMixedRealityHandMeshHandler kezeli a csuklós kézi háló változásait.

Vegye figyelembe, hogy a kézi hálók alapértelmezés szerint nincsenek engedélyezve.

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

            // ...
        }
    }
}

Ismert problémák

.NET Native

A .NET-háttérrendszert használó fő buildekkel kapcsolatban jelenleg ismert probléma áll fenn. A .NET Native a IInspectable mutatókat nem lehet natívról felügyelt kódra illeszteni a használatávalMarshal.GetObjectForIUnknown. Az MRTK ezzel szerzi be a SpatialCoordinateSystem kézi és szemadatokat a platformról.

Megkerülő megoldásként biztosítottuk a DLL-forrást a natív Mixed Reality Toolkit-adattárban. Kövesse az ott található README-ben található utasításokat, és másolja az eredményül kapott bináris fájlokat a Unity-objektumok Beépülő modulok mappájába. Ezt követően az MRTK-ban megadott WindowsMixedRealityUtilities szkript megoldja a kerülő megoldást.

Ha saját DLL-t szeretne létrehozni, vagy bele szeretné foglalni ezt a kerülő megoldást egy meglévőbe, a kerülő megoldás magja a következő:

extern "C" __declspec(dllexport) void __stdcall MarshalIInspectable(IUnknown* nativePtr, IUnknown** inspectable)
{
    *inspectable = nativePtr;
}

És annak használata a C# Unity-kódban:

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