El izleme

El izleme profili

El İzleme profili, Giriş Sistemi profili altında bulunur. El gösterimini özelleştirme ayarlarını içerir.

El İzleme Profili

Ortak ön fiiller

Ortak önfazlar basit önfazlar kullanılarak görselleştirilmiştir. Tüm diğer ortaklar aynı prefab'i paylaşırken, The Tweet ve Index Parmak ortaklarının özel öneme sahip olması ve kendi prefab'ları vardır.

Varsayılan olarak el ortak prefabları basit geometrik temel öğelerdir. bunlar, istenirse değiştirilebilir. Herhangi bir önfaz belirtilmezse, bunun yerine boş GameObjects oluşturulur.

Uyarı

Ortak nesneler her karede dönüştürülmesi ve önemli performans maliyetlerine neden olması nedeniyle karmaşık betikleri veya pahalı işlemeyi ortak önfazla kullanmaktan kaçının!

Varsayılan El Birli Temsili Ortak Etiketler
El ortakları ifade edildi Giriş El ortakları

El mesh prefab

El ağı, tam tanımlı mesh verileri el izleme cihazı tarafından sağlanıyorsa kullanılır. Önfazla işlenebilir örgü, cihazdan gelen verilerle değiştirilir, bu nedenle küp gibi sahte bir örgü yeterlidir. Prefab'ın malzemeleri el ağı için kullanılır.

Input Hand Mesh

El ağı ekranı önemli bir performans etkisine sahip olabilir, bu nedenle El Örgü Görselleştirmesini Etkinleştir seçeneğinin işaretini kaldırarak tamamen devre dışı bırakılabilir.

El görselleştirme ayarları

El örgüleri ve el birli görselleştirmeleri sırasıyla Hand Mesh Görselleştirme Modları ayarı ve El Birli Görselleştirme Modları aracılığıyla kapatabilir veya açık hale gelir. Bu ayarlar uygulama moduna özgüdür, yani bazı özellikleri düzenleyicide (örneğin düzenleyici içinde benzetimli ortaklar görmek için) ve cihaza dağıtıldığında (oynatıcı derlemeleri) aynı özellikler kapalıyken açılabilir.

Genel olarak el ile birlikte görselleştirmenin düzenleyicide açık (düzenleyici içinde benzetim el ortaklarını nerede olduğunu göstersin) ve hem el ile birlikte görselleştirmenin hem de el ağı görselleştirmenin oynatıcıda kapalı (performans isabeti olduğu için) kullanılması önerilir.

Betik Oluşturma

Konum ve döndürme, giriş sisteminden her bir el birli için bir olarak talep MixedRealityPose edilebilir.

Alternatif olarak sistem, derleleri takip edecek GameObjects'e de erişim sağlar. Başka bir GameObject'in bir ortak çalışmayı sürekli izlemesi gerekirse bu yararlı olabilir.

Kullanılabilir ortaklar TrackedHandJoint enumda listelenir.

Not

El izleme kaybedilirken ortak nesne yok edilir! Ortak nesneyi kullanan tüm betiklerin hatalardan kaçınmak için null büyük/kötü durumu işlemeye dikkat edin!

Belirli bir el denetleyicisine erişme

Giriş olaylarını işleme gibi belirli bir el denetleyicisi genellikle kullanılabilir. Bu durumda, arabirim kullanılarak ortak veriler doğrudan cihazdan talep IMixedRealityHand edilebilir.

Denetleyiciden ortak poz yoklama

İstenen TryGetJoint ortak herhangi bir nedenle false kullanılamıyorsa işlevi döndürür. Bu durumda sonuçta elde edilen poz MixedRealityPose.ZeroIdentity olur.

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 birlikte dönüştürme

Denetleyici görselleştiriciden birleştirilmiş nesneler talep edilebilir.

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ş ortak veri erişimi

Belirli bir denetleyici verilmezse, ortak verileri el ile kolayca erişim için yardımcı program sınıfları sağlanır. Bu işlevler, şu anda takipte olan ilk kullanılabilir el cihazından ortak veriler talep eder.

HandJointUtils'den ortak poz yoklama

HandJointUtils , ilk etkin el cihazı sorgular statik bir sınıftır.

if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
    // ...
}

El ile ortak hizmetten ortak dönüşüm

IMixedRealityHandJointService , bağlantıları izlemek için IMixedRealityHandJointService 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 veri yoklama tercih edilmezse, giriş sistemi de olayları sağlar.

Ortak olaylar

IMixedRealityHandJointHandler ortak konum 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 ifade el ağının değişikliklerini işleme.

El tireleri varsayılan olarak etkin değildir.

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 kullanılarak yapılan Ana derlemelerde bilinen bir sorun vardır. Bu .NET Native, IInspectable işaretçiler kullanılarak yerel koddan yönetilen koda sıra Marshal.GetObjectForIUnknown olamaz. MRTK, platformdan el SpatialCoordinateSystem ve göz verilerini almak için bunu kullanır.

Bu soruna geçici bir çözüm olarak yerel Karma Gerçeklik Araç Seti'ne DLL kaynağı sağladık. Lütfen orada BENİ OKUYUN yönergelerini izleyin ve elde edilen ikili dosyaları Unity varlıklarınıza bir Plugins klasörüne kopyalayın. Bundan sonra MRTK'de sağlanan WindowsMixedRealityUtilities betiği geçici çözümü sizin için çözümler.

Kendi DLL'nizi oluşturmak veya bu geçici çözümü mevcut bir DLL'ye eklemek için geçici çözümün temelleri şunlardır:

extern "C" __declspec(dllexport) void __stdcall MarshalIInspectable(IUnknown* nativePtr, IUnknown** inspectable)
{
    *inspectable = nativePtr;
}

Ve C# Unity kodunda 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;
    }
}