Bagikan melalui


Pemecah — MRTK3

Pemecah Utama

Pemecah adalah komponen yang memfasilitasi penghitungan posisi dan orientasi objek sesuai dengan algoritma yang telah ditentukan sebelumnya. Contoh: menempatkan objek di permukaan tempat raycast tatapan pengguna bersinggungan.

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. 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 ditambah magnet permukaan ditambah momentum.

Cara penggunaan

Sistem Solver terdiri dari tiga kategori skrip:

  • Solver: Kelas dasar abstrak yang berasal dari semua pemecah. Ini menyediakan pelacakan status, menghaluskan parameter dan implementasi, integrasi sistem pemecah otomatis, dan urutan pembaruan.
  • SolverHandler: Mengatur pelacakan objek referensi terhadap (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 tertentu dari objek yang dirujuk.
  • ConstantViewSize: Menskalakan untuk mempertahankan ukuran konstanta 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 terlacak.
  • SurfaceMagnetism: melemparkan 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: Batasan objek untuk mengikuti tangan di wilayah yang tidak berpotongan GameObject dengan tangan. Berguna untuk konten interaktif yang dibatasi tangan seperti menu, dll. Pemecah ini dimaksudkan untuk bekerja dengan XRNode.
  • HandConstraintPalmUp: Berasal dari HandConstraint tetapi menyertakan logika untuk menguji apakah telapak tangan menghadap pengguna sebelum aktivasi. Pemecah ini hanya berfungsi dengan XRNode pengontrol dan akan berulah seperti kelas dasarnya dengan jenis pengontrol lainnya.
  • Overlap: Tumpang tindih dengan objek yang dilacak.

Untuk menggunakan sistem Solver, 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 transmisi sinar dari kepala dan ke arah tatapan pengguna untuk memecahkan permukaan mana yang terpukul. Nilai potensial untuk TrackedTargetType properti adalah:

  • *Head: 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 memberikan transformasi pengontrol/tangan kiri terlebih dahulu dan kemudian kanan jika yang pertama tidak tersedia atau kecuali TrackedHandedness properti menentukan sebaliknya.

Penting

Sebagian besar pemecah menggunakan vektor maju 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 atas menunjuk ke atas melalui telapak tangan (dengan kata lain, vektor hijau sudah siap, vektor biru maju).

Untuk mengatasinya, perbarui properti Rotasi Tambahan pada SolverHandler ke <90, 0, 0>. Ini memastikan bahwa vektor maju yang disediakan kepada 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>() di Mulai, yang akan mengembalikan Pemecah dalam urutan muncul di inspektur.

Selain itu, mengatur properti Transformasi Tertaut yang Diperbarui ke true akan menginstruksikan bahwa Solver untuk menyimpan posisi, orientasi, dan skala yang dihitung 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 lain 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 Pemecah 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 yang diwariskan GoalPosition, GoalRotation, dan GoalScale ke nilai yang diinginkan. Selain itu, sangat berharga untuk memanfaatkan 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 2 m di depan SolverHandler.TransformTarget. Konsumen menetapkan SolverHandler.TrackedTargetType sebagai Head, maka SolverHandler.TransformTarget akan menjadi transformasi kamera, dan dengan demikian Solver ini akan menempatkan GameObject 2 m 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 pemecah

Properti pemecah umum

Setiap komponen Solver memiliki sekumpulan properti identik inti yang mengontrol perilaku Pemecah inti.

Jika Smoothing diaktifkan, Solver akan secara bertahap memperbarui transformasi GameObject dari waktu ke waktu ke nilai yang dihitung. Setiap properti LerpTime komponen transformasi menentukan kecepatan perubahan ini. Misalnya, nilai MoveLerpTime yang lebih tinggi akan menghasilkan kenaikan pergerakan antar bingkai yang lebih lambat.

Jika MaintainScale diaktifkan, Solver akan menggunakan skala lokal default GameObject.

Orbital

Kelas Orbital ini adalah komponen tag-along yang berulah 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 tingkat pinggang, dll., di sekitar pengguna. Ini dilakukan dengan mengubah properti Offset Lokal dan World Offset . Properti Jenis Orientasi menentukan rotasi yang diterapkan pada objek jika harus mempertahankan rotasi aslinya atau selalu menghadap kamera atau menghadapi transformasi apa pun yang mendorong posisinya.

RadialView

adalah RadialView komponen tag-along lain yang menyimpan bagian tertentu dari GameObject dalam frustum tampilan pengguna.

Properti Min & Max View Degrees menentukan berapa banyak bagian dari GameObject harus selalu terlihat.

Properti Jarak Min & Maks menentukan seberapa jauh GameObject harus disimpan dari pengguna. Misalnya, berjalan menuju GameObject dengan Jarak Min 1 m akan mendorong GameObject pergi untuk memastikan tidak pernah lebih dekat dari 1 m kepada pengguna.

Umumnya, RadialView digunakan 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.

Ikuti

Kelas memposisikan Follow elemen di depan target yang dilacak relatif terhadap sumbu penerusan lokalnya. Elemen dapat dibatasi secara longgar (juga dikenal sebagai "tag-along") sehingga tidak mengikuti sampai target yang dilacak bergerak melampaui batas yang ditentukan pengguna.

Ini berfungsi sama dengan pemecah RadialView, dengan kontrol tambahan untuk mengelola Max Horizontal & Vertical View Degrees dan mekanisme untuk mengubah Orientasi objek.

InBetween

Kelas InBetween akan menyimpan GameObject yang terpasang di antara dua transformasi. Jenis Target Terlacak GameObject sendiri SolverHandler dan InBetween properti Jenis Target Terlacak Kedua komponen menentukan kedua titik akhir transformasi ini. Umumnya, kedua jenis akan diatur ke CustomOverride dan hasil SolverHandler.TransformOverride dan InBetween.SecondTransformOverride nilai diatur ke dua titik akhir yang dilacak.

Komponen InBetween akan membuat komponen lain SolverHandler pada runtime berdasarkan jenis Target Terlacak Kedua dan properti Penimpaan Transformasi Kedua.

Sepanjang garis antara dua transformasi, PartwayOffset menentukan di mana objek akan ditempatkan dengan 0,5 sebagai setengah, 1,0 pada transformasi pertama, dan 0,0 pada transformasi kedua.

SurfaceMagnetism

Bekerja 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 di 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 pandangan pengguna, 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 selaras berdasarkan normal pada titik temuan pada permukaan
  • Campuran - 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.

Tumpang tindih

Overlap adalah pemecah sederhana yang akan menjaga transformasi objek pada posisi dan rotasi yang sama dengan SolverHandler's target transformasi.

Menentukan permukaan apa yang dapat dipukul

Saat menambahkan SurfaceMagnetism komponen ke GameObject, penting untuk mempertimbangkan lapisan GameObject dan anak-anaknya, jika ada yang memiliki collider. Komponen bekerja dengan melakukan berbagai raycast untuk menentukan permukaan mana yang akan "magnet" terhadap dirinya sendiri. Misalkan pemecah GameObject memiliki collider pada salah satu lapisan yang tercantum dalam MagneticSurfaces properti .SurfaceMagnetism Dalam hal ini, raycast kemungkinan akan mengenai dirinya sendiri, yang mengakibatkan GameObject melekat pada titik tabrakannya sendiri. Perilaku aneh ini dapat dihindari dengan mengatur GameObject utama dan semua anak ke lapisan cast Ignore Ray atau memodifikasi MagneticSurfaces array LayerMask dengan tepat.

Sebaliknya, SurfaceMagnetism GameObject tidak akan bertabrakan dengan permukaan pada lapisan yang tidak tercantum dalam MagneticSurfaces properti . Kami menyarankan agar Anda menempatkan semua permukaan yang diinginkan pada lapisan khusus (yaitu Permukaan) 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 berorientasi pada arah titik yang diinginkan di ruang. Ini paling umum digunakan ketika Jenis Target Terlacak diatur SolverHandler ke Head. Dengan cara ini, komponen UX dengan pemecah DirectionalIndicator akan mengarahkan pengguna untuk melihat titik ruang yang diinginkan. Titik ini ditentukan oleh properti Target Arah.

Jika target arah dapat dilihat oleh pengguna atau bingkai referensi mana pun yang diatur dalam SolverHandler, maka 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 meningkatkan atau mengurangi FOV yang menentukan apakah titik Target Arah dapat dilihat atau tidak

  • Lihat Offset - Dari sudut pandang bingkai referensi (yaitu, kamera mungkin) dan ke arah indikator, properti ini menentukan seberapa jauh objek berasal dari tengah viewport.

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 disebut HandConstraintPalmUp juga disertakan untuk menunjukkan perilaku umum mengaktifkan objek yang dilacak pemecah ketika telapak tangan menghadap pengguna.

Lihat dokumentasi Menu Tangan untuk contoh penggunaan pemecah Batasan Tangan untuk membuat menu tangan.