מחרוזת שם
XR_ANDROID_hand_mesh
סוג התוסף
תוסף למכונה
מספר תוסף רשום
704
גרסה
1
תלות בתוספים ובגרסאות
תאריך השינוי האחרון
2024-09-10
סטטוס כתובת ה-IP
לא ידוע על תלונות על הפרת זכויות יוצרים בנושא כתובת IP.
שותפים ביצירת התוכן
Nihav Jain, Google
קארן אוברטורף (Cairn Overturf), Google
ספנסר קווין (Spencer Quin), Google
לונן צ'ן, Google
סקירה כללית
התוסף הזה מאפשר מעקב אחר תנועות הידיים שמוצגות כרשת דינמית של היד.
התוסף הזה מיועד לספק מאגרי קודקודים ומאגרי אינדקסים למערך של ייצוג מותאם אישית של הידיים של המשתמש. אפשר להשתמש בו כדי להציג חסימה ותצוגה חזותית.
אסור להשתמש בתוסף הזה למטרות אחרות של מעקב אחר תנועות ידיים.
- אפשר להשתמש ב-
XR_EXT_hand_interactionכדי ליצור אינטראקציה. - אפשר להשתמש ב-
XR_EXT_hand_trackingבמפרקים שלדיים.
נתוני מעקב אחר תנועות ידיים יכולים להיות מידע אישי רגיש, והם קשורים באופן הדוק לפרטיות ולשלמות האישית. מומלץ מאוד שאפליקציות ששומרות או מעבירות נתוני מעקב אחר תנועות ידיים תמיד יבקשו מהמשתמשים אישור פעיל וספציפי לכך.
בדיקת יכולות המערכת
אפליקציה יכולה לבדוק אם המערכת מסוגלת לעקוב אחרי רשתות של תנועות ידיים על ידי צירוף של מבנה XrSystemHandMeshTrackingPropertiesANDROID ל-XrSystemProperties בזמן הקריאה ל-xrGetSystemProperties.
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
תיאורי חברים
typeהוא XrStructureType של המבנה הזה.nextהואNULLאו הפניה למבנה הבא בשרשרת המבנים. אין מבנים כאלה מוגדרים ב-OpenXR או בתוסף הזה.supportsHandMeshTrackingהואXrBool32, שמציין אםXrSystemIdשנבחר תומך במעקב אחר רשת של יד.supportsTextureUVהואXrBool32, שמציין אםXrSystemIdשנבחר תומך ב-UV של טקסטורה עבור קודקודי המאגר.supportsVertexNormalהואXrBool32, שמציין אםXrSystemIdשנבחר תומך ברגלי קודקודים של קודקודי המאגר.
צריך להימנע משימוש ביכולות של רשת יד כשהערך של supportsHandMeshTracking הוא XR_FALSE, כי המשמעות היא שהמערכת לא תומכת במעקב אחר רשת יד. במקרה כזה, הפונקציה xrCreateHandMeshTrackerANDROID תחזיר את הערך XR_ERROR_FEATURE_UNSUPPORTED.
אם הפונקציה supportsHandMeshTracking מחזירה את הערך XR_TRUE, המערכת תומכת במעקב אחר רשת של יד. אפליקציה צריכה להשתמש ב-XrHandMeshANDROID::indexCount וב-XrHandMeshANDROID::vertexCount כדי לגשת למאגרי הרשת של היד ולעשות בהם שימוש חוזר בלולאת הרינדור שלה כשקוראים ל-xrGetHandMeshANDROID בכל פריים.
אם הפונקציה supportsTextureUV מחזירה את הערך XR_FALSE, המערכת לא תומכת ב-UV של טקסטורה עבור קודקודי המאגר, ולכן האפליקציה תקבל את הערך XrHandMeshANDROID::textureUVs NULL בקריאה ל-xrGetHandMeshANDROID.
אם הפונקציה supportsVertexNormal מחזירה את הערך XR_FALSE, המערכת לא תומכת ברגלי קודקודים של קודקודי המאגר, ולכן האפליקציה תקבל את הערך XrHandMeshANDROID::normals NULL בקריאה ל-xrGetHandMeshANDROID.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמשתמשים ב-XrSystemHandMeshTrackingPropertiesANDROID - הערך של
typeחייב להיותXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת המבנים
יצירת כינוי למעקב אחר רשתות יד
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
הידית XrHandMeshTrackerANDROID מייצגת מכשיר מעקב אחר רשתות של יד (hand mesh) למעקב אחר רשתות של יד ולניהול המשאבים הקשורים.
אפשר להשתמש בכינוי הזה כדי לגשת למאגרי ה-mesh של היד באמצעות פונקציות אחרות בתוסף הזה.
אפליקציה יכולה ליצור מנוף מסוג XrHandMeshTrackerANDROID באמצעות הפונקציה xrCreateHandMeshTrackerANDROID.
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
תיאורי פרמטרים
sessionהוא XrSession שבו מכשיר המעקב אחרי רשת היד יהיה פעיל.createInfoהוא XrHandMeshTrackerCreateInfoANDROID שמשמש לציון המעקב אחרי רשת היד.handMeshTrackerהיא הידית XrHandMeshTrackerANDROID שהוחזרה.
אם המערכת לא תומכת במעקב אחר רשת של כף יד, הפונקציה xrCreateHandMeshTrackerANDROID תחזיר את הערך XR_ERROR_FEATURE_UNSUPPORTED.
הידית XrHandMeshTrackerANDROID היא הבעלים של כל המשאבים למעקב אחר רשתות של כפות ידיים. אחרי שמסיימים את חוויות המעקב אחר רשתות של כפות ידיים, האפליקציה חייבת להשמיד את הידית באמצעות הפונקציה xrDestroyHandMeshTrackerANDROID.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמפעילים את xrCreateHandMeshTrackerANDROID sessionחייב להיות מזהה XrSession תקיןcreateInfoחייב להיות הפניה למבנה תקין של XrHandMeshTrackerCreateInfoANDROIDhandMeshTrackerחייב להיות הפניה למזהה של XrHandMeshTrackerANDROID
קודי החזרה
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
המבנה XrHandMeshTrackerCreateInfoANDROID מתאר את המידע שנחוץ כדי ליצור את הידית XrHandMeshTrackerANDROID.
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
תיאורי חברים
typeהוא XrStructureType של המבנה הזה.nextהואNULLאו הפניה למבנה הבא בשרשרת המבנים. אין מבנים כאלה מוגדרים ב-OpenXR או בתוסף הזה.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמשתמשים ב-XrHandMeshTrackerCreateInfoANDROID - הערך של
typeחייב להיותXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת המבנים
הפונקציה xrDestroyHandMeshTrackerANDROID משחררת את handMeshTracker ואת המשאבים הבסיסיים כשמסיימים את חוויית המעקב אחר רשת היד.
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
תיאורי פרמטרים
handMeshTrackerהוא אובייקט מסוג XrHandMeshTrackerANDROID שנוצר קודם לכן באמצעות xrCreateHandMeshTrackerANDROID.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמפעילים את xrDestroyHandMeshTrackerANDROID handMeshTrackerחייב להיות מזהה XrHandMeshTrackerANDROID חוקי
בטיחות בשרשור
- חובה לסנכרן באופן חיצוני את הגישה ל-
handMeshTrackerולכל כינויים משניים
קודי החזרה
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
איתור רשתות של ידיים
האפליקציה יכולה להשתמש בפונקציה xrGetHandMeshANDROID כדי לאחזר את רשת היד בחותמת זמן נתונה. המיקום והנורמלי של הקודקודים של רשת היד מיוצגים במרחב שצוין על ידי XrHandMeshGetInfoANDROID::baseSpace בזמן הקריאה ל-xrGetHandMeshANDROID.
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
תיאורי פרמטרים
handMeshTrackerהוא ערך של XrHandMeshTrackerANDROID שנוצר קודם לכן באמצעות xrCreateHandMeshTrackerANDROID.getInfoהוא מבנה XrHandMeshGetInfoANDROID שמכיל מידע לשליחת שאילתות לגבי נתוני רשת היד.handMeshesהוא הפניה למבנה XrHandTrackingMeshesANDROID, שיאוכלס בנתוני רשת היד.
האפליקציה יכולה להשתמש בפונקציה xrGetHandMeshANDROID כדי לגשת למאגרי המידע של רשת היד שנוצרו בסביבת זמן הריצה.
היישום צריך להפעיל את xrBeginFrame לפחות פעם אחת במהלך הסשן, לפני הקריאה הראשונה ל-xrGetHandMeshANDROID.
אפליקציה צריכה להשתמש ב-XrHandMeshANDROID::indexCount וב-XrHandMeshANDROID::vertexCount כדי לגשת למאגרי הרשת של היד ולהשתמש בהם שוב בלולאת הרינדור שלה כשקוראים ל-xrGetHandMeshANDROID בכל פריים.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמפעילים את xrGetHandMeshANDROID. handMeshTrackerחייב להיות מזהה XrHandMeshTrackerANDROID חוקיgetInfoחייב להיות הפניה למבנה תקין של XrHandMeshGetInfoANDROIDhandMeshesחייב להיות הפניה למבנה XrHandTrackingMeshesANDROID
קודי החזרה
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 מתואר המידע הנדרש כדי לקבל נתוני רשת של היד.
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
תיאורי חברים
typeהוא XrStructureType של המבנה הזה.nextהואNULLאו הפניה למבנה הבא בשרשרת המבנים. אין מבנים כאלה מוגדרים ב-OpenXR או בתוסף הזה.baseSpaceהוא XrSpace שמגדיר את מרחב העזר שבו ממוקם הטרנספורמציה של הנקודות ב-time.timeהואXrTimeשמתאר את הזמן שבו האפליקציה רוצה לשלוח שאילתה למערך היד.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמשתמשים ב-XrHandMeshGetInfoANDROID. - הערך של
typeחייב להיותXR_TYPE_HAND_MESH_GET_INFO_ANDROID nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת המבניםbaseSpaceחייב להיות כינוי חוקי של XrSpace
המבנה XrHandTrackingMeshesANDROID מכיל נתוני רשת (mesh) לשתי הידיים.
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
תיאורי חברים
typeהוא XrStructureType של המבנה הזה.nextהואNULLאו הפניה למבנה הבא בשרשרת המבנים. אין מבנים כאלה מוגדרים ב-OpenXR או בתוסף הזה.leftHandMeshהוא XrHandMeshANDROID ליד שמאל.rightHandMeshהוא XrHandMeshANDROID ליד הימנית.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמשתמשים ב-XrHandTrackingMeshesANDROID - הערך של
typeחייב להיותXR_TYPE_HAND_TRACKING_MESHES_ANDROID nextחייב להיותNULLאו מצביע תקין למבנה הבא בשרשרת המבניםleftHandMeshחייב להיות מבנה חוקי של XrHandMeshANDROIDrightHandMeshחייב להיות מבנה חוקי של XrHandMeshANDROID
המבנה XrHandMeshANDROID מכיל נתונים ומאגרים לקבלת נתוני מעקב אחר רשת של יד מפונקציית xrGetHandMeshANDROID עבור יד אחת.
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;
תיאורי חברים
typeהוא XrStructureType של המבנה הזה.nextהואNULLאו הפניה למבנה הבא בשרשרת המבנים. אין מבנים כאלה מוגדרים ב-OpenXR או בתוסף הזה.isActiveהואXrBool32שמציין אם מכשיר המעקב הנוכחי אחרי רשת היד פעיל ונתוני הרשת תקינים.dynamicLastUpdateTimeהואXrTimeשמציין את השעה שבה המאגרים הדינמיים עודכנו לאחרונה.indexCountהואuint32_tשמשמש כמספרindicesשל רשת היד.vertexCountהואuint32_tשמשמש כמספרpositionsשל רשת היד. אפשר גם להשתמש בו עבורtextureUVsאוnormalsכשהמערכת תומכת בהם.indicesהוא מערך שלuint32_tשמייצג את אינדקסי הרשת של המשולשים בסדר נגד כיוון השעון. מספר הערכים שמוצגים הואindexCount.textureUVsהואNULLאו מערך שלXrVector2fשמייצג את קואורדינטות המרקם של הנקודה. מספר הערכים שמוצגים הואvertexCount.positionsהוא מערך שלXrVector3fשמייצג את מיקומי הנקודות ב-baseSpaceFromVertexSpace. מספר הערכים שמוצגים הואvertexCount.normalsהואNULLאו מערך שלXrVector3fשמייצג את נורמלי הקודקודים ב-baseSpaceFromVertexSpace. מספר הערכים שמוצגים הואvertexCount.baseSpaceFromVertexSpaceהוא הנקודה XrSpace שנמצאת ב-XrHandMeshGetInfoANDROID::baseSpace בזמן הקריאה ל-xrGetHandMeshANDROID. אפליקציות יכולות להשתמש בכך כדי לשנות את מרחב הקואורדינטות של הקודקודים והנורמלים של המארג במהלך העיבוד.
רשת היד מיוצגת ברשימות של משולשים, והקודקודים של כל המשולשים מסודרים בסדר הפוך לשעון כשמסתכלים מבחוץ על היד.
כשהערך המוחזר של isActive הוא XR_FALSE, המשמעות היא שאין מעקב פעיל אחרי היד. לדוגמה, היד מחוץ לטווח החיישן, המיקוד של הקלט הועבר מהאפליקציה או לאפליקציה אין הרשאות לגשת לנתוני המעקב אחרי היד.
כשהערך המוחזר של isActive הוא XR_TRUE, רשת המעקב אחר הידיים שמיוצגת ב-indices וב-positions, כולל textureUVs ו-normals אם הם נתמכים במערכת, מתעדכנת בנתונים העדכניים ביותר של XrHandMeshGetInfoANDROID::time שניתנים לפונקציה xrGetHandMeshANDROID.
הבעלות על הזיכרון שאליו מפנים מאגרי ה-mesh של היד שמוחזרים ב-XrHandMeshANDROID היא של סביבת זמן הריצה, והיא משותפת עם האפליקציה. אפשר לגשת לזיכרון בבטחה מכל שרשור עד לקריאה הבאה ל-xrBeginFrame, כל עוד ה-handle XrHandMeshTrackerANDROID תקף.
- הערכים ש-
indicesו-textureUVsמפנים אליהם לא דינמיים - הסמן והערכים ש-
positionsו-normalsמפנים אליהם הם דינמיים, ויכולים להשתנות בין קריאות ל-xrBeginFrame. האפליקציה יכולה להשתמש ב-dynamicLastUpdateTimeכדי לבדוק אם הערכים השתנו מאז המסגרת האחרונה, וכך להימנע מעיבודי נתונים מיותרים כשאין שינויים.
שימוש תקין (מרומז)
- חובה להפעיל את התוסף
XR_ANDROID_hand_meshלפני שמשתמשים ב-XrHandMeshANDROID indicesחייב להיות הפניה לערךuint32_tחוקיtextureUVsחייב להיות הפניה למבנה XrVector2f חוקיpositionsחייב להיות הפניה למבנה XrVector3f חוקיnormalsחייב להיות הפניה למבנה XrVector3f חוקי
קוד לדוגמה למעקב אחר רשת של יד
דוגמת הקוד הבאה מראה איך לגשת למאגרי המר mesh של היד לצורך רינדור.
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));
סוגי אובייקטים חדשים
קבועים חדשים של Enum
המניין XrObjectType הורחב עם:
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
המניין 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 חדשים
מבנים חדשים
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
פונקציות חדשות
בעיות
היסטוריית הגרסאות
- גרסה 1, 10 בספטמבר 2024 (Levana Chen)
- תיאור ראשוני של התוסף
OpenXR™ והלוגו של OpenXR הם סימנים מסחריים בבעלות The Khronos Group Inc., והם רשומים כסימנים מסחריים בסין, באיחוד האירופי, ביפן ובבריטניה.