Bagikan melalui


Pelatih tangan — MRTK2

Menu Pelatih Tangan

Hand coach adalah tangan bermodel 3D yang dipicu ketika sistem tidak mendeteksi tangan pengguna. Ini diimplementasikan sebagai komponen "mengajar" yang membantu memandu pengguna ketika gerakan belum diajarkan. Jika pengguna belum melakukan gerakan yang ditentukan untuk jangka waktu tertentu, tangan akan mengulang dengan penundaan. Pelatih tangan dapat digunakan untuk mewakili penekanan tombol atau mengambil hologram.

Model interaksi saat ini mewakili berbagai kontrol gerakan seperti menggulir, memilih jauh, dan mengetuk dekat. Di bawah ini adalah daftar lengkap contoh pelatih Tangan yang ada:

  • Ketuk dekat – Digunakan untuk tombol atau menutup objek yang dapat berinteraksi
  • Jauh pilih - Digunakan untuk objek yang jauh
  • Pindahkan – Digunakan untuk memindahkan hologram dalam spasi
  • Putar – Digunakan untuk menunjukkan cara memutar hologram atau objek
  • Skala – Digunakan untuk menunjukkan cara memanipulasi hologram agar lebih besar atau lebih kecil
  • Pembalik tangan - Digunakan untuk memunculkan panel mulai UI atau Menu Tangan
  • Palm up - Digunakan untuk momen hummingbird dalam pengalaman out of the box. Saran lain adalah memunculkan panel mulai UI
  • Gulir – Digunakan untuk menggulir daftar atau dokumen panjang

Contoh adegan

Anda dapat menemukan contoh dalam adegan HandCoachExample di bawah: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes

Aset 3D Tangan

Anda dapat menemukan aset di bawah: MixedRealityToolkit.SDK/Experimental/HandCoach

Kualitas

Jika Anda melihat distorsi pada jala berkulit, Anda perlu memastikan proyek Anda menggunakan jumlah sendi yang tepat. Buka Kualitas > Pengaturan > Proyek Edit > Unity Bobot Campuran Lainnya>. Pastikan "4 tulang" dipilih untuk melihat Smooth Joints. Pengaturan Proyek

Skrip

Petunjuk interaksi

Skrip ini InteractionHint.cs menyediakan fungsionalitas pembungkus untuk memicu animasi dan memudar untuk rig tangan.

Cara menyiapkan petunjuk interaksi

Untuk menyiapkan petunjuk interaksi, disarankan untuk menggunakan prefab yang disediakan "StaticHandCoachRoot_L.prefab" dan "StaticHandCoachRoot_R.prefab". Prefab ini berisi skrip InteractionHint dan rig tangan serta hierarki yang tepat untuk memastikan bahwa animasi petunjuk yang disediakan berfungsi seperti yang diinginkan. Jika tidak, Anda harus menempatkan skrip pada gameObject satu level induk ke atas dari rig tangan Anda dengan animator.

Properti pemeriksa

  • HideIfHandTracked Boolean ini menentukan apakah status pelacakan tangan harus digunakan untuk menyembunyikan visual saat tangan pengguna sedang dilacak. Jika ini diatur ke false, hanya properti pembuatan skrip "customShouldHideVisuals" yang akan digunakan untuk menentukan apakah akan menyembunyikan petunjuk.

  • MinDelay Properti ini menentukan penundaan minimum untuk menampilkan visual. Secara default, visual untuk tangan akan muncul setelah sekian detik ini jika tangan pengguna tidak dilacak.

  • MaxDelay Properti ini menentukan penundaan maksimum untuk menampilkan visual. Secara default, visual untuk tangan akan muncul setelah sekian detik ini bahkan jika tangan pengguna sedang dilacak.

  • UseMaxTimer Jika boolean ini diatur ke false, boolean ini menonaktifkan timer maks dan hanya memungkinkan petunjuk tangan ditampilkan ketika tangan pengguna tidak terlihat, atau kondisi kustom mengembalikan false.

  • Mengulangi Properti ini mengontrol berapa kali animasi petunjuk diputar ketika timer min atau maks telah berlalu. Petunjuk kemudian bersembunyi dan menunggu penundaan lagi.

  • Aktifkan Otomatis Ketika boolean ini diatur ke true, petunjuk akan secara otomatis berjalan melalui logika timer ketika GameObject skrip aktif dalam hierarki dan skrip diaktifkan. Ini hanya boleh diatur ke false jika Anda berniat untuk mengontrol tampilan petunjuk dan menghilang secara manual melalui kode.

  • AnimationState Nama status animasi yang harus diputar saat petunjuk aktif. Ini harus diatur sebelum fungsi StartHintLoop() dipanggil (selama OnEnable jika AutoActivate dicentang).

Mengontrol InteractionHint melalui skrip

  • StartHintLoop Fungsi ini memulai perulangan show/hide yang jika tidak memulai OnEnable jika bendera AutoActivate diatur ke true.
  • StopHintLoop Fungsi ini memanggil status animasi pudar keluar jika saat ini tidak diputar, maka akan menonaktifkan perulangan tampilkan/sembunyikan dan mengatur rig tangan tidak aktif dalam hierarki.
  • AnimationState String ini menentukan status animasi mana yang diputar selama perulangan. Anda dapat mengubah string ini untuk mengubah status mana yang diputar, tetapi Anda harus melakukannya setelah memanggil StopHintLoop, dan Anda harus memanggil StartHintLoop lagi setelah Anda mengubah status.
  • CustomShouldHideVisuals Anda dapat mengatur ini dengan fungsi Anda sendiri, yang harus mengembalikan true ketika Anda ingin menyembunyikan visual tangan (perlu diingat MinMaxTimer, khususnya parameter maks)

Pertimbangan animasi kustom

Pudar default ke 0,5 detik, sehingga animasi kustom apa pun yang dibuat untuk digunakan dengan rig harus minimal 1,5 detik agar informasi yang bermakna disampaikan

Status memudar masuk dan memudar secara default, Fade_In dan Fade_Out dapat disesuaikan dengan mengubah tanda waktu keyframe kedua untuk mengatur panjang pudar.

Animator dan skrip disiapkan dengan cara yang harus membuat penyiapan sesingkat mungkin. Untuk menambahkan status animasi baru, cukup impor fbx Anda, pastikan nama animasi diatur dengan nama yang berbeda, dan seret animasi tersebut ke dalam animator.

MoveToTarget

Skrip MoveToTarget.cs menyediakan fungsionalitas untuk memindahkan petunjuk tangan dari posisi pelacakan ke posisi target dari waktu ke waktu.

Cara menyiapkan MoveToTarget

Prefab yang disediakan "MovingHandCoachRoot_L.prefab" dan "MovingHandCoachRoot_R.prefab" berisi MoveToTarget dalam hierarkinya. Jika Anda ingin menggunakan skrip ini pada pengaturan Anda sendiri, Anda perlu menempatkannya pada root gameobject yang berisi Animator untuk rig Anda.

Properti pemeriksa

  • TrackingObject Atur ini dengan objek yang Anda inginkan untuk diikuti rig sebelum memulai gerakannya. Disarankan untuk membuat GameObject kosong dan memindahkannya ke posisi tertentu untuk membantu Anda menentukan pelacakan.
  • TargetObject Atur ini dengan objek yang Anda inginkan untuk dipindahkan rig selama gerakannya. Disarankan untuk membuat GameObject kosong dan memindahkannya ke posisi tertentu untuk membantu Anda menentukan pelacakan.
  • RootObject Atur ini ke induk bersama antara pelacakan dan objek target sehingga posisi relatif dapat dihitung dengan benar. Prefab yang disertakan memiliki objek pelacakan dan target dalam hierarkinya, tetapi Anda dapat mengatur objek target sebagai gameObject di luar prefab dan mengubah objek akar ke induk bersama.
  • Durasi Jumlah waktu yang diperlukan (dalam detik) untuk berpindah dari TrackingObject ke TargetObject dalam hitungan detik.
  • TargetOffset Offset yang dapat disetel untuk membuat GameObject tiba di posisi target yang tepat. Ini berguna jika animasi Anda menyertakan offset posisi selama animasi.
  • AnimasiBuat Ini default ke kurva linier, tetapi Anda dapat mengubah kurva untuk memberikan pelonggaran masuk/keluar saat memulai dan menghentikan jalur gerakan.

Mengontrol MoveToTarget melalui skrip

Di skrip kustom Anda, lakukan panggilan ke Follow() saat Anda ingin rig tangan mengikuti TrackingObject, lalu lakukan panggilan ke MoveToTargetPosition() saat Anda ingin rig tangan memulai gerakannya ke TargetObject.

Mengontrol MoveToTarget melalui animasi

Dalam animasi yang perlu dipindahkan, atur dua peristiwa: satu dengan panggilan ke Follow() dan satu dengan panggilan ke MoveToTargetPosition(). Ikuti harus diatur pada keyframe pertama, karena menyebabkan rig tangan mengikuti TrackingObject Anda. MoveToTargetPosition harus diatur pada keyframe tempat Anda ingin rig mulai berpindah ke target. Ini adalah bagaimana fungsionalitas skrip digunakan dalam prefab yang disediakan.

RotateAroundPoint

Skrip RotateAroundPoint.cs menyediakan fungsionalitas untuk memutar petunjuk tangan di sekitar titik pivot dari waktu ke waktu.

Cara menyiapkan RotateAroundPoint

Prefab yang disediakan "RotatingHandCoachRoot_L.prefab" dan "RotatingHandCoachRoot_R.prefab" berisi RotateAroundPoint dalam hierarkinya. Jika Anda ingin menggunakan skrip ini pada pengaturan Anda sendiri, Anda perlu menempatkannya pada root gameobject yang berisi Animator untuk rig Anda.

Properti pemeriksa

  • CenteredParent Atur ini dengan objek induk yang Anda inginkan untuk mempivot rig.
  • InverseParent Atur ini dengan induk untuk memutar inversi ke centeredParent untuk menjaga orientasi tangan tetap sama. Secara umum, ini akan menjadi objek induk dengan skrip InteractionHint di atasnya.
  • PivotPosition Atur ini ke titik di mana Anda ingin petunjuk memulai gerakan.
  • Durasi Jumlah waktu yang diperlukan (dalam detik) untuk memutar di sekitar CenteredParent.
  • AnimasiBuat Ini default ke kurva linier, tetapi Anda dapat mengubah kurva untuk memberikan pelonggaran masuk/keluar saat memulai dan menghentikan jalur gerakan.
  • RotationVector Berapa derajat untuk diputar di sepanjang setiap sumbu.

Mengontrol RotateAroundPoint melalui skrip

Di skrip kustom Anda, lakukan panggilan ke RotateToTarget() saat Anda ingin rig tangan memulai rotasinya di sekitar CenteredParent. Saat Anda ingin posisi direset ke PivotPosition asli, lakukan panggilan ke ResetAndDeterminePivot().

Mengontrol RotateAroundPoint melalui animasi

Dalam animasi yang perlu dipindahkan, atur dua peristiwa: satu dengan panggilan ke ResetAndDeterminePivot() dan satu dengan panggilan ke RotateToTarget(). ResetAndDeterminePivot harus diatur pada keyframe pertama, karena menyebabkan rig tangan diatur ulang ke PivotPosition. RotateToTarget harus diatur pada keyframe tempat Anda ingin rig mulai berputar di sekitar CenteredParent. Ini adalah bagaimana fungsionalitas skrip digunakan dalam prefab yang disediakan.