سلسلة الاسم
XR_ANDROID_hand_mesh
نوع الإضافة
إضافة مثيل
رقم الإضافة المسجَّل
704
المراجعة
1
التبعيات المتعلّقة بالإصدارات والإضافات
تاريخ آخر تعديل
2024-09-10
حالة عنوان IP
ما مِن مطالبات معروفة بعناوين IP.
المساهمون
نيهاف جاين، Google
"كايرن أوفرتوف"، من Google
سبنسر كوين، 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، يعني ذلك أنّ النظام لا يسمح باستخدام XrHandMeshANDROID::textureUVs NULL عند استدعاء xrGetHandMeshANDROID.
إذا عرضت الدالة supportsVertexNormal القيمة XR_FALSE، يعني ذلك أنّ النظام لا يسمح باستخدام اتجاهات رؤوس الشبكة، وبالتالي سيتلقّى التطبيق XrHandMeshANDROID::normals NULL عند استدعاء xrGetHandMeshANDROID.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_ANDROID_hand_meshقبل استخدام XrSystemHandMeshTrackingPropertiesANDROID. typeيجب أن يكونXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDnextيجب أن يكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية.
إنشاء اسم معرِّف لجهاز التتبُّع اليدوي
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
يمثّل المعرّف XrHandMeshTrackerANDROID أداة تتبُّع شبكة اليد لتتبُّع شبكة اليد وإدارة الموارد ذات الصلة.
يمكن استخدام هذا المعرّف للوصول إلى مخازن بيانات شبكة اليد باستخدام دوال أخرى في هذه الإضافة.
يمكن للتطبيق إنشاء معرّف 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يجب أن يكون مؤشرًا إلى بنية XrHandMeshTrackerCreateInfoANDROID صالحةhandMeshTrackerيجب أن يكون مؤشرًا إلى XrHandMeshTrackerANDROID handle
رموز الإرجاع
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_ANDROIDnextيجب أن يكون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يجب أن يكون مؤشرًا إلى XrHandMeshGetInfoANDROID بنية صالحةhandMeshesيجب أن يكون مؤشرًا إلى 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_ANDROIDnextيجب أن يكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية.baseSpaceيجب أن يكون معرّف XrSpace صالحًا
تحتوي بنية XrHandTrackingMeshesANDROID على بيانات الشبكة لكلتا اليدين.
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_ANDROIDnextيجب أن يكونNULLأو مؤشرًا صالحًا إلى البنية التالية في سلسلة البنية.leftHandMeshيجب أن تكون بنية XrHandMeshANDROID صالحةrightHandMeshيجب أن تكون بنية 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فيbaseSpaceFromVertexSpace. عدد القيم التي يتمّ الإشارة إليها هوvertexCount.baseSpaceFromVertexSpaceهو رأس XrSpace في XrHandMeshGetInfoANDROID::baseSpace عند استدعاء xrGetHandMeshANDROID. يمكن للتطبيقات استخدام ذلك لتحويل مساحة التنسيقات لرؤوس الشبكة والعناصر العادية أثناء العرض.
يتم تمثيل شبكة اليد في قوائم المثلثات، وتكون رؤوس كل مثلث بترتيب عكس عقارب الساعة عند النظر من خارج اليد.
عندما تكون قيمة isActive المعروضة هي XR_FALSE، يعني ذلك أنّه تتم متابعة
اليد بشكل غير نشط، على سبيل المثال، تكون اليد خارج نطاق أداة الاستشعار، أو تتم إزالة تركيز الإدخال من التطبيق، أو لا يملك التطبيق
الأذونات اللازمة للوصول إلى بيانات تتبُّع اليد.
عندما تكون قيمة isActive المعروضة هي XR_TRUE، يتم تعديل شبكة تتبُّع اليد
الممثّلة في indices وpositions، بما في ذلك textureUVs وnormals
إذا كانا متوافقَين مع النظام، لتتضمّن أحدث البيانات الخاصة بالملف الشخصي
XrHandMeshGetInfoANDROID::time الذي تم تقديمه إلى الدالة xrGetHandMeshANDROID.
إنّ الذاكرة التي تشير إليها ذاكرة التخزين المؤقت للشبكة اليدوية التي يتم عرضها في XrHandMeshANDROID هي ملكية وقت التشغيل ومشترَكة مع التطبيق. يمكن الوصول إلى الذاكرة بأمان من أي سلسلة محادثات إلى أن يتم إجراء الطلب التالي إلى xrBeginFrame عندما يكون العنوان XrHandMeshTrackerANDROID صالحًا.
- القيم التي تشير إليها
indicesوtextureUVsليست ديناميكية - المؤشر والقيم التي يشير إليها
positionsوnormalsديناميكية قد تتغيّر بين طلبات xrBeginFrame. يمكن للتطبيق استخدامdynamicLastUpdateTimeللتحقّق مما إذا كانت القيم قد تغيّرت منذ اللقطة الأخيرة وتجنُّب معالجة البيانات غير الضرورية في حال عدم حدوث أي تغييرات.
الاستخدام الصالح (ضمني)
- يجب تفعيل إضافة
XR_ANDROID_hand_meshقبل استخدام XrHandMeshANDROID. indicesيجب أن يكون مؤشرًا إلى قيمةuint32_tصالحة.textureUVsيجب أن يكون مؤشرًا إلى بنية XrVector2f صالحة.positionsيجب أن يكون مؤشرًا إلى بنية XrVector3f صالحةnormalsيجب أن يكون مؤشرًا إلى بنية XrVector3f صالحة
مثال على رمز تتبُّع شبكة اليد
يوضّح المثال التالي للرمز البرمجي كيفية الوصول إلى مخازن توفُّر شبكة اليد لعمليات المعالجة.
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));
أنواع العناصر الجديدة
ثوابت قائمة التعداد الجديدة
تم توسيع قائمة 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
عمليات التعداد الجديدة
التصاميم الجديدة
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
الدوالّ الجديدة
المشاكل
سجلّ الإصدارات
- المراجعة 1، 10-09-2024 (ليفانا تشين)
- الوصف الأوّلي للإضافة
OpenXR™ وشعار OpenXR هما علامتان تجاريتان مملوكتان لشركة The Khronos Group Inc. ومسجَّلتان كعلامتَين تجاريتَين في الصين والاتحاد الأوروبي واليابان والمملكة المتحدة.