Sistem pelacakan tangan menggunakan telapak tangan dan jari seseorang sebagai input. Data pada posisi dan rotasi setiap jari, seluruh telapak tangan, dan gerakan tangan tersedia. Mulai dari Unreal 4.26, pelacakan tangan didasarkan pada plugin Unreal HeadMountedDisplay dan menggunakan API umum di semua platform dan perangkat XR. Fungsionalitas sama untuk sistem Windows Mixed Reality dan OpenXR.
Pose tangan
Pose tangan memungkinkan Anda melacak dan menggunakan tangan dan jari pengguna Anda sebagai input, yang dapat diakses di Cetak Biru dan C++. API Unreal mengirimkan data sebagai sistem koordinat, dengan kutu disinkronkan dengan Mesin Tidak Nyata.


Hierarki dijelaskan oleh EHandKeypoint
enum:

Anda bisa mendapatkan semua data ini dari tangan pengguna menggunakan fungsi Dapatkan Data Pengontrol Gerakan. Fungsi tersebut mengembalikan struktur XRMotionControllerData . Di bawah ini adalah sampel skrip Cetak Biru yang mengurai struktur XRMotionControllerData untuk mendapatkan lokasi sendi tangan dan menggambar sistem koordinat debug di setiap lokasi bersama.

Penting untuk memeriksa apakah struktur valid dan itu adalah tangan. Jika tidak, Anda mungkin mendapatkan perilaku yang tidak terdefinisi dalam akses ke posisi, rotasi, dan array radii.
EWMRHandKeypoint
Enum menggambarkan hierarki tulang Tangan. Anda dapat menemukan setiap titik kunci tangan yang tercantum dalam Cetak Biru Anda:

Enum C++ lengkap tercantum di bawah ini:
enum class EWMRHandKeypoint : uint8
{
Palm,
Wrist,
ThumbMetacarpal,
ThumbProximal,
ThumbDistal,
ThumbTip,
IndexMetacarpal,
IndexProximal,
IndexIntermediate,
IndexDistal,
IndexTip,
MiddleMetacarpal,
MiddleProximal,
MiddleIntermediate,
MiddleDistal,
MiddleTip,
RingMetacarpal,
RingProximal,
RingIntermediate,
RingDistal,
RingTip,
LittleMetacarpal,
LittleProximal,
LittleIntermediate,
LittleDistal,
LittleTip
};
Anda dapat menemukan nilai numerik untuk setiap kasus enum di Windows.Perception.Orang. Tabel HandJointKind.
Mendukung Pelacakan Tangan
Anda dapat menggunakan pelacakan tangan di Cetak Biru dengan menambahkan Mendukung Pelacakan Tangan dari Pelacakan > Tangan Windows Mixed Reality:

Fungsi ini mengembalikan true
jika pelacakan tangan didukung pada perangkat dan false
jika pelacakan tangan tidak tersedia.

C++:
Sertakan WindowsMixedRealityHandTrackingFunctionLibrary.h
.
static bool UWindowsMixedRealityHandTrackingFunctionLibrary::SupportsHandTracking()
Mendapatkan Pelacakan Tangan
Anda dapat menggunakan GetHandJointTransform untuk mengembalikan data spasial dari tangan. Data memperbarui setiap bingkai, tetapi jika Anda berada di dalam bingkai, nilai yang dikembalikan di-cache. Tidak disarankan untuk memiliki logika yang berat dalam fungsi ini karena alasan performa.

C++:
static bool UWindowsMixedRealityHandTrackingFunctionLibrary::GetHandJointTransform(EControllerHand Hand, EWMRHandKeypoint Keypoint, FTransform& OutTransform, float& OutRadius)
Berikut adalah perincian parameter fungsi GetHandJointTransform:
- Tangan – bisa menjadi pengguna di sebelah kiri atau kanan.
- Keypoint – tulang tangan.
- Transformasi – koordinat dan orientasi dasar tulang. Anda dapat meminta dasar tulang berikutnya untuk mendapatkan data transformasi untuk akhir tulang. Tulang Tip khusus memberikan ujung distal.
- **Radius—radius pangkal tulang.
- **Kembalikan Nilai—benar jika tulang dilacak bingkai ini, salah jika tulang tidak dilacak.
Animasi Tautan Langsung Tangan
Pose tangan diekspos ke Animasi menggunakan plugin Live Link.
Jika plugin Windows Mixed Reality dan Live Link diaktifkan:
- Pilih Tautan Langsung Jendela > untuk membuka jendela editor Tautan Langsung.
- Pilih Sumber dan aktifkan Sumber Pelacakan Tangan Windows Mixed Reality

