Unity'deki hareketler

Unity'de bakışlarınız üzerinde işlem yapmanın iki önemli yolu vardır: HoloLens ve Immersive HMD'de el hareketleri ve hareket denetleyicileri. Unity'de aynı API'ler aracılığıyla her iki uzamsal giriş kaynağının verilerine erişebilirsiniz.

Unity, Windows Mixed Reality için uzamsal giriş verilerine erişmek için iki birincil yol sağlar. Ortak Input.GetButton/Input.GetAxis API'leri birden çok Unity XR SDK'sı üzerinde çalışırken, Windows Mixed Reality özgü InteractionManager/GestureRecognizer API'si tüm uzamsal giriş verilerini kullanıma sunar.

Üst düzey bileşik hareket API'leri (GestureRecognizer)

Ad Alanı:UnityEngine.XR.WSA.Input
Türler: GestureRecognizer, GestureSettings, InteractionSourceKind

Uygulamanız uzamsal giriş kaynakları, Dokunma, Tutma, Düzenleme ve Gezinti hareketleri için üst düzey bileşik hareketleri de tanıyabilir. GestureRecognizer kullanarak bu bileşik hareketleri hem ellerde hem de hareket denetleyicilerinde tanıyabilirsiniz.

GestureRecognizer üzerindeki her Gesture olayı hem giriş için SourceKind hem de olay sırasında hedeflenen baş ışınını sağlar. Bazı olaylar bağlama özgü ek bilgiler sağlar.

Hareket Tanıma kullanarak hareketleri yakalamak için yalnızca birkaç adım gerekir:

  1. Yeni Hareket Tanıyıcı oluşturma
  2. Hangi hareketlerin watch belirtin
  3. Bu hareketler için olaylara abone olma
  4. Hareketleri yakalamaya başlama

Yeni Hareket Tanıyıcı oluşturma

GestureRecognizer'ı kullanmak için bir GestureRecognizer oluşturmuş olmanız gerekir:

GestureRecognizer recognizer = new GestureRecognizer();

Hangi hareketlerin watch belirtin

SetRecognizableGestures() aracılığıyla hangi hareketlerle ilgilendiğinizi belirtin:

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Bu hareketler için olaylara abone olma

İlgilendiğiniz hareketler için olaylara abone olun.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Not

Gezinti ve Düzenleme hareketleri, GestureRecognizer örneğinde birbirini dışlar.

Hareketleri yakalamaya başlama

Varsayılan olarak, GestureRecognizerStartCapturingGestures() çağrılana kadar girişi izlemez. StopCapturingGestures() işleminin gerçekleştirildiği çerçeveden önce giriş gerçekleştirildiyse StopCapturingGestures() çağrıldıktan sonra bir hareket olayı oluşturulabilir. GestureRecognizer, hareketin gerçekleştiği önceki karede açık mı yoksa kapalı mı olduğunu anımsar ve bu nedenle bu çerçevenin bakış hedeflemesine göre hareket izlemeyi başlatmak ve durdurmak güvenilirdir.

recognizer.StartCapturingGestures();

Hareketleri yakalamayı durdurma

Hareket tanımayı durdurmak için:

recognizer.StopCapturingGestures();

Hareket tanıyıcısını kaldırma

GestureRecognizer nesnesini yok etmeden önce abone olunan olayların aboneliğini kaldırmayı unutmayın.

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Unity'de hareket denetleyicisi modelini işleme

Hareket Denetleyicisi modeli ve ışınlanma
Hareket denetleyicisi modeli ve ışınlanma

Uygulamanızda, kullanıcılarınızın tuttuğu fiziksel denetleyicilerle eşleşen hareket denetleyicilerini işlemek ve çeşitli düğmelere basıldığında ifade etmek için, Karma Gerçeklik Araç Seti'ndekiMotionController prefab'ını kullanabilirsiniz. Bu prefab, sistemin yüklü hareket denetleyicisi sürücüsünden çalışma zamanında doğru glTF modelini dinamik olarak yükler. Uygulamanızın kullanıcılarınızın sahip olabileceği mevcut ve gelecekteki denetleyiciler için fiziksel olarak doğru 3B modelleri göstermesi için bu modelleri düzenleyicide el ile içeri aktarmak yerine dinamik olarak yüklemek önemlidir.

  1. Karma Gerçeklik Araç Seti'ni indirmek ve Unity projenize eklemek için Başlarken yönergelerini izleyin.
  2. Başlarken adımlarının bir parçası olarak kameranızı MixedRealityCameraParent prefab ile değiştirdiyseniz artık hazırsınız! Bu prefab, hareket denetleyicisi işlemeyi içerir. Aksi takdirde, Proje bölmesinden sahnenize Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab ekleyin. Bu prefab'ı, kullanıcı sahnenizin içinde ışınlandığında kamerayı hareket ettirmek için kullandığınız üst nesnenin alt öğesi olarak eklemeniz gerekir; böylece denetleyiciler kullanıcıyla birlikte gelir. Uygulamanız ışınlanma içermiyorsa, sahnenizin köküne prefabrik eklemeniz yeter.

Nesne oluşturma

