String Nama
XR_ANDROID_hand_mesh
Jenis Ekstensi
Perpanjangan instance
Registered Extension Number
704
Revisi
1
Dependensi Ekstensi dan Versi
Tanggal Terakhir Diubah
2024-09-10
Status IP
Tidak ada klaim IP yang diketahui.
Kontributor
Nihav Jain, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Ringkasan
Ekstensi ini memungkinkan pelacakan tangan yang direpresentasikan sebagai mesh tangan dinamis.
Ekstensi ini dimaksudkan untuk menyediakan buffering vertex dan indeks untuk mesh representasi tangan pengguna yang dipersonalisasi. Fitur ini dapat digunakan untuk oklusi dan visualisasi.
Ekstensi ini tidak boleh digunakan untuk tujuan pelacakan tangan lainnya.
- Untuk interaksi,
XR_EXT_hand_interactiondapat digunakan. - Untuk sendi kerangka,
XR_EXT_hand_trackingdapat digunakan.
Data pelacakan tangan dapat berupa informasi pribadi yang sensitif dan terkait erat dengan privasi dan integritas pribadi. Sebaiknya aplikasi yang menyimpan atau mentransfer data pelacakan tangan selalu meminta persetujuan aktif dan tertentu dari pengguna untuk melakukannya.
Memeriksa kemampuan sistem
Aplikasi dapat memeriksa apakah sistem mampu melacak mesh tangan dengan mengaitkan struktur XrSystemHandMeshTrackingPropertiesANDROID ke XrSystemProperties saat memanggil xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.supportsHandMeshTrackingadalahXrBool32, yang menunjukkan apakahXrSystemIdyang dipilih mendukung pelacakan mesh tangan.supportsTextureUVadalahXrBool32, yang menunjukkan apakahXrSystemIdyang dipilih mendukung UV tekstur untuk vertex mesh.supportsVertexNormaladalahXrBool32, yang menunjukkan apakahXrSystemIdyang dipilih mendukung normal vertex untuk vertex mesh.
Aplikasi harus menghindari penggunaan kemampuan mesh tangan saat
supportsHandMeshTracking adalah XR_FALSE, karena ini berarti sistem tidak
mendukung pelacakan mesh tangan. Dalam hal ini, xrCreateHandMeshTrackerANDROID
akan menampilkan XR_ERROR_FEATURE_UNSUPPORTED.
Jika supportsHandMeshTracking menampilkan XR_TRUE, sistem
akan mendukung pelacakan mesh tangan. Aplikasi harus menggunakan
XrHandMeshANDROID::indexCount dan XrHandMeshANDROID::vertexCount untuk
mengakses buffering mesh tangan dan menggunakannya kembali dalam loop render saat memanggil
xrGetHandMeshANDROID setiap frame.
Jika supportsTextureUV menampilkan XR_FALSE, sistem tidak
mendukung UV tekstur untuk vertex mesh, sehingga aplikasi akan
menerima XrHandMeshANDROID::textureUVs NULL saat memanggil
xrGetHandMeshANDROID.
Jika supportsVertexNormal menampilkan XR_FALSE, sistem tidak
mendukung normal vertex untuk vertex mesh, sehingga aplikasi akan
menerima XrHandMeshANDROID::normals NULL saat memanggil
xrGetHandMeshANDROID.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum menggunakan XrSystemHandMeshTrackingPropertiesANDROID typeharus berupaXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDnextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur
Membuat nama sebutan channel pelacak mesh tangan
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
Handle XrHandMeshTrackerANDROID mewakili pelacak mesh tangan untuk pelacakan mesh tangan dan mengelola resource terkait.
ID ini dapat digunakan untuk mengakses buffering mesh tangan menggunakan fungsi lain dalam ekstensi ini.
Aplikasi dapat membuat handle XrHandMeshTrackerANDROID menggunakan fungsi xrCreateHandMeshTrackerANDROID.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
Deskripsi Parameter
sessionadalah XrSession tempat pelacak mesh tangan akan aktif.createInfoadalah XrHandMeshTrackerCreateInfoANDROID yang digunakan untuk menentukan pelacak mesh tangan.handMeshTrackeradalah handle XrHandMeshTrackerANDROID yang ditampilkan.
Jika sistem tidak mendukung pelacakan mesh tangan,
xrCreateHandMeshTrackerANDROID akan menampilkan XR_ERROR_FEATURE_UNSUPPORTED.
Nama sebutan channel XrHandMeshTrackerANDROID memiliki semua resource untuk pelacakan mesh tangan. Setelah menyelesaikan pengalaman pelacakan mesh tangan, aplikasi harus menghancurkan handle menggunakan fungsi xrDestroyHandMeshTrackerANDROID.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum memanggil xrCreateHandMeshTrackerANDROID sessionharus berupa nama sebutan channel XrSession yang validcreateInfoharus berupa pointer ke struktur XrHandMeshTrackerCreateInfoANDROID yang validhandMeshTrackerharus berupa pointer ke handle XrHandMeshTrackerANDROID
Kode Status
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_HANDLE_INVALIDXR_ERROR_LIMIT_REACHED
Struktur XrHandMeshTrackerCreateInfoANDROID menjelaskan informasi untuk membuat handle XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum menggunakan XrHandMeshTrackerCreateInfoANDROID typeharus berupaXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDnextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur
Fungsi xrDestroyHandMeshTrackerANDROID merilis handMeshTracker
dan resource yang mendasarinya setelah selesai dengan pengalaman pelacakan mesh tangan.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
Deskripsi Parameter
handMeshTrackeradalah XrHandMeshTrackerANDROID yang sebelumnya dibuat oleh xrCreateHandMeshTrackerANDROID.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum memanggil xrDestroyHandMeshTrackerANDROID handMeshTrackerharus berupa handle XrHandMeshTrackerANDROID yang valid
Keamanan Thread
- Akses ke
handMeshTracker, dan setiap nama sebutan turunan, harus disinkronkan secara eksternal
Kode Status
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Menemukan mesh tangan
Aplikasi dapat menggunakan fungsi xrGetHandMeshANDROID untuk mengambil mesh tangan pada stempel waktu tertentu. Posisi dan normal vertex mesh tangan direpresentasikan dalam ruang yang ditentukan oleh XrHandMeshGetInfoANDROID::baseSpace saat memanggil xrGetHandMeshANDROID.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
Deskripsi Parameter
handMeshTrackeradalah handle XrHandMeshTrackerANDROID yang sebelumnya dibuat dengan xrCreateHandMeshTrackerANDROID.getInfoadalah struktur XrHandMeshGetInfoANDROID yang berisi informasi untuk membuat kueri data mesh tangan.handMeshesadalah pointer ke struktur XrHandTrackingMeshesANDROID yang akan diisi dengan data mesh tangan.
Aplikasi dapat menggunakan fungsi xrGetHandMeshANDROID untuk mengakses buffer mesh tangan yang dihasilkan oleh runtime.
Aplikasi harus memanggil xrBeginFrame setidaknya satu kali selama sesi sebelum panggilan pertama ke xrGetHandMeshANDROID.
Aplikasi harus menggunakan XrHandMeshANDROID::indexCount dan XrHandMeshANDROID::vertexCount untuk mengakses buffering mesh tangan dan menggunakannya kembali dalam loop render saat memanggil xrGetHandMeshANDROID setiap frame.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum memanggil xrGetHandMeshANDROID handMeshTrackerharus berupa handle XrHandMeshTrackerANDROID yang validgetInfoharus berupa pointer ke struktur XrHandMeshGetInfoANDROID yang validhandMeshesharus berupa pointer ke struktur XrHandTrackingMeshesANDROID
Kode Status
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_HANDLE_INVALIDXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_TIME_INVALID
XrHandMeshGetInfoANDROID menjelaskan informasi yang diperlukan untuk mendapatkan data mesh tangan.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.baseSpaceadalah XrSpace yang menentukan ruang referensi tempat menemukan transformasi untuk vertex ditime.timeadalahXrTimeyang menjelaskan waktu saat aplikasi ingin membuat kueri mesh tangan.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum menggunakan XrHandMeshGetInfoANDROID typeharus berupaXR_TYPE_HAND_MESH_GET_INFO_ANDROIDnextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai strukturbaseSpaceharus berupa nama sebutan XrSpace yang valid
Struktur XrHandTrackingMeshesANDROID berisi data mesh untuk kedua tangan.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.leftHandMeshadalah XrHandMeshANDROID untuk tangan kiri.rightHandMeshadalah XrHandMeshANDROID untuk tangan kanan.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum menggunakan XrHandTrackingMeshesANDROID typeharus berupaXR_TYPE_HAND_TRACKING_MESHES_ANDROIDnextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai strukturleftHandMeshharus berupa struktur XrHandMeshANDROID yang validrightHandMeshharus berupa struktur XrHandMeshANDROID yang valid
Struktur XrHandMeshANDROID berisi data dan buffering untuk menerima data pelacakan mesh tangan dari fungsi xrGetHandMeshANDROID untuk satu tangan.
typedef struct XrHandMeshANDROID {
XrBool32 isActive;
XrTime dynamicLastUpdateTime;
uint32_t indexCount;
uint32_t vertexCount;
const uint32_t* indices;
const XrVector2f* textureUVs;
const XrVector3f* positions;
const XrVector3f* normals;
XrPosef baseSpaceFromVertexSpace;
} XrHandMeshANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur semacam itu yang ditentukan di OpenXR inti atau ekstensi ini.isActiveadalahXrBool32yang menunjukkan apakah pelacak mesh tangan saat ini aktif dan data mesh valid.dynamicLastUpdateTimeadalahXrTimeyang menentukan waktu saat buffer dinamis terakhir diperbarui.indexCountadalahuint32_tyang berfungsi sebagai jumlahindicesmesh tangan.vertexCountadalahuint32_tyang berfungsi sebagai jumlahpositionsjaringan tangan. Ini dapat juga digunakan untuktextureUVsataunormalsjika didukung oleh sistem.indicesadalah arrayuint32_tyang mewakili indeks mesh untuk segitiga dalam urutan penggulung berlawanan arah jarum jam. Jumlah nilai yang ditunjuk adalahindexCount.textureUVsadalahNULLatau arrayXrVector2fyang mewakili koordinat tekstur vertex. Jumlah nilai yang ditunjuk adalahvertexCount.positionsadalah arrayXrVector3fyang mewakili posisi vertex dibaseSpaceFromVertexSpace. Jumlah nilai yang ditunjuk adalahvertexCount.normalsadalahNULLatau arrayXrVector3fyang mewakili normal vertex dibaseSpaceFromVertexSpace. Jumlah nilai yang ditunjuk adalahvertexCount.baseSpaceFromVertexSpaceadalah XrSpace vertex yang terletak di XrHandMeshGetInfoANDROID::baseSpace saat memanggil xrGetHandMeshANDROID. Aplikasi dapat menggunakannya untuk mengubah ruang koordinat vertex dan normal mesh selama rendering.
Mesh tangan direpresentasikan dalam daftar segitiga dan setiap vertex segitiga berada dalam urutan berlawanan arah jarum jam saat dilihat dari luar tangan.
Jika nilai isActive yang ditampilkan adalah XR_FALSE, ini menunjukkan bahwa tangan
tidak dilacak secara aktif; misalnya, tangan berada di luar rentang sensor, fokus input diambil dari aplikasi, atau aplikasi tidak memiliki
izin untuk mengakses data pelacakan tangan.
Jika nilai isActive yang ditampilkan adalah XR_TRUE, mesh pelacakan tangan
yang direpresentasikan dalam indices dan positions, termasuk textureUVs dan normals
jika didukung oleh sistem, akan diperbarui ke data terbaru dari
XrHandMeshGetInfoANDROID::time yang diberikan ke fungsi
xrGetHandMeshANDROID.
Memori yang ditunjuk oleh buffer mesh tangan yang ditampilkan di XrHandMeshANDROID dimiliki oleh runtime dan dibagikan dengan aplikasi. Memori aman untuk diakses dari thread mana pun hingga panggilan berikutnya ke xrBeginFrame saat handle XrHandMeshTrackerANDROID valid.
- Nilai yang ditunjuk oleh
indicesdantextureUVstidak dinamis - Pointer dan nilai yang ditunjuk oleh
positionsdannormalsbersifat dinamis yang dapat berubah di antara panggilan ke xrBeginFrame. Aplikasi dapat menggunakandynamicLastUpdateTimeuntuk memeriksa apakah nilai telah berubah sejak frame terakhir dan menghindari pemrosesan data yang tidak perlu jika tidak ada perubahan.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_hand_meshharus diaktifkan sebelum menggunakan XrHandMeshANDROID indicesharus berupa pointer ke nilaiuint32_tyang validtextureUVsharus berupa pointer ke struktur XrVector2f yang validpositionsharus berupa pointer ke struktur XrVector3f yang validnormalsharus berupa pointer ke struktur XrVector3f yang valid
Contoh kode untuk pelacakan mesh tangan
Kode contoh berikut menunjukkan cara mengakses buffering mesh tangan untuk rendering.
XrInstance instance; // Created at app startup
XrSystemId systemId; // Received from xrGetSystem() at app startup
XrSession session; // Created at app startup.
XrSpace appPlaySpace; // Created at app startup.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateHandMeshTrackerANDROID xrCreateHandMeshTrackerANDROID; // previously initialized
PFN_xrDestroyHandMeshTrackerANDROID xrDestroyHandMeshTrackerANDROID; // previously initialized
PFN_xrGetHandMeshANDROID xrGetHandMeshANDROID; // previously initialized
// Inspect system capability
XrSystemHandMeshTrackingPropertiesANDROID handMeshTrackingProps = {
.type = XR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &handMeshTrackingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!handMeshTrackingProps.supportsHandMeshTracking) {
// hand mesh tracking is not supported.
return;
}
XrHandMeshTrackerCreateInfoANDROID trackerCreateInfo = {
.type = XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
};
XrHandMeshTrackerANDROID handMeshTracker = XR_NULL_HANDLE;
CHK_XR(xrCreateHandMeshTrackerANDROID(
session, &trackerCreateInfo, &handMeshTracker));
// app update loop
while (true) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// ...
XrHandMeshGetInfoANDROID getInfo = {
.type = XR_TYPE_HAND_MESH_GET_INFO_ANDROID,
.baseSpace = appPlaySpace,
.time = time,
};
XrHandTrackingMeshesANDROID handMeshes = {
.type = XR_TYPE_HAND_TRACKING_MESHES_ANDROID
};
CHK_XR(xrGetHandMeshANDROID(handMeshTracker, &getInfo, &handMeshes));
if (handMeshes.leftHandMesh.isActive) {
// access vertex/index buffers for rendering.
}
// ...
// Finish frame loop
// ...
}
CHECK_XR(xrDestroyHandMeshTracker(handMeshTracker));
Jenis Objek Baru
Konstanta Enum Baru
Enumerasi XrObjectType diperluas dengan:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
Enumerasi XrStructureType diperluas dengan:
XR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_HAND_MESH_GET_INFO_ANDROIDXR_TYPE_HAND_TRACKING_MESHES_ANDROID
Enum Baru
Struktur Baru
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
Fungsi Baru
Masalah
Histori Versi
- Revisi 1, 10-09-2024 (Levana Chen)
- Deskripsi ekstensi awal
OpenXR™ dan logo OpenXR adalah merek dagang yang dimiliki oleh The Khronos Group Inc. dan terdaftar sebagai merek dagang di China, Uni Eropa, Jepang, dan Inggris Raya.