Menu tangan — MRTK2
Menu tangan memungkinkan pengguna untuk dengan cepat memunculkan UI yang terpasang tangan untuk fungsi yang sering digunakan. Untuk mencegah aktivasi palsu saat berinteraksi dengan objek lain, menu tangan menyediakan opsi seperti 'Memerlukan Tangan Datar' dan 'Gunakan Aktivasi Tatapan'. Disarankan untuk menggunakan opsi ini untuk mencegah aktivasi yang tidak diinginkan.
Contoh menu tangan
Adegan HandMenuExamples.unity berada di bawah MRTK/Examples/Demos/HandTracking/Scenes
folder . Saat berjalan, adegan hanya akan mengaktifkan jenis menu yang saat ini dipilih.
Anda dapat menemukan prefab menu tangan ini di bawah MRTK/Examples/Common/Prefabs
folder .
HandMenu_Small_HideOnHandDrop dan HandMenu_Medium_HideOnHandDrop
Kedua contoh ini hanya mengaktifkan dan menonaktifkan objek MenuContent untuk menampilkan dan menyembunyikan menu pada peristiwa OnFirstHandDetected() dan OnLastHandLost().
HandMenu_Large_WorldLock_On_GrabAndPull
Untuk menu yang lebih kompleks yang membutuhkan waktu interaksi yang lebih lama, disarankan untuk mengunci menu di dunia. Dalam contoh ini, pengguna dapat mengambil dan menarik ke menu kunci dunia, selain mengaktifkan dan menonaktifkan menuContent pada peristiwa OnFirstHandDetected() dan OnLastHandLost().
Backplate ManipulationHandler
membuatnya dapat diambil dan dipungut. Pada peristiwa Manipulation Started , SolverHandler.UpdateSolvers dinonaktifkan untuk mengunci menu di dunia. Selain itu, ini menunjukkan tombol Tutup untuk memungkinkan pengguna menutup menu ketika tugas selesai. Pada peristiwa Manipulation Ended , ini memanggil HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine untuk memungkinkan pengguna membawa menu kembali dengan mengangkat dan melihat telapak tangan.
Tombol Tutup mengaktifkan kembali SolverHandler.UpdateSolvers dan menyembunyikan MenuContent.
HandMenu_Large_AutoWorldLock_On_HandDrop
Contoh ini mirip dengan HandMenu_Large_WorldLock_On_GrabAndPull. Satu-satunya perbedaan adalah bahwa menu akan secara otomatis terkunci di tangan. Perilaku ini ditangani dengan tidak menyembunyikan MenuContent pada peristiwa OnLastHandLost(). Perilaku penarikan Grab & sama dengan contoh HandMenu_Large_WorldLock_On_GrabAndPull.
Skrip
Perilaku ini HandConstraint
menyediakan pemecah yang membatasi objek terlacak ke wilayah yang aman untuk konten yang dibatasi tangan (seperti UI tangan, menu, dll.). Wilayah yang aman dianggap sebagai area yang tidak bersinggungan dengan tangan. Kelas turunan yang HandConstraint
dipanggil HandConstraintPalmUp
juga disertakan untuk menunjukkan perilaku umum mengaktifkan objek terlacak pemecah saat telapak tangan menghadap pengguna.
Lihat tips alat yang tersedia untuk setiap HandConstraint
properti untuk dokumentasi selengkapnya. Beberapa properti didefinisikan secara lebih rinci di bawah ini.
Zona Aman: Zona aman menentukan di mana di tangan membatasi konten. Disarankan agar konten ditempatkan di Sisi Ulnar untuk menghindari tumpang tindih dengan tangan dan peningkatan kualitas interaksi. Zona aman dihitung dengan mengambil orientasi tangan yang diproyeksikan ke dalam bidang ortogonal ke pandangan kamera dan raycasting terhadap kotak pembatas di sekitar tangan. Zona aman didefinisikan untuk bekerja dengan
IMixedRealityHand
tetapi juga berfungsi dengan jenis pengontrol lainnya. Disarankan untuk menjelajahi apa yang diwakili setiap zona aman pada berbagai jenis pengontrol.Ikuti Tangan Hingga Menghadap Kamera Dengan pengaturan ini aktif, pemecah akan mengikuti rotasi tangan sampai menu cukup selaras dengan tatapan, di mana ia menghadap kamera. Perilaku ini bekerja dengan mengubah SolverRotationBehavior di HandConstraintSolver, dari LookAtTrackedObject menjadi LookAtMainCamera karena sudut GazeAlignment dengan pemecah bervariasi.
Peristiwa Aktivasi: Saat ini memicu
HandConstraint
empat peristiwa aktivasi. Peristiwa ini dapat digunakan dalam banyak kombinasi yang berbeda untuk membuat perilaku unikHandConstraint
, lihat adegan HandBasedMenuExample di bawahMRTK/Examples/Demos/HandTracking/Scenes/
untuk contoh perilaku ini.- OnHandActivate: memicu ketika tangan memenuhi metode IsHandActive.
- OnHandDeactivate: memicu ketika metode IsHandActive tidak lagi terpenuhi.
- OnFirstHandDetected: terjadi ketika status pelacakan tangan berubah dari tanpa tangan terlihat, ke tangan pertama dalam tampilan.
- OnLastHandLost: terjadi ketika status pelacakan tangan berubah dari setidaknya satu tangan dalam tampilan, hingga tidak ada tangan yang terlihat.
Logika Aktivasi/Penonaktifan Solver: Saat ini rekomendasi untuk mengaktifkan dan menonaktifkan
HandConstraintPalmUp
logika adalah dengan menggunakan nilai UpdateSolver SolverHandler, bukan dengan menonaktifkan/mengaktifkan objek. Perilaku ini dapat dilihat dalam contoh adegan melalui kait berbasis editor yang dipicu setelah peristiwa ManipulationHandler "OnManipulationStarted/Ended" menu terpasang.- Menghentikan logika batasan tangan: Saat mencoba mengatur objek yang dibatasi tangan untuk menghentikan (atau tidak menjalankan) logika aktivasi/penonaktifan, atur UpdateSolver ke False daripada menonaktifkan HandConstraintPalmUp.
- Jika Anda ingin mengaktifkan logika Reattach berbasis tatapan (atau bahkan berbasis non-tatapan), tindak lanjuti dengan memanggil fungsi HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Panggilan ini akan memicu coroutine yang kemudian terus memeriksa apakah kriteria "IsValidController" terpenuhi dan akan mengatur UpdateSolver ke True setelah itu (atau objek dinonaktifkan).
- Memulai logika batasan tangan: Saat mencoba mengatur objek yang dibatasi tangan untuk mulai mengikuti tangan Anda lagi (berdasarkan apakah memenuhi kriteria aktivasi), atur UpdateSolver SolverHandler ke true.
- Menghentikan logika batasan tangan: Saat mencoba mengatur objek yang dibatasi tangan untuk menghentikan (atau tidak menjalankan) logika aktivasi/penonaktifan, atur UpdateSolver ke False daripada menonaktifkan HandConstraintPalmUp.
Memasang kembali Logika: Saat ini
HandConstraintPalmUp
mampu memasang kembali objek target secara otomatis ke titik yang dilacak, terlepas dari apakah UpdateSolver SolverHandler benar atau tidak. Perilaku ini ditangani melalui panggilan fungsi StartWorldLockReattachCheckCoroutine() HandConstraintPalmUp, setelah dikunci di dunia (yang dalam hal ini, secara efektif mengatur UpdateSolver SolverHandler ke False).