سلسلة الاسم
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_ANDROID
- nextيجب أن يكون- 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_SUCCESS
- XR_SESSION_LOSS_PENDING
- XR_ERROR_FEATURE_UNSUPPORTED
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_RUNTIME_FAILURE
- XR_ERROR_INSTANCE_LOST
- XR_ERROR_SESSION_LOST
- XR_ERROR_OUT_OF_MEMORY
- XR_ERROR_HANDLE_INVALID
- XR_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_UNSUPPORTED
- XR_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_SUCCESS
- XR_SESSION_LOSS_PENDING
- XR_ERROR_FUNCTION_UNSUPPORTED
- XR_ERROR_RUNTIME_FAILURE
- XR_ERROR_INSTANCE_LOST
- XR_ERROR_SESSION_LOST
- XR_ERROR_HANDLE_INVALID
- XR_ERROR_SIZE_INSUFFICIENT
- XR_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 على بيانات الشبكة لكلتا اليدين.
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يجب أن تكون بنية 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_ANDROID
- XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
- XR_TYPE_HAND_MESH_GET_INFO_ANDROID
- XR_TYPE_HAND_TRACKING_MESHES_ANDROID
عمليات التعداد الجديدة
التصاميم الجديدة
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
الدوالّ الجديدة
المشاكل
سجلّ الإصدارات
- المراجعة 1، 10-09-2024 (ليفانا تشين)
- الوصف الأوّلي للإضافة
 
OpenXR™ وشعار OpenXR هما علامتان تجاريتان مملوكتان لشركة The Khronos Group Inc. ومسجَّلتان كعلامتَين تجاريتَين في الصين والاتحاد الأوروبي واليابان والمملكة المتحدة.
