Chuỗi tên
XR_ANDROID_hand_mesh
Loại phần mở rộng
Tiện ích thực thể
Số điện thoại mở rộng đã đăng ký
704
Bản sửa đổi
1
Phần mở rộng và phần phụ thuộc phiên bản
Ngày sửa đổi gần đây nhất
2024-09-10
Trạng thái IP
Không có thông báo xác nhận quyền sở hữu đối với tài sản trí tuệ nào.
Cộng tác viên
Nihav Jain, Google
Cairn Overturf, Google
Spencer Quin, Google
Levana Chen, Google
Tổng quan
Tiện ích này cho phép theo dõi cử chỉ tay được biểu thị dưới dạng lưới tay động.
Tiện ích này nhằm cung cấp vùng đệm đỉnh và chỉ mục cho lưới của hình ảnh đại diện cá nhân cho bàn tay của người dùng. Bạn có thể sử dụng tính năng này để che khuất và trực quan hoá.
Bạn không nên sử dụng tiện ích này cho các mục đích theo dõi chuyển động tay khác.
- Để tương tác, bạn có thể sử dụng
XR_EXT_hand_interaction. - Đối với các khớp xương, bạn có thể sử dụng
XR_EXT_hand_tracking.
Dữ liệu theo dõi chuyển động tay có thể là thông tin cá nhân nhạy cảm và liên quan chặt chẽ đến quyền riêng tư và tính toàn vẹn của cá nhân. Các ứng dụng lưu trữ hoặc chuyển dữ liệu theo dõi chuyển động tay nên luôn yêu cầu người dùng chấp nhận một cách chủ động và cụ thể.
Kiểm tra chức năng của hệ thống
Ứng dụng có thể kiểm tra xem hệ thống có thể theo dõi lưới bằng tay hay không bằng cách nối chuỗi cấu trúc XrSystemHandMeshTrackingPropertiesANDROID với XrSystemProperties khi gọi xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.supportsHandMeshTrackinglàXrBool32, cho biết liệuXrSystemIdđã chọn có hỗ trợ tính năng theo dõi lưới tay hay không.supportsTextureUVlàXrBool32, cho biết liệuXrSystemIdđã chọn có hỗ trợ UV hoạ tiết cho các đỉnh lưới hay không.supportsVertexNormallàXrBool32, cho biết liệuXrSystemIdđã chọn có hỗ trợ pháp tuyến đỉnh cho các đỉnh lưới hay không.
Ứng dụng nên tránh sử dụng các tính năng lưới tay khi supportsHandMeshTracking là XR_FALSE, vì điều này có nghĩa là hệ thống không hỗ trợ tính năng theo dõi lưới tay. Trong trường hợp này, xrCreateHandMeshTrackerANDROID sẽ trả về XR_ERROR_FEATURE_UNSUPPORTED.
Nếu supportsHandMeshTracking trả về XR_TRUE, hệ thống sẽ hỗ trợ tính năng theo dõi lưới tay. Ứng dụng nên sử dụng XrHandMeshANDROID::indexCount và XrHandMeshANDROID::vertexCount để truy cập vào vùng đệm lưới tay và sử dụng lại các vùng đệm đó trong vòng lặp kết xuất khi gọi xrGetHandMeshANDROID mỗi khung hình.
Nếu supportsTextureUV trả về XR_FALSE, thì hệ thống sẽ không hỗ trợ UV kết cấu cho các đỉnh lưới, do đó, ứng dụng sẽ nhận được XrHandMeshANDROID::textureUVs NULL khi gọi xrGetHandMeshANDROID.
Nếu supportsVertexNormal trả về XR_FALSE, thì hệ thống sẽ không hỗ trợ pháp tuyến đỉnh cho các đỉnh lưới, do đó, ứng dụng sẽ nhận được XrHandMeshANDROID::normals NULL khi gọi xrGetHandMeshANDROID.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi sử dụng XrSystemHandMeshTrackingPropertiesANDROID typephải làXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDnextphải làNULLhoặc con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc
Tạo tay cầm của trình theo dõi lưới
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
Tay cầm XrHandMeshTrackerANDROID đại diện cho một trình theo dõi lưới tay để theo dõi lưới tay và quản lý các tài nguyên liên quan.
Bạn có thể sử dụng tay cầm này để truy cập vào vùng đệm lưới tay bằng các hàm khác trong tiện ích này.
Ứng dụng có thể tạo một tay điều khiển XrHandMeshTrackerANDROID bằng cách sử dụng hàm xrCreateHandMeshTrackerANDROID.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
Nội dung mô tả tham số
sessionlà một XrSession trong đó trình theo dõi lưới tay sẽ hoạt động.createInfolà XrHandMeshTrackerCreateInfoANDROID dùng để chỉ định trình theo dõi lưới tay.handMeshTrackerlà tay điều khiển XrHandMeshTrackerANDROID được trả về.
Nếu hệ thống không hỗ trợ tính năng theo dõi lưới tay, thì xrCreateHandMeshTrackerANDROID sẽ trả về XR_ERROR_FEATURE_UNSUPPORTED.
Tên người dùng XrHandMeshTrackerANDROID sở hữu tất cả tài nguyên để theo dõi lưới bàn tay. Sau khi kết thúc trải nghiệm theo dõi lưới tay, ứng dụng phải huỷ tay cầm bằng cách sử dụng hàm xrDestroyHandMeshTrackerANDROID.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi gọi xrCreateHandMeshTrackerANDROID sessionphải là một tay cầm XrSession hợp lệcreateInfophải là con trỏ đến cấu trúc XrHandMeshTrackerCreateInfoANDROID hợp lệhandMeshTrackerphải là con trỏ đến một tay cầm XrHandMeshTrackerANDROID
Mã trả về
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
Cấu trúc XrHandMeshTrackerCreateInfoANDROID mô tả thông tin để tạo một tay cầm XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi sử dụng XrHandMeshTrackerCreateInfoANDROID typephải làXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDnextphải làNULLhoặc con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúc
Hàm xrDestroyHandMeshTrackerANDROID sẽ giải phóng handMeshTracker và các tài nguyên cơ bản khi bạn hoàn tất trải nghiệm theo dõi lưới tay.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
Nội dung mô tả tham số
handMeshTrackerlà một XrHandMeshTrackerANDROID do xrCreateHandMeshTrackerANDROID tạo trước đó.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi gọi xrDestroyHandMeshTrackerANDROID handMeshTrackerphải là một tay cầm XrHandMeshTrackerANDROID hợp lệ
Độ an toàn cho luồng
- Quyền truy cập vào
handMeshTrackervà mọi tay điều khiển con phải được đồng bộ hoá bên ngoài
Mã trả về
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Tìm lưới tay
Ứng dụng có thể sử dụng hàm xrGetHandMeshANDROID để truy xuất lưới tay tại một dấu thời gian nhất định. Vị trí và pháp tuyến của các đỉnh của lưới tay được biểu thị trong không gian do XrHandMeshGetInfoANDROID::baseSpace chỉ định khi gọi xrGetHandMeshANDROID.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
Nội dung mô tả tham số
handMeshTrackerlà một tên người dùng XrHandMeshTrackerANDROID được tạo trước đó bằng xrCreateHandMeshTrackerANDROID.getInfolà cấu trúc XrHandMeshGetInfoANDROID chứa thông tin để truy vấn dữ liệu lưới tay.handMesheslà con trỏ đến cấu trúc XrHandTrackingMeshesANDROID. Cấu trúc này sẽ được điền sẵn dữ liệu lưới tay.
Ứng dụng có thể sử dụng hàm xrGetHandMeshANDROID để truy cập vào vùng đệm lưới tay do môi trường thời gian chạy tạo.
Ứng dụng nên gọi xrBeginFrame ít nhất một lần trong phiên trước khi thực hiện lệnh gọi đầu tiên đến xrGetHandMeshANDROID.
Ứng dụng nên sử dụng XrHandMeshANDROID::indexCount và XrHandMeshANDROID::vertexCount để truy cập vào vùng đệm lưới tay và sử dụng lại các vùng đệm đó trong vòng lặp kết xuất khi gọi xrGetHandMeshANDROID mỗi khung.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi gọi xrGetHandMeshANDROID handMeshTrackerphải là một tay cầm XrHandMeshTrackerANDROID hợp lệgetInfophải là con trỏ đến cấu trúc XrHandMeshGetInfoANDROID hợp lệhandMeshesphải là con trỏ trỏ đến cấu trúc XrHandTrackingMeshesANDROID
Mã trả về
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 mô tả thông tin cần thiết để lấy dữ liệu lưới bàn tay.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.baseSpacelà một XrSpace xác định không gian tham chiếu để xác định phép biến đổi cho các đỉnh tạitime.timelàXrTimemô tả thời điểm ứng dụng muốn truy vấn lưới tay.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi sử dụng XrHandMeshGetInfoANDROID typephải làXR_TYPE_HAND_MESH_GET_INFO_ANDROIDnextphải làNULLhoặc con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúcbaseSpacephải là một tên người dùng XrSpace hợp lệ
Cấu trúc XrHandTrackingMeshesANDROID chứa dữ liệu lưới cho cả hai tay.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.leftHandMeshlà XrHandMeshANDROID cho tay trái.rightHandMeshlà XrHandMeshANDROID cho bàn tay phải.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi sử dụng XrHandTrackingMeshesANDROID typephải làXR_TYPE_HAND_TRACKING_MESHES_ANDROIDnextphải làNULLhoặc con trỏ hợp lệ đến cấu trúc tiếp theo trong chuỗi cấu trúcleftHandMeshphải là cấu trúc XrHandMeshANDROID hợp lệrightHandMeshphải là cấu trúc XrHandMeshANDROID hợp lệ
Cấu trúc XrHandMeshANDROID chứa dữ liệu và vùng đệm để nhận dữ liệu theo dõi lưới bàn tay từ hàm xrGetHandMeshANDROID cho một bàn tay.
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;
Nội dung mô tả thành viên
typelà XrStructureType của cấu trúc này.nextlàNULLhoặc con trỏ trỏ đến cấu trúc tiếp theo trong chuỗi cấu trúc. Không có cấu trúc nào như vậy được xác định trong OpenXR cốt lõi hoặc tiện ích này.isActivelàXrBool32cho biết liệu trình theo dõi lưới tay hiện tại có đang hoạt động và dữ liệu lưới có hợp lệ hay không.dynamicLastUpdateTimelàXrTimechỉ định thời điểm cập nhật vùng đệm động gần đây nhất.indexCountlà mộtuint32_tđóng vai trò là số lượngindicescủa lưới bàn tay.vertexCountlàuint32_tđóng vai trò là sốpositionscủa lưới bàn tay. Bạn cũng có thể sử dụng phương thức này chotextureUVshoặcnormalskhi hệ thống hỗ trợ các phương thức này.indiceslà một mảnguint32_tđại diện cho các chỉ mục lưới cho tam giác theo thứ tự cuộn ngược chiều kim đồng hồ. Số lượng giá trị được trỏ đến làindexCount.textureUVslàNULLhoặc một mảngXrVector2fđại diện cho toạ độ kết cấu đỉnh. Số lượng giá trị được trỏ đến làvertexCount.positionslà một mảngXrVector3fđại diện cho các vị trí đỉnh trongbaseSpaceFromVertexSpace. Số lượng giá trị được trỏ đến làvertexCount.normalslà mộtNULLhoặc một mảngXrVector3fđại diện cho các pháp tuyến đỉnh trongbaseSpaceFromVertexSpace. Số lượng giá trị được trỏ đến làvertexCount.baseSpaceFromVertexSpacelà đỉnh XrSpace nằm trong XrHandMeshGetInfoANDROID::baseSpace khi gọi xrGetHandMeshANDROID. Các ứng dụng có thể sử dụng thông tin này để biến đổi không gian toạ độ của các đỉnh và pháp tuyến của lưới trong quá trình kết xuất.
Lưới kim đồng hồ được biểu thị trong danh sách tam giác và các đỉnh của mỗi tam giác được sắp xếp theo chiều ngược kim đồng hồ khi nhìn từ bên ngoài kim đồng hồ.
Khi giá trị isActive được trả về là XR_FALSE, điều này cho biết tay không được theo dõi chủ động; ví dụ: tay nằm ngoài phạm vi của cảm biến, tiêu điểm đầu vào bị lấy khỏi ứng dụng hoặc ứng dụng không có quyền truy cập vào dữ liệu theo dõi tay.
Khi giá trị isActive được trả về là XR_TRUE, lưới theo dõi tay được biểu thị trong indices và positions, bao gồm cả textureUVs và normals nếu hệ thống hỗ trợ, sẽ được cập nhật thành dữ liệu mới nhất của XrHandMeshGetInfoANDROID::time được cung cấp cho hàm xrGetHandMeshANDROID.
Bộ nhớ được trỏ đến bởi vùng đệm lưới thủ công được trả về trong XrHandMeshANDROID thuộc sở hữu của thời gian chạy và được chia sẻ với ứng dụng. Bạn có thể truy cập bộ nhớ một cách an toàn từ bất kỳ luồng nào cho đến lệnh gọi tiếp theo đến xrBeginFrame trong khi tay cầm XrHandMeshTrackerANDROID hợp lệ.
- Các giá trị được
indicesvàtextureUVstrỏ đến không phải là động - Con trỏ và các giá trị mà
positionsvànormalstrỏ đến là động, cả hai có thể thay đổi giữa các lệnh gọi đến xrBeginFrame. Ứng dụng có thể sử dụngdynamicLastUpdateTimeđể kiểm tra xem các giá trị có thay đổi kể từ khung hình cuối cùng hay không và tránh xử lý dữ liệu không cần thiết khi không có thay đổi nào.
Cách sử dụng hợp lệ (ngầm ẩn)
- Bạn phải bật tiện ích
XR_ANDROID_hand_meshtrước khi sử dụng XrHandMeshANDROID indicesphải là con trỏ đến một giá trịuint32_thợp lệtextureUVsphải là con trỏ đến một cấu trúc XrVector2f hợp lệpositionsphải là con trỏ đến một cấu trúc XrVector3f hợp lệnormalsphải là con trỏ đến một cấu trúc XrVector3f hợp lệ
Mã ví dụ để theo dõi lưới bàn tay
Mã ví dụ sau đây minh hoạ cách truy cập vào vùng đệm lưới tay để kết xuất.
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));
Các loại đối tượng mới
Hằng số enum mới
Bổ sung enum XrObjectType bằng:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
Bổ sung enum XrStructureType:
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 mới
Cấu trúc mới
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
Hàm mới
Vấn đề
Nhật ký phiên bản
- Bản sửa đổi 1, ngày 10 tháng 9 năm 2024 (Levana Chen)
- Nội dung mô tả ban đầu của tiện ích
OpenXR™ và biểu trưng OpenXR là các nhãn hiệu thuộc sở hữu của The Khronos Group Inc. và được đăng ký dưới dạng nhãn hiệu ở Trung Quốc, Liên minh Châu Âu, Nhật Bản và Vương quốc Anh.