El izleme — MRTK2
El izleme profili
El İzleme profiliGiriş Sistemi profili altında bulunur. El gösterimini özelleştirmeye yönelik ayarlar içerir.
Eklem ön ekleri
Eklem prefableri basit prefabler kullanılarak görselleştirilir. Palmiye ve İşaret Parmağı eklemleri özel öneme sahiptir ve kendi prefabriklerine sahiptir, diğer tüm eklemler aynı prefabrikleri paylaşır.
Varsayılan olarak el eklem prefableri basit geometrik ilkellerdir. İstenirse bunlar değiştirilebilir. Hiçbir prefab belirtilmezse, bunun yerine boş GameObjects oluşturulur.
Uyarı
Ortak nesneler her karede dönüştürüldüğünden ve önemli performans maliyetlerine sahip olabileceğinden, karmaşık betikleri veya pahalı işlemeyi ortak prefablerde kullanmaktan kaçının!
Varsayılan El Birleştirme Gösterimi | Birleşik Etiketler |
---|---|
El örgü prefabrik
El örgü, el izleme cihazı tarafından tam tanımlı mesh verileri sağlanıyorsa kullanılır. Prefabrikteki işlenebilir örgü, cihazdan alınan veriyle değiştirilir, bu nedenle küp gibi kukla bir ağ yeterlidir. Prefabrik malzeme el örgü için kullanılır.
El örgü ekranı gözle görülür bir performans etkisine sahip olabilir, bu nedenle El Örgü görselleştirmesini etkinleştir seçeneğinin işareti kaldırılarak tamamen devre dışı bırakılabilir.
El görselleştirme ayarları
El örgü ve el eklem görselleştirmeleri, sırasıyla El Örgü Görselleştirme Modları ayarı ve El Eklem Görselleştirme Modları aracılığıyla kapatılabilir veya açılabilir. Bu ayarlar uygulama moduna özgüdür; başka bir deyişle, cihaza dağıtıldığında aynı özellikler kapatılırken (örneğin, düzenleyici içi benzetimi olan bağlantıları görmek için) düzenleyicideyken bazı özellikleri açmak mümkündür (oynatıcı derlemelerinde).
Düzenleyicide el eklemi görselleştirmesinin açık olması (düzenleyici içi simülasyonda el eklemlerinin yerini göstermesi için) ve oyuncuda hem el eklemi görselleştirmesinin hem de el örgü görselleştirmesinin kapatılmasının (performans isabeti doğurduğu için) önerildiğini unutmayın.
Betik Oluşturma
Konum ve döndürme, her bir el ekleminin giriş sisteminden bir MixedRealityPose
olarak istenebilir.
Alternatif olarak sistem, bağlantıları izleyen GameObjects'e erişime izin verir. Bu, başka bir GameObject'in bir eklemi sürekli izlemesi gerekiyorsa yararlı olabilir.
Kullanılabilir birleşimler numaralandırmada TrackedHandJoint
listelenir.
Not
El izleme kaybolduğunda eklem nesnesi yok edilir! Ortak nesneyi kullanan tüm betiklerin hatalardan kaçınmak için olayı düzgün bir şekilde işlediğinden null
emin olun!
Belirli bir el denetleyicisine erişme
Giriş olaylarını işlerken belirli bir el denetleyicisi genellikle kullanılabilir. Bu durumda birleşik veriler doğrudan cihazdan, arabirimi kullanılarak IMixedRealityHand
istenebilir.
Kontrolörden yoklama eklem pozu
TryGetJoint
İstenen birleşim herhangi bir nedenle kullanılamıyorsa işlevi döndürürfalse
. Bu durumda, sonuçta elde edilen poz olacaktır MixedRealityPose.ZeroIdentity
.
public void OnSourceDetected(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
if (hand != null)
{
if (hand.TryGetJoint(TrackedHandJoint.IndexTip, out MixedRealityPose jointPose)
{
// ...
}
}
}
El görselleştiriciden eklem dönüşümü
Ortak nesneler denetleyici görselleştiricisinden istenebilir.
public void OnSourceDetected(SourceStateEventData eventData)
{
var handVisualizer = eventData.Controller.Visualizer as IMixedRealityHandVisualizer;
if (handVisualizer != null)
{
if (handVisualizer.TryGetJointTransform(TrackedHandJoint.IndexTip, out Transform jointTransform)
{
// ...
}
}
}
Basitleştirilmiş birleşik veri erişimi
Belirli bir denetleyici sağlanmazsa el birleştirme verilerine kolay erişim için yardımcı sınıflar sağlanır. Bu işlevler, şu anda izlenen ilk kullanılabilir el cihazından birleşik veri iste.
HandJointUtils'ten yoklama eklem pozu
HandJointUtils
, ilk etkin el cihazını sorgulayan statik bir sınıftır.
if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
// ...
}
El eklem servisinden eklem dönüşümü
IMixedRealityHandJointService
, bağlantıları izlemek için kalıcı bir GameObjects kümesi tutar.
var handJointService = CoreServices.GetInputSystemDataProvider<IMixedRealityHandJointService>();
if (handJointService != null)
{
Transform jointTransform = handJointService.RequestJointTransform(TrackedHandJoint.IndexTip, Handedness.Right);
// ...
}
El izleme olayları
Doğrudan denetleyicilerden gelen verileri yoklamak istenmiyorsa giriş sistemi olayları da sağlar.
Ortak etkinlikler
IMixedRealityHandJointHandler
ortak konumların güncelleştirmelerini işler.
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 olayları
IMixedRealityHandMeshHandler
eklemli el örgüsünün değişikliklerini işler.
El tirelerinin varsayılan olarak etkinleştirilmediğini unutmayın.
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;
}
// ...
}
}
}
Bilinen sorunlar
.NET Yerel
Şu anda .NET arka ucu kullanan Ana derlemelerle ilgili bilinen bir sorun vardır. .NET Native'da işaretçiler IInspectable
kullanılarak Marshal.GetObjectForIUnknown
yerel koddan yönetilen koda sıralanamaz. MRTK, platformdan el ve göz verilerini almak için bunu SpatialCoordinateSystem
kullanır.
Yerel Karma Gerçeklik Toolkit deposunda bu soruna geçici bir çözüm olarak DLL kaynağı sağladık. Lütfen buradaki BENİOKU bölümündeki yönergeleri izleyin ve sonuçta elde edilen ikili dosyaları Unity varlıklarınızdaki bir Eklentiler klasörüne kopyalayın. Bundan sonra MRTK'de sağlanan WindowsMixedRealityUtilities betiği sizin için geçici çözümü çözecektir.
Kendi DLL'nizi oluşturmak veya bu geçici çözümü mevcut bir DLL'ye eklemek istiyorsanız, geçici çözümün temeli şunlardır:
extern "C" __declspec(dllexport) void __stdcall MarshalIInspectable(IUnknown* nativePtr, IUnknown** inspectable)
{
*inspectable = nativePtr;
}
C# Unity kodunuzda kullanımı:
[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;
}
}