Bagikan melalui


Gambaran umum pemecah — MRTK2

Pemecah Utama

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 garis
    • TrackedHandedness 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 Objek Terlacak Solverdari 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).

Teruskan Ke Vektor

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.

Rotasi Tambahan

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 GoalRotationGoalScale yang diwariskan GoalPositionke 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 Pemecah Inti
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 SolverHandlerTarget 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
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
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 properti

Ikuti contoh adegan
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 InBetween
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.

Contoh SurfaceMagnetism

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 SolverHandlerTarget 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
Properti Indikator Arah

Adegan contoh Indikator Arah
Adegan Contoh Indikator Arah (Aset/MRTK/Contoh/Demo/Pemecah/Adegan/DirectionalIndicatorSolverExample.unity)

Menu tangan dengan HandConstraint dan HandConstraintPalmUp

Contoh UX Menu Tangan

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.

Lihat juga