Pengontrol, pointer, dan fokus — MRTK2

Pengontrol, pointer, dan fokus adalah konsep tingkat yang lebih tinggi yang dibangun di atas fondasi yang ditetapkan oleh sistem input inti. Bersama-sama, mereka menyediakan sebagian besar mekanisme untuk berinteraksi dengan objek di adegan.

Pengontrol

Pengontrol adalah representasi pengontrol fisik (6 derajat kebebasan, tangan artikulasi, dll). Mereka dibuat oleh manajer perangkat dan bertanggung jawab untuk berkomunikasi dengan sistem yang mendasar yang sesuai dan menerjemahkan data tersebut ke dalam data dan peristiwa berbentuk MRTK.a

Misalnya, pada platform Windows Mixed Reality, WindowsMixedRealityArticulatedHand adalah pengontrol yang bertanggung jawab untuk berinteraksi dengan API pelacakan tangan Windows yang mendasarinya untuk mendapatkan informasi tentang sendi, pose, dan properti tangan lainnya. Ini bertanggung jawab untuk mengubah data ini menjadi peristiwa MRTK yang relevan (misalnya, dengan memanggil RaisePoseInputChanged atau RaiseHandJointsUpdated) dan dengan memperbarui status internalnya sendiri sehingga kueri TryGetJointPose untuk akan mengembalikan data yang benar.

Umumnya, siklus hidup pengontrol akan melibatkan:

  1. Pengontrol dibuat oleh manajer perangkat setelah mendeteksi sumber baru (misalnya, manajer perangkat mendeteksi dan mulai melacak tangan).

  2. Dalam perulangan Update() pengontrol, ia memanggil ke sistem API yang mendasar.

  3. Dalam perulangan pembaruan yang sama, ini meningkatkan perubahan peristiwa input dengan memanggil langsung ke sistem input inti itu sendiri (misalnya, menaikkan HandMeshUpdated, atau HandJointsUpdated).

Penunjuk dan fokus

Pointer digunakan untuk berinteraksi dengan objek game. Bagian ini menjelaskan bagaimana pointer dibuat, bagaimana mereka diperbarui, dan bagaimana mereka menentukan objek yang sedang fokus. Ini juga akan mencakup berbagai jenis pointer yang ada dan skenario di mana mereka aktif.

Kategori penunjuk

Pointer umumnya termasuk dalam salah satu kategori berikut:

  • Penunjuk jauh

    Jenis pointer ini digunakan untuk berinteraksi dengan objek yang jauh dari pengguna (jauh didefinisikan sebagai "tidak dekat"). Jenis pointer ini umumnya melemparkan garis yang dapat jauh ke dunia dan memungkinkan pengguna untuk berinteraksi dengan dan memanipulasi objek yang tidak segera berada di sampingnya.

  • Penunjuk dekat

    Jenis pointer ini digunakan untuk berinteraksi dengan objek yang cukup dekat dengan pengguna untuk mengambil, menyentuh, dan memanipulasi. Umumnya, jenis pointer ini berinteraksi dengan objek dengan mencari objek di sekitarnya (baik dengan melakukan raycasting pada jarak kecil, melakukan casting buncis mencari objek di sekitarnya, atau menghitung daftar objek yang dianggap dapat diambil/disentuh).

  • Penunjuk teleport

    Jenis pointer ini dicolokkan ke sistem teleportasi untuk menangani pemindahan pengguna ke lokasi yang ditargetkan oleh pointer.

Mediasi penunjuk

Karena satu pengontrol dapat memiliki beberapa pointer (misalnya, tangan artikulasi dapat memiliki pointer interaksi dekat dan jauh), ada komponen yang bertanggung jawab untuk memediasi pointer mana yang harus aktif.

Misalnya, saat tangan pengguna mendekati tombol yang dapat ditekan, ShellHandRayPointer harus berhenti ditampilkan, dan PokePointer harus terlibat.

Ini ditangani oleh DefaultPointerMediator, yang bertanggung jawab untuk menentukan pointer mana yang aktif, berdasarkan status semua pointer. Salah satu hal utama yang dilakukan ini adalah menonaktifkan pointer jauh ketika penunjuk dekat dengan objek (silakan lihat DefaultPointerMediator).

Dimungkinkan untuk menyediakan implementasi alternatif mediator pointer dengan mengubah PointerMediator properti pada profil pointer.

Cara menonaktifkan penunjuk

Karena mediator penunjuk menjalankan setiap bingkai, akhirnya mengontrol status aktif/tidak aktif dari semua pointer. Oleh karena itu, jika Anda mengatur properti IsInteractionEnabled pointer dalam kode, properti akan ditimpa oleh mediator penunjuk setiap bingkai. Sebagai gantinya PointerBehavior , Anda dapat menentukan untuk mengontrol apakah pointer harus menyala atau mati sendiri. Perhatikan bahwa ini hanya akan berfungsi jika Anda menggunakan default FocusProvider dan DefaultPointerMediator di MRTK.

Contoh: Menonaktifkan sinar tangan di MRTK

Kode berikut akan mematikan sinar tangan di MRTK:

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Turn off hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

Kode berikut akan mengembalikan sinar tangan ke perilaku defaultnya di MRTK:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

Kode berikut akan memaksa sinar tangan untuk menyala, terlepas dari apakah mendekati grabbable:

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOn);

Lihat PointerUtils dan TurnPointersOnOff untuk contoh selengkapnya.

FocusProvider

FocusProvider adalah workhorse yang bertanggung jawab untuk iterasi atas daftar semua pointer dan mencari tahu apa objek yang berfokus adalah untuk setiap pointer.

Dalam setiap Update() panggilan, ini akan:

  1. Perbarui semua pointer, dengan merancang dan melakukan deteksi hit seperti yang dikonfigurasi oleh penunjuk itu sendiri (misalnya, penunjuk bola dapat menentukan RaycastMode SphereOverlap, sehingga FocusProvider akan melakukan tabrakan berbasis bola)

  2. Perbarui objek yang difokuskan per pointer (yaitu jika objek mendapatkan fokus, objek juga akan memicu peristiwa ke objek tersebut, jika objek kehilangan fokus, itu akan memicu fokus hilang, dll).

Konfigurasi dan siklus hidup pointer

Penunjuk dapat dikonfigurasi di bagian Penunjuk dari profil sistem input.

Masa pakai pointer umumnya adalah sebagai berikut:

  1. Manajer perangkat akan mendeteksi keberadaan pengontrol. Manajer perangkat ini kemudian akan membuat set pointer yang terkait dengan pengontrol melalui panggilan ke RequestPointers.

  2. FocusProvider, dalam perulangan Update(), akan melakukan iterasi di semua pointer yang valid dan melakukan raycast terkait atau mencapai logika deteksi. Ini digunakan untuk menentukan objek yang difokuskan oleh setiap penunjuk tertentu.

    • Karena dimungkinkan untuk memiliki beberapa sumber input aktif pada saat yang sama (misalnya, ada dua tangan aktif), anda juga dapat memiliki beberapa objek yang memiliki fokus pada saat yang sama.
  3. Manajer perangkat, setelah menemukan bahwa sumber pengontrol hilang, akan merobek pointer yang terkait dengan pengontrol yang hilang.