El izleme — MRTK2

El izleme profili

El İzleme profiliGiriş Sistemi profili altında bulunur. El gösterimini özelleştirmeye yönelik ayarlar içerir.

El İzleme Profili

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
Eklemli el eklemleri Giriş El eklemleri

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.

Giriş El Örgü

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 MixedRealityPoseolarak 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.GetObjectForIUnknownyerel 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;
    }
}