Megosztás a következőn keresztül:


Kézi nyomkövetés – MRTK2

Kézkövetési profil

A Hand Tracking profil az Input System profil alatt található. A kézi ábrázolás testreszabására szolgáló beállításokat tartalmaz.

Kézkövetési profil

Közös előtagok

A közös előfabák egyszerű előtagokkal vannak vizualizálva. A Palm és az Index Finger ízületek 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 ízület előtagjai egyszerű geometriai primitívek. Ezeket szükség esetén lecserélheti. Ha egyáltalán nincs megadva előfab, a rendszer üres GameObjects objektumokat hoz létre.

Figyelmeztetés

Kerülje az összetett szkriptek használatát vagy a 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épviselet Közös címkék
Csuklós kézkötések Bemeneti kéz ízületei

Kézhá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őlapon renderelhető hálót az eszközről származó adatok váltják fel, így elegendő egy kocka alakú háló. Az előfab anyagát a kézi hálóhoz használják.

Bemeneti kézi háló

A kézi háló megjelenítése észrevehető teljesítménybeli hatással lehet, ezért teljes egészében letiltható a Hand Mesh-vizualizáció engedélyezése lehetőség bejelölésével.

Kéz vizualizációs beállításai

A kézháló és a kéz közös vizualizációi a Kézháló vizualizációs módok beállítással, illetve a Kéz közös vizualizációs módok beállításával kapcsolhatók ki vagy be. 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őben történő szimulációk közös használata esetén), 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 (így a szerkesztőben a szimuláció megmutatja, hogy hol vannak a kézkötések), és hogy a kézi közös vizualizáció és a kézi háló vizualizációja is ki legyen kapcsolva a lejátszóban (mivel teljesítménybeli találatot kapnak).

Parancsprogramok használata

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

Alternatív megoldásként a rendszer lehetővé teszi a GameObjects elérését, amelyek az ízületeket követik. Ez akkor lehet hasznos, ha egy másik GameObjectnek folyamatosan nyomon kell követnie egy ízületet.

Az elérhető illesztések a felsorolásban TrackedHandJoint szerepelnek.

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 szabályosan 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 bemeneti események kezelésekor. Ebben az esetben a közös adatok közvetlenül az eszközről kérhetők le a IMixedRealityHand felület használatával.

Közös póz lekérdezése a vezérlőtől

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ény a következő 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ővizualizáció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 a jelenleg nyomon követett első elérhető kézi eszközről kérnek közös adatokat.

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

HandJointUtils 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 kézi közös szolgáltatásból

IMixedRealityHandJointService á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 pozíciók 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 IInspectable a mutatókat nem lehet natív kódból felügyelt kódba illeszteni a használatávalMarshal.GetObjectForIUnknown. Az MRTK ezzel szerzi be a-t SpatialCoordinateSystem , hogy kéz- és szemadatokat kapjon a platformról.

Megkerülő megoldásként biztosítottuk a DLL-forrást a probléma megoldásához a natív Mixed Reality Toolkit-adattárban. Kövesse az ott található README utasítást, é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 ezt a kerülő megoldást egy meglévőbe szeretné belefoglalni, az áthidaló megoldás lényege 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;
    }
}