Kézkövetés

Kézkövetési profil

A kézkövetési profil az Input System profil alatt található. A kézi ábrázolás testreszabására vonatkozó beállításokat tartalmaz.

Hand Tracking Profile

Közös előfóbok

A közös előfübök egyszerű előretűnök használatával vannak vizualizálva. A Kis- és az Index-ujjlenyomatok különleges jelentőséggel bírnak, és saját előfedődésük van, a többi pedig ugyanazon az előfedőn osztozik.

Alapértelmezés szerint a kéz közös előtagok egyszerű geometriai primitívek. Ezek szükség esetén lecserélhetőek. Ha nincs megadva előzetesfab, akkor ehelyett üres GameObjects lesz létrehozva.

Figyelmeztetés

Kerülje az összetett szkriptek vagy költséges renderelés együttes előkeretben való használatát, mivel a közös objektumok minden képkockán át vannak alakítva, és jelentős teljesítményköltséggel is jár.

Alapértelmezett közös kéz reprezentáció Közös címkék
Articulated hand joints Input Hand joints

Kézi háló előfab

A kézi hálót akkor használja a rendszer, ha a kézkövetési eszköz teljes körű hálóadatokat biztosít. Az előfedőben renderelhető hálót az eszközről származó adatok váltják fel, így elegendő egy üres háló, például egy kocka. Az előfab anyagát a kézhálóhoz használjuk.

Input Hand Mesh

A kézi háló megjelenítése észrevehető hatással lehet a teljesítményre, ezért teljesen le lehet tiltani a Kézi háló vizualizáció engedélyezése lehetőség jelölésének jelölésével.

A vizualizáció kézi beállításai

A kézi háló és a kéz közös vizualizációi a Hand Mesh Vizualizációs módok beállítással, illetve a Kéz közös vizualizációs módjai beállítással ki- és bekapcsolhatóak. Ezek a beállítások alkalmazásmód-specifikusak, ami azt jelenti, hogy egyes funkciókat bekapcsolhat a szerkesztőben (például hogy lássa a szerkesztőben való szimulációt), miközben ugyanezek a funkciók ki vannak kapcsolva az eszközön való üzembe helyezéskor (lejátszó-buildekben).

Vegye figyelembe, hogy általában ajánlott bekapcsolni a közös vizualizációt a szerkesztőben (hogy a szerkesztőben való szimuláció meg tudja mutatni, hol vannak a kézzel való behatolások), és hogy a kézi közös vizualizáció és a kézi háló vizualizáció is ki legyen kapcsolva a lejátszóban (mivel ezek teljesítmény-találatot eredményeznek).

Parancsprogramok használata

A pozíció és a rotáció a bemeneti rendszertől kérhető le minden egyes kézi közös MixedRealityPose kézhez.

Alternatív megoldásként a rendszer hozzáférést biztosít a GameObjectshez, amelyek követik a rendszert. Ez akkor lehet hasznos, ha egy másik GameObjectnek folyamatosan nyomon kell követnie egy közös et.

Az elérhető termékek listája a TrackedHandJoint felsorolásban található.

Megjegyzés

A közös objektumot a rendszer megsemmisíti, ha elvesznek a kézkövetési funkció! A hibák elkerülése érdekében győződjön meg arról, hogy a közös objektumot használó szkriptek elegánsan kezelik null az esetet!

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

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

A vezérlő közös pozíciója lekérdezése

A TryGetJoint függvény értéket false ad vissza, ha a kért közös érték valamilyen okból nem érhető el. Ebben az esetben az eredményül kapott helyzet a következő MixedRealityPose.ZeroIdentity lesz: .

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 a kézi vizualizációból

A vezérlő vizualizációs objektumaiból közös objektumok kérhetőek.

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 adatelérés

Ha nincs megadva konkrét vezérlő, akkor a közös adatok kézhez való kényelmes elérése érdekében segédosztályok biztosítanak. Ezek a függvények közös adatokat kérnek le a jelenleg nyomon követhető első elérhető eszközről.

A HandJointUtils közös pozíciója lekérdezése

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

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

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

IMixedRealityHandJointService a GameObjects állandó készletét tartja meg a ként való nyomon követéshez.

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 nem kívánatos közvetlenül a vezérlőkből adatokat lekérdezni.

Közös események

IMixedRealityHandJointHandler A a közös pozíciók frissítéseit kezeli.

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

Hálóesemények

IMixedRealityHandMeshHandler A kezeli a kézhá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

Jelenleg van egy ismert probléma a .NET-háttérkiszolgálót használó fő buildekkel kapcsolatban. A .NET Native a mutatók nem kezelhetők natívról felügyelt IInspectable kódra a Marshal.GetObjectForIUnknown használatával. Az MRTK ezt használja a beszerzéséhez, hogy kéz- és szemadatokat SpatialCoordinateSystem fogad a platformról.

Áthidaló megoldásként a DLL-forrást a natív eszközkészlet-Mixed Reality biztosítjuk. Kövesse a README fájlban található utasításokat, és másolja az eredményül kapott bináris fájlokat a Unity-eszközök Plugins mappájába. Ezt követően az MRTK-ban megadott WindowsMixedRealityUtilities parancsfájl megoldja az áthidaló megoldást.

Ha saját DLL-t szeretne létrehozni, vagy ezt az áthidaló megoldást egy meglévő dll-fájlba szeretné foglalni, az áthidaló megoldás lényege a következő:

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

És a 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;
    }
}