Nesneleri sanal gerçeklikte atmak ilk bakışta göründüğünden daha zor bir sorundur. Çoğu fiziksel tabanlı etkileşimde olduğu gibi, oyunu atarken beklenmedik bir şekilde hareket eder, hemen açıktır ve daldırılır. Fiziksel olarak doğru bir atma davranışını nasıl temsil edeceğinizi derinden düşündük ve platformumuzdaki güncelleştirmeler aracılığıyla etkinleştirilen ve sizinle paylaşmak istediğimiz birkaç yönerge bulduk.

Oluşturma işleminin nasıl uygulanmasını önerdiğimizi gösteren bir örneği burada bulabilirsiniz. Bu örnek şu dört yönergeyi izler:

  • Konum yerine denetleyicinin hızını kullanın. Windows'un Kasım güncelleştirmesi ile ''Yaklaşık'' konum izleme durumundayken davranışta bir değişiklik yaptık. Bu durumdayken, denetleyici hakkındaki hız bilgileri, yüksek doğruluğuna inandığımız sürece bildirilmeye devam eder ve bu genellikle konumdan daha uzundur ve yüksek doğrulukta kalır.

  • Denetleyicinin açısal hızını dahil edin. Bu mantığın tümü statik yöntemdeki GetThrownObjectVelAngVel dosyasında, yukarıda bağlantılı paket içinde yer throwing.cs alan:

    1. Açısal hız korundukçe, atılan nesnenin, atma anındaki açısal hızın aynısını koruması gerekir: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Atılan nesnenin kütle merkezi büyük olasılıkla kavrama pozunun kökeninde olmadığından, büyük olasılıkla kullanıcının referans çerçevesindeki denetleyiciden farklı bir hıza sahiptir. Nesnenin hızının bu şekilde katkıda bulunduğu kısım, denetleyici kökeni etrafında atılan nesnenin kütle merkezinin anlık tanjantel hızıdır. Bu tanjantel hız, denetleyicinin açısal hızının çapraz çarpımıdır ve vektör, denetleyicinin kökeni ile atılan nesnenin kütle merkezi arasındaki mesafeyi temsil eder.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. Oluşturulan nesnenin toplam hızı, denetleyicinin hızının toplamı ve bu tanjantel hızdır: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Hızı uyguladığımız zamana çok dikkat edin. Bir düğmeye basıldığında, bu olayın Bluetooth üzerinden işletim sistemine kabarcık oluşturması 20 ms'ye kadar sürebilir. Başka bir deyişle, bir denetleyici durum değişikliğini basılmış durumdan basılmayan durumuna veya başka bir yolla yoklarsanız, denetleyiciyle birlikte elde ettiğiniz bilgileri aslında bu durumdaki değişikliğin önünde olur. Ayrıca, yoklama API'miz tarafından sunulan denetleyici pozunun, çerçevenin görüntüleneceği zamandaki olası bir pozu yansıtacağı tahmin edilir ve bu da gelecekte 20 ms'den fazla olabilir. Bu, tutulan nesneleri işlemek için iyidir, ancak kullanıcının atma işlemini serbest bırakması için yörüngeyi hesapladıkça nesneyi hedeflemek için zaman sorunumuzu bir hale dönüştürür. Neyse ki Kasım güncelleştirmesi ile InteractionSourcePressed veya InteractionSourceReleased gibi bir Unity olayı gönderildiğinde durum, düğmeye basıldığında veya yayınlandığında geriye ait geçmiş poz verilerini içerir. Atmalar sırasında en doğru denetleyici işleme ve denetleyici hedeflemesini elde etmek için yoklama ve olay oluşturmayı uygun şekilde kullanmanız gerekir:

    • Her kareyi denetleyici işlemesi için, uygulamanız denetleyicinin GameObject değerini geçerli karenin foton süresi için ileriye dönük tahmin edilen denetleyici pozu konumuna yerleştirmelidir. Bu verileri XR gibi Unity yoklama API'lerinden alırsınız . InputTracking.GetLocalPosition veya XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Bir basın veya yayın üzerine denetleyici hedeflemesi için, uygulamanız bu basın veya yayın olayı için geçmiş denetleyici duruşunu temel alarak yörüngeleri raycast yapmalı ve hesaplamalıdır. Bu verileri InteractionManager.InteractionSourcePressed gibi Unity olay api'lerinden alırsınız.
  • Kavrama pozunu kullanın. Angular hızı ve hızı, işaretçi pozuna göre değil kavrama pozuna göre bildirilir.

Oluşturma, gelecekteki Windows güncelleştirmeleriyle birlikte gelişmeye devam edecektir ve burada bu konuda daha fazla bilgi bulmayı bekleyebilirsiniz.

MRTK'da Hareket ve Hareket Denetleyicileri

Giriş Yöneticisi'nden hareket ve hareket denetleyicisine erişebilirsiniz.

Öğreticilerle birlikte izleyin

Daha ayrıntılı özelleştirme örnekleri içeren adım adım öğreticiler Karma Gerçeklik Academy'de mevcuttur:

MR Giriş 213 - Hareket denetleyicisi
MR Giriş 213 - Hareket denetleyicisi

Sonraki Geliştirme Denetim Noktası

Ortaya koyduğumuz Unity geliştirme yolculuğunu takip ediyorsanız MRTK temel yapı taşları keşfetmenin tam ortasındasınız demektir. Buradan sonraki yapı taşıyla devam edebilirsiniz:

Veya Karma Gerçeklik platform özelliklerine ve API'lerine atlayın:

İstediğiniz zaman Unity geliştirme denetim noktalarına geri dönebilirsiniz.

Ayrıca bkz.