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