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ö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 |
---|---|
![]() |
![]() |
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.

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