Menu tangan — MRTK2

Contoh UX Menu Tangan

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.
HandMenu_ExampleScene

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_ExampleScene 1
HandMenu_ExampleScene 2

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().
HandMenu_ExampleScene 3

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.
HandMenu_ExampleScene 4

Tombol Tutup mengaktifkan kembali SolverHandler.UpdateSolvers dan menyembunyikan MenuContent.
HandMenu_ExampleScene 5

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.

HandMenu_ExampleScene Palm ke atas
  • 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.

Zona Aman HandMenu
  • Peristiwa Aktivasi: Saat ini memicu HandConstraint empat peristiwa aktivasi. Peristiwa ini dapat digunakan dalam banyak kombinasi yang berbeda untuk membuat perilaku unik HandConstraint , lihat adegan HandBasedMenuExample di bawah MRTK/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.
  • 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).

Lihat juga