Setelah Anda mengaktifkan sumber dan membuka aset animasi, perluas bagian Animasi di tab Adegan Pratinjau juga lihat opsi tambahan.

Hierarki animasi tangan sama seperti dalam EWMRHandKeypoint
. Animasi dapat ditargetkan ulang menggunakan WindowsMixedRealityHandTrackingLiveLinkRemapAsset:

Ini juga dapat disubkelas di editor:

Jala Tangan
Penting
Jala tangan membutuhkan OpenXR.
Plugin Microsoft OpenXR harus digunakan, tersedia dari Unreal Marketplace atau GitHub.
Jala Tangan sebagai Geometri Terlacak
Penting
Mendapatkan jala tangan sebagai geometri terlacak di OpenXR mengharuskan Anda memanggil Atur Gunakan Jala Tangan dengan Geometri Pelacakan yang Diaktifkan.
Untuk mengaktifkan mode tersebut, Anda harus memanggil Atur Gunakan Jala Tangan dengan Geometri Pelacakan yang Diaktifkan:

Catatan
Kedua mode tidak dapat diaktifkan secara bersamaan. Jika Anda mengaktifkannya, yang lain secara otomatis dinonaktifkan.
Mengakses Data Jala Tangan

Sebelum dapat mengakses data jala tangan, Anda harus:
- Pilih aset ARSessionConfig Anda, perluas pengaturan AR Pengaturan -> Pemetaan Dunia, dan centang Buat Data Jala dari Geometri Terlacak.
Di bawah ini adalah parameter jala default:
- Gunakan Data Jala untuk Oklusi
- Hasilkan Tabrakan untuk Data Jala
- Hasilkan Nav Mesh untuk Data Jala
- Render Mesh Data in Wireframe – parameter debug yang menunjukkan jala yang dihasilkan
Nilai parameter ini digunakan sebagai default jala pemetaan spasial dan jala tangan. Anda dapat mengubahnya kapan saja di Cetak Biru atau kode untuk jala apa pun.
Referensi API C++
Gunakan EEARObjectClassification
untuk menemukan nilai jala tangan di semua objek yang dapat dilacak.
enum class EARObjectClassification : uint8
{
// Other types
HandMesh,
};
Delegasi berikut dipanggil ketika sistem mendeteksi objek yang dapat dilacak, termasuk jala tangan.
class FARSupportInterface
{
public:
// Other params
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};
Pastikan penangan delegasi Anda mengikuti tanda tangan fungsi di bawah ini:
void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)
Anda dapat mengakses data jala melalui UARTrackedGeometry::GetUnderlyingMesh
:
UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()
Referensi API Cetak Biru
Untuk bekerja dengan Jala Tangan di Cetak Biru:
- Menambahkan Komponen ARTrackableNotify ke aktor Blueprint

- Buka panel Detail dan perluas bagian Peristiwa .

- Timpa Add/Update/Remove Tracked Geometry dengan node berikut di Event Graph Anda:

Visualisasi Jala Tangan di OpenXR
Cara yang disarankan untuk memvisualisasikan jala tangan adalah dengan menggunakan plugin XRVisualization Epic bersama dengan plugin Microsoft OpenXR.
Kemudian di editor cetak biru, Anda harus menggunakan fungsi Atur Gunakan Jala Tangan dari plugin Microsoft OpenXR dengan XRVisualization yang Diaktifkan sebagai parameter:

Untuk mengelola proses penyajian, Anda harus menggunakan Render Motion Controller dari XRVisualization:

Hasilnya:

Jika Anda membutuhkan sesuatu yang lebih rumit, seperti menggambar jala tangan dengan shader kustom, Anda perlu mendapatkan jala sebagai geometri terlacak.
Sinar tangan
Mendapatkan pose tangan berfungsi untuk interaksi dekat seperti mengambil objek atau menekan tombol. Namun, terkadang Anda perlu bekerja dengan hologram yang jauh dari pengguna Anda. Ini dapat dicapai dengan sinar tangan, yang dapat digunakan sebagai perangkat penunjuk di C++ dan Cetak Biru. Anda dapat menarik sinar dari tangan Anda ke titik yang jauh dan, dengan beberapa bantuan dari pelacakan sinar tidak nyata, pilih hologram yang jika tidak akan berada di luar jangkauan.
Penting
Karena semua hasil fungsi mengubah setiap bingkai, semuanya dibuat dapat dipanggil. Untuk informasi selengkapnya tentang fungsi murni dan tidak murni atau dapat dipanggil, lihat panduan pengguna Cetak biru tentang fungsi.
Untuk mendapatkan data untuk sinar tangan, Anda harus menggunakan fungsi Dapatkan Data Pengontrol Gerakan dari bagian sebelumnya. Struktur yang dikembalikan berisi dua parameter yang dapat Anda gunakan untuk membuat sinar tangan – Aim Position dan Aim Rotation. Parameter ini membentuk sinar yang diarahkan oleh siku Anda. Anda harus membawanya dan menemukan hologram yang diarahkan oleh.
Di bawah ini adalah contoh menentukan apakah sinar tangan mengenai Widget dan mengatur hasil hit kustom:

Untuk menggunakan Sinar Tangan di Cetak Biru, cari salah satu tindakan di bawah HMD Windows Mixed Reality:

Untuk mengaksesnya di C++, sertakan WindowsMixedRealityFunctionLibrary.h
ke bagian atas file kode panggilan Anda.
Enum
Anda juga memiliki akses ke kasus input di bawah EHMDInputControllerButtons, yang dapat digunakan dalam Cetak Biru:

Untuk akses di C++, gunakan EHMDInputControllerButtons
kelas enum:
enum class EHMDInputControllerButtons : uint8
{
Select,
Grasp,
//......
};
Di bawah ini adalah perincian dari dua kasus enum yang berlaku:
- Pilih - Pengguna dipicu Pilih peristiwa.
- Dipicu di HoloLens 2 dengan ketukan udara, tatapan, dan penerapan, atau dengan mengatakan "Pilih" dengan input suara diaktifkan.
- Grasp - Peristiwa Grasp yang dipicu pengguna.
- Dipicu di HoloLens 2 dengan menutup jari pengguna pada hologram.
Anda dapat mengakses status pelacakan jala tangan Anda di C++ melalui enum yang EHMDTrackingStatus
ditunjukkan di bawah ini:
enum class EHMDTrackingStatus : uint8
{
NotTracked,
//......
Tracked
};
Di bawah ini adalah perincian dari dua kasus enum yang berlaku:
- NotTracked –- tangan tidak terlihat
- Terlacak –- tangan dilacak sepenuhnya
Struktur
Struktur PointerPoseInfo dapat memberi Anda informasi tentang data tangan berikut:
- Asal – asal tangan
- Arah – arah tangan
- Up – atas vektor tangan
- Orientasi – kuaternion orientasi
- Status Pelacakan – status pelacakan saat ini
Anda dapat mengakses struct PointerPoseInfo melalui Blueprints, seperti yang ditunjukkan di bawah ini:

Atau dengan C++:
struct FPointerPoseInfo
{
FVector Origin;
FVector Direction;
FVector Up;
FQuat Orientation;
EHMDTrackingStatus TrackingStatus;
};
Fungsi
Semua fungsi yang tercantum di bawah ini dapat dipanggil pada setiap bingkai, yang memungkinkan pemantauan berkelanjutan.
- Dapatkan Pointer Pose Info mengembalikan informasi lengkap tentang arah sinar tangan dalam bingkai saat ini.
Cetak biru:

C++:
static FPointerPoseInfo UWindowsMixedRealityFunctionLibrary::GetPointerPoseInfo(EControllerHand hand);
- Apakah Grasped mengembalikan true jika tangan digembalakan dalam bingkai saat ini.
Cetak biru:

C++:
static bool UWindowsMixedRealityFunctionLibrary::IsGrasped(EControllerHand hand);
- Adalah Pilih Ditekan mengembalikan true jika pengguna dipicu Pilih di bingkai saat ini.
Cetak biru:

C++:
static bool UWindowsMixedRealityFunctionLibrary::IsSelectPressed(EControllerHand hand);
- Apakah Tombol Diklik mengembalikan true jika peristiwa atau tombol dipicu dalam bingkai saat ini.
Cetak biru:

C++:
static bool UWindowsMixedRealityFunctionLibrary::IsButtonClicked(EControllerHand hand, EHMDInputControllerButtons button);
- Dapatkan Status Pelacakan Pengontrol mengembalikan status pelacakan dalam bingkai saat ini.
Cetak biru:

C++:
static EHMDTrackingStatus UWindowsMixedRealityFunctionLibrary::GetControllerTrackingStatus(EControllerHand hand);
Gestur
HoloLens 2 melacak gerakan spasial, yang berarti Anda dapat menangkap gerakan tersebut sebagai input. Pelacakan gerakan didasarkan pada model langganan. Anda harus menggunakan fungsi "Konfigurasi Gerakan" untuk memberi tahu perangkat gerakan mana yang ingin Anda lacak. Anda dapat menemukan detail selengkapnya tentang gerakan adalah dokumen Penggunaan Dasar HoloLens 2.
Realitas Campuran Windows

Kemudian Anda harus menambahkan kode untuk berlangganan peristiwa berikut:


OpenXR
Di OpenXR, peristiwa gerakan dilacak melalui alur input. Menggunakan interaksi tangan, perangkat dapat secara otomatis mengenali gerakan Ketuk dan Tahan, tetapi bukan yang lain. Mereka dinamai sebagai Pemetaan OpenXRMsftHandInteraction Select dan Grip. Anda tidak perlu mengaktifkan langganan, Anda harus mendeklarasikan peristiwa di Project Pengaturan/Engine/Input, seperti ini:

Anda dapat menemukan fungsi Cetak Biru di bawah Input Spasial Windows Mixed Reality, dan fungsi C++ dengan menambahkan WindowsMixedRealitySpatialInputFunctionLibrary.h
dalam file kode panggilan Anda.

Enum
Cetak biru:

C++:
enum class ESpatialInputAxisGestureType : uint8
{
None = 0,
Manipulation = 1,
Navigation = 2,
NavigationRails = 3
};
Fungsi
Anda dapat mengaktifkan dan menonaktifkan pengambilan gerakan dengan CaptureGestures
fungsi . Saat gerakan yang diaktifkan mengaktifkan peristiwa input, fungsi mengembalikan true
jika tangkapan gerakan berhasil, dan false
jika ada kesalahan.
Cetak biru:

C++:
static bool UWindowsMixedRealitySpatialInputFunctionLibrary::CaptureGestures(
bool Tap = false,
bool Hold = false,
ESpatialInputAxisGestureType AxisGesture = ESpatialInputAxisGestureType::None,
bool NavigationAxisX = true,
bool NavigationAxisY = true,
bool NavigationAxisZ = true);
Berikut ini adalah peristiwa utama, yang dapat Anda temukan di Blueprints dan C++: 

const FKey FSpatialInputKeys::TapGesture(TapGestureName);
const FKey FSpatialInputKeys::DoubleTapGesture(DoubleTapGestureName);
const FKey FSpatialInputKeys::HoldGesture(HoldGestureName);
const FKey FSpatialInputKeys::LeftTapGesture(LeftTapGestureName);
const FKey FSpatialInputKeys::LeftDoubleTapGesture(LeftDoubleTapGestureName);
const FKey FSpatialInputKeys::LeftHoldGesture(LeftHoldGestureName);
const FKey FSpatialInputKeys::RightTapGesture(RightTapGestureName);
const FKey FSpatialInputKeys::RightDoubleTapGesture(RightDoubleTapGestureName);
const FKey FSpatialInputKeys::RightHoldGesture(RightHoldGestureName);
const FKey FSpatialInputKeys::LeftManipulationGesture(LeftManipulationGestureName);
const FKey FSpatialInputKeys::LeftManipulationXGesture(LeftManipulationXGestureName);
const FKey FSpatialInputKeys::LeftManipulationYGesture(LeftManipulationYGestureName);
const FKey FSpatialInputKeys::LeftManipulationZGesture(LeftManipulationZGestureName);
const FKey FSpatialInputKeys::LeftNavigationGesture(LeftNavigationGestureName);
const FKey FSpatialInputKeys::LeftNavigationXGesture(LeftNavigationXGestureName);
const FKey FSpatialInputKeys::LeftNavigationYGesture(LeftNavigationYGestureName);
const FKey FSpatialInputKeys::LeftNavigationZGesture(LeftNavigationZGestureName);
const FKey FSpatialInputKeys::RightManipulationGesture(RightManipulationGestureName);
const FKey FSpatialInputKeys::RightManipulationXGesture(RightManipulationXGestureName);
const FKey FSpatialInputKeys::RightManipulationYGesture(RightManipulationYGestureName);
const FKey FSpatialInputKeys::RightManipulationZGesture(RightManipulationZGestureName);
const FKey FSpatialInputKeys::RightNavigationGesture(RightNavigationGestureName);
const FKey FSpatialInputKeys::RightNavigationXGesture(RightNavigationXGestureName);
const FKey FSpatialInputKeys::RightNavigationYGesture(RightNavigationYGestureName);
const FKey FSpatialInputKeys::RightNavigationZGesture(RightNavigationZGestureName);
Titik Pemeriksaan Pengembangan Berikutnya
Jika Anda mengikuti perjalanan pengembangan Unreal yang telah kami susun, Anda berada di tengah-tengah menjelajahi blok bangunan inti MRTK. Dari sini, Anda dapat melanjutkan ke blok penyusun berikutnya:
Atau lompat ke kemampuan dan API platform Mixed Reality:
Anda selalu dapat kembali ke titik pemeriksaan Pengembangan tidak nyata kapan saja.