Gambaran umum pemecah — MRTK2
Pemecah adalah komponen yang memfasilitasi sarana penghitungan posisi objek & orientasi sesuai dengan algoritma yang telah ditentukan sebelumnya. Contohnya mungkin menempatkan objek di permukaan yang saat ini dipukul oleh raycast tatap pengguna.
Selain itu, sistem Solver secara deterministik mendefinisikan urutan operasi untuk perhitungan transformasi ini karena tidak ada cara yang dapat diandalkan untuk menentukan ke Unity urutan pembaruan untuk komponen.
Pemecah menawarkan berbagai perilaku untuk melampirkan objek ke objek atau sistem lain. Salah satu contoh lainnya adalah objek tag-along yang mengarah ke depan pengguna (berdasarkan kamera). Pemecah juga dapat dilampirkan ke pengontrol dan objek untuk membuat tag objek di sepanjang pengontrol. Semua pemecah dapat ditumpuk dengan aman, misalnya perilaku tag-along + magnetisme permukaan + momentum.
Cara menggunakan pemecah
Sistem Solver terdiri dari tiga kategori skrip:
Solver
: Kelas abstrak dasar yang berasal dari semua pemecah. Ini menyediakan pelacakan status, parameter dan implementasi smoothing, integrasi sistem pemecah otomatis, dan urutan pembaruan.SolverHandler
: Mengatur objek referensi untuk dilacak (misalnya: transformasi kamera utama, sinar tangan, dll.), menangani pengumpulan komponen pemecah, dan menjalankan pembaruannya dalam urutan yang tepat.
Kategori ketiga adalah pemecah itu sendiri. Pemecah berikut menyediakan blok penyusun untuk perilaku dasar:
Orbital
: Mengunci ke posisi dan offset yang ditentukan dari objek yang dirujuk.ConstantViewSize
: Menskalakan untuk mempertahankan ukuran konstan relatif terhadap tampilan objek yang dirujuk.RadialView
: Menyimpan objek dalam kerucut tampilan yang dilemparkan oleh objek yang dirujuk.Follow
: Menyimpan objek dalam sekumpulan batas yang ditentukan pengguna dari objek yang dirujuk.InBetween
: Menyimpan objek di antara dua objek yang dilacak.SurfaceMagnetism
: mentransmisikan sinar ke permukaan di dunia, dan menyelaraskan objek ke permukaan tersebut.DirectionalIndicator
: Menentukan posisi dan orientasi objek sebagai indikator arah. Dari titik referensi Target Terlacak SolverHandler, indikator ini akan berorientasi pada DirectionalTarget yang disediakan.Momentum
: Menerapkan akselerasi/kecepatan/gesekan untuk mensimulasikan momentum dan springiness untuk objek yang dipindahkan oleh pemecah/komponen lain.HandConstraint
: Membatasi objek untuk mengikuti tangan di wilayah yang tidak bersinggungan dengan GameObject dengan tangan. Berguna untuk konten interaktif yang dibatasi tangan seperti menu, dll. Pemecah ini dimaksudkan untuk bekerja dengan IMixedRealityHand tetapi juga berfungsi dengan IMixedRealityController.HandConstraintPalmUp
: Berasal dari HandConstraint tetapi menyertakan logika untuk menguji apakah telapak tangan menghadap pengguna sebelum aktivasi. Pemecah ini hanya berfungsi dengan pengontrol IMixedRealityHand , dengan jenis pengontrol lain pemecah ini akan berprilaku seperti kelas dasarnya.
Untuk menggunakan sistem Solver, cukup tambahkan salah satu komponen yang tercantum di atas ke GameObject. Karena semua Pemecah memerlukan SolverHandler
, pemecah akan dibuat secara otomatis oleh Unity.
Catatan
Contoh cara menggunakan sistem Solvers dapat ditemukan di file SolverExamples.scene .
Cara mengubah referensi pelacakan
Properti Jenis Target Terlacak dari SolverHandler
komponen menentukan titik referensi yang akan digunakan semua pemecah untuk menghitung algoritmanya. Misalnya, jenis Head
nilai dengan komponen sederhana SurfaceMagnetism
akan menghasilkan raycast dari kepala dan ke arah tatapan pengguna untuk memecahkan permukaan apa yang terpukul. Nilai potensial untuk TrackedTargetType
properti adalah:
- Kepala : Titik referensi adalah transformasi kamera utama
- ControllerRay: Titik referensi adalah
LinePointer
transformasi pada pengontrol (yaitu asal penunjuk pada pengontrol gerakan atau pengontrol tangan) yang menunjuk ke arah sinar garisTrackedHandedness
Gunakan properti untuk memilih preferensi handedness (yaitu Kiri, Kanan, Keduanya)
- HandJoint: Titik referensi adalah transformasi sendi tangan tertentu
TrackedHandedness
Gunakan properti untuk memilih preferensi handedness (yaitu Kiri, Kanan, Keduanya)TrackedHandJoint
Gunakan properti untuk menentukan transformasi bersama yang akan digunakan
- CustomOverride: Titik referensi dari yang ditetapkan
TransformOverride
Catatan
Untuk jenis ControllerRay dan HandJoint , handler pemecah akan mencoba menyediakan pengontrol kiri/transformasi tangan terlebih dahulu dan kemudian kanan jika yang pertama tidak tersedia atau kecuali TrackedHandedness
properti menentukan sebaliknya.
Contoh dari berbagai properti yang terkait dengan setiap TrackedTargetType
Penting
Sebagian besar pemecah menggunakan vektor ke depan dari target transformasi terlacak yang disediakan oleh SolverHandler
. Saat menggunakan jenis target yang dilacak Hand Joint , vektor depan sendi telapak tangan dapat menunjuk melalui jari-jari dan bukan melalui telapak tangan. Ini tergantung pada platform yang menyediakan data sendi tangan. Untuk simulasi input dan Windows Mixed Reality, vektor ataslah yang menunjuk ke telapak tangan (yaitu vektor hijau naik, vektor biru ke depan).
Untuk mengatasinya, perbarui properti Rotasi Tambahan pada ke SolverHandler
<90, 0, 0>. Ini akan memastikan vektor maju yang disediakan untuk pemecah menunjuk melalui telapak tangan dan keluar dari tangan.
Atau, gunakan jenis target terlacak Controller Ray untuk mendapatkan perilaku serupa untuk menunjuk dengan tangan.
Cara menautkan pemecah
Dimungkinkan untuk menambahkan beberapa Solver
komponen ke GameObject yang sama sehingga menautkan algoritma mereka. Komponen SolverHandler
menangani pembaruan semua pemecah pada GameObject yang sama. Secara default SolverHandler
panggilan GetComponents<Solver>()
pada Mulai yang akan mengembalikan Pemecah dalam urutan yang muncul di inspektur.
Selain itu, mengatur properti Transformasi Tertaut yang Diperbarui ke true akan menginstruksikan bahwa Solver
untuk menyimpan posisi terhitung, orientasi, & menskalakan ke variabel perantara yang dapat diakses oleh semua Pemecah (yaitu GoalPosition
). Ketika false, Solver
akan memperbarui transformasi GameObject secara langsung. Dengan menyimpan properti transformasi ke lokasi perantara, Pemecah lainnya dapat melakukan perhitungannya mulai dari variabel perantara. Ini karena Unity tidak mengizinkan pembaruan ke gameObject.transform untuk ditumpuk dalam bingkai yang sama.
Catatan
Pengembang dapat memodifikasi urutan eksekusi Solvers dengan mengatur properti secara SolverHandler.Solvers
langsung.
Cara membuat pemecah baru
Semua pemecah harus mewarisi dari kelas dasar abstrak, Solver
. Persyaratan utama ekstensi Solver melibatkan pengesampingan SolverUpdate
metode . Dalam metode ini, pengembang harus memperbarui properti , dan GoalRotation
GoalScale
yang diwariskan GoalPosition
ke nilai yang diinginkan. Selain itu, umumnya berharga untuk dimanfaatkan SolverHandler.TransformTarget
sebagai bingkai referensi yang diinginkan oleh konsumen.
Kode yang disediakan di bawah ini memberikan contoh komponen Solver baru yang disebut InFront
yang menempatkan objek terpasang 2m di depan SolverHandler.TransformTarget
. SolverHandler.TrackedTargetType
Jika ditetapkan oleh konsumen sebagai Head
, maka SolverHandler.TransformTarget
akan menjadi transformasi kamera dan dengan demikian Solver ini akan menempatkan GameObject 2m yang terpasang di depan tatapan pengguna setiap bingkai.
/// <summary>
/// InFront solver positions an object 2m in front of the tracked transform target
/// </summary>
public class InFront : Solver
{
...
public override void SolverUpdate()
{
if (SolverHandler != null && SolverHandler.TransformTarget != null)
{
var target = SolverHandler.TransformTarget;
GoalPosition = target.position + target.forward * 2.0f;
}
}
}
Panduan implementasi solver
Properti pemecah umum
Setiap komponen Solver memiliki seperangkat properti identik inti yang mengontrol perilaku Solver inti.
Jika Smoothing diaktifkan, maka Solver akan secara bertahap memperbarui transformasi GameObject dari waktu ke waktu ke nilai yang dihitung. Kecepatan perubahan ini ditentukan oleh setiap properti LerpTime komponen transformasi. Misalnya, nilai MoveLerpTime yang lebih tinggi akan menghasilkan kenaikan pergerakan antar bingkai yang lebih lambat.
Jika MaintainScale diaktifkan, maka Solver akan menggunakan skala lokal default GameObject.
Properti umum yang diwarisi oleh semua komponen Solver
Orbital
Kelas Orbital
ini adalah komponen tag-along yang bersifat seperti planet dalam tata surya. Solver ini akan memastikan orbit GameObject yang terpasang di sekitar transformasi yang dilacak. Dengan demikian, jika Jenis SolverHandler
Target Terlacak diatur ke Head
, maka GameObject akan mengorbit di sekitar kepala pengguna dengan offset tetap diterapkan.
Pengembang dapat memodifikasi offset tetap ini untuk menjaga menu atau komponen adegan lainnya pada tingkat mata atau pada tingkat pinggang dll. di sekitar pengguna. Ini dilakukan dengan memodifikasi properti Offset Lokal dan World Offset . Properti Jenis Orientasi menentukan rotasi yang diterapkan ke objek jika harus mempertahankan rotasi aslinya atau selalu menghadap kamera atau menghadapi transformasi apa pun yang mendorong posisinya dll.
Contoh orbital
RadialView
RadialView
adalah komponen tag-along lain yang menyimpan bagian tertentu dari GameObject dalam frustum tampilan pengguna.
Properti Min & Max View Degrees menentukan seberapa besar sebagian dari GameObject harus selalu terlihat.
Properti Min & Max Distance menentukan seberapa jauh GameObject harus disimpan dari pengguna. Misalnya, berjalan menuju GameObject dengan Jarak Min 1m akan mendorong GameObject pergi untuk memastikan tidak pernah lebih dekat dari 1m dengan pengguna.
Umumnya, RadialView
digunakan bersama dengan Jenis Target Terlacak diatur ke Head
sehingga komponen mengikuti tatapan pengguna. Namun, komponen ini dapat berfungsi untuk disimpan dalam "tampilan" dari Jenis Target Terlacak apa pun.
Contoh RadialView
Ikuti
Kelas memposisikan Follow
elemen di depan target yang dilacak relatif terhadap sumbu penerusan lokalnya. Elemen dapat dibatasi secara longgar (alias tag-along) sehingga tidak mengikuti sampai target yang dilacak bergerak melampaui batas yang ditentukan pengguna.
Ini berfungsi mirip dengan pemecah RadialView, dengan kontrol tambahan untuk mengelola Max Horizontal & Vertical View Degrees, dan mekanisme untuk mengubah Orientasi objek.
Ikuti properti
Ikuti Contoh Adegan (Aset/MRTK/Contoh/Demo/Pemecah/Adegan/FollowSolverExample.unity)
InBetween
Kelas InBetween
akan menyimpan GameObject yang terpasang di antara dua transformasi. Kedua titik akhir transformasi ini didefinisikan oleh Jenis Target Terlacak GameObject sendiri SolverHandler
dan InBetween
properti Jenis Target Terlacak Kedua komponen. Umumnya, kedua jenis akan diatur ke CustomOverride
dan hasil SolverHandler.TransformOverride
dan InBetween.SecondTransformOverride
nilai yang diatur ke dua titik akhir yang dilacak.
Saat runtime, InBetween
komponen akan membuat komponen lain SolverHandler
berdasarkan properti Jenis Target Terlacak Kedua dan Penggantian Transformasi Kedua .
Menentukan PartwayOffset
di mana sepanjang garis antara dua transformasi objek harus ditempatkan dengan 0,5 sebagai setengah, 1,0 pada transformasi pertama, dan 0,0 pada transformasi kedua.
Contoh penggunaan pemecah InBetween untuk menyimpan objek di antara dua transformasi
SurfaceMagnetism
Pekerjaan SurfaceMagnetism
dengan melakukan raycast terhadap LayerMask permukaan yang ditetapkan dan menempatkan GameObject pada titik kontak tersebut.
Surface Normal Offset akan menempatkan GameObject jarak yang ditetapkan dalam meter jauhnya dari permukaan ke arah normal pada titik hit pada permukaan.
Sebaliknya, Surface Ray Offset akan menempatkan GameObject jarak yang ditetapkan dalam meter jauhnya dari permukaan tetapi ke arah yang berlawanan dari raycast yang dilakukan. Dengan demikian, jika raycast adalah tatapan pengguna, maka GameObject akan bergerak lebih dekat di sepanjang garis dari titik temuan di permukaan ke kamera.
Mode Orientasi menentukan jenis rotasi yang akan diterapkan sehubungan dengan normal pada permukaan.
- None - Tidak ada rotasi yang diterapkan
- TrackedTarget - Objek akan menghadapi transformasi terlacak yang mendorong raycast
- SurfaceNormal - Objek akan sejajar berdasarkan normal pada titik temuan pada permukaan
- Terpadu - Objek akan selaras berdasarkan normal pada titik temuan pada permukaan DAN berdasarkan menghadapi transformasi yang dilacak.
Untuk memaksa GameObject terkait tetap vertikal dalam mode apa pun selain Tidak Ada, aktifkan Pertahankan Orientasi Vertikal.
Catatan
Gunakan properti Orientation Blend untuk mengontrol keseimbangan antara faktor rotasi saat Mode Orientasi diatur ke Blended. Nilai 0,0 akan memiliki orientasi yang sepenuhnya didorong oleh mode TrackedTarget dan nilai 1,0 akan memiliki orientasi yang sepenuhnya didorong oleh SurfaceNormal.
Menentukan permukaan apa yang dapat dihantam
Saat menambahkan SurfaceMagnetism
komponen ke GameObject, penting untuk mempertimbangkan lapisan GameObject dan turunannya, jika ada collider. Komponen bekerja dengan melakukan berbagai jenis raycast untuk menentukan permukaan apa yang menjadi "magnet" itu sendiri. Jika pemecah GameObject memiliki collider pada salah satu lapisan yang tercantum dalam MagneticSurfaces
properti SurfaceMagnetism
, maka raycast kemungkinan akan mengenai dirinya sendiri yang mengakibatkan GameObject melekat pada titik kolaidernya sendiri. Perilaku aneh ini dapat dihindari dengan mengatur GameObject utama dan semua anak ke lapisan Ignore Raycast atau memodifikasi MagneticSurfaces
array LayerMask dengan tepat.
Sebaliknya, SurfaceMagnetism
GameObject tidak akan bertabrakan dengan permukaan pada lapisan yang tidak tercantum dalam MagneticSurfaces
properti . Umumnya disarankan untuk menempatkan semua permukaan yang diinginkan pada lapisan khusus (yaitu Surfaces) dan mengatur MagneticSurfaces
properti hanya ke lapisan ini. Menggunakan default atau semuanya dapat mengakibatkan komponen UI atau kursor berkontribusi pada pemecah.
Akhirnya, permukaan lebih jauh dari MaxRaycastDistance
pengaturan properti akan diabaikan oleh SurfaceMagnetism
raycast.
DirectionalIndicator
Kelas DirectionalIndicator
adalah komponen tag-along yang mengarahkan dirinya ke arah titik yang diinginkan dalam ruang.
Paling umum digunakan ketika Jenis SolverHandler
Target Terlacak diatur ke Head
. Dengan cara ini, komponen UX dengan pemecah DirectionalIndicator
akan mengarahkan pengguna untuk melihat titik yang diinginkan di ruang.
Titik ruang yang diinginkan ditentukan melalui properti Target Arah .
Jika target arah dapat dilihat oleh pengguna, atau bingkai referensi apa pun yang diatur dalam SolverHandler
, pemecah ini akan menonaktifkan semua Renderer
komponen di bawahnya. Jika tidak dapat dilihat, maka semuanya akan diaktifkan pada indikator.
Ukuran indikator akan menyusutkan semakin dekat pengguna adalah menangkap Target Arah di FOV mereka.
Skala Indikator Min - Skala minimum untuk objek indikator
Skala Indikator Maks - Skala maksimum untuk objek indikator
Faktor Skala Visibilitas - Pengali untuk menambah atau mengurangi FOV yang menentukan apakah titik Target Arah dapat dilihat atau tidak
Lihat Offset - Dari sudut pandang bingkai referensi (yaitu kamera mungkin), properti ini menentukan seberapa jauh arah indikator objek berasal dari tengah viewport.
Properti Indikator Arah
Adegan Contoh Indikator Arah (Aset/MRTK/Contoh/Demo/Pemecah/Adegan/DirectionalIndicatorSolverExample.unity)
Menu tangan dengan HandConstraint dan HandConstraintPalmUp
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 ketika telapak tangan menghadap pengguna.
Silakan lihat halaman Menu Tangan untuk contoh penggunaan pemecah Batasan Tangan untuk membuat menu tangan.