سلسلة الاسم
XR_ANDROID_scene_meshing
نوع الإضافة إضافة مثيل
رقم الإضافة المسجَّل 464
المراجعة 3
متطلبات الإضافات والإصدارات OpenXR 1.0
تاريخ آخر تعديل 2025-05-15
حالة الملكية الفكرية لا توجد مطالبات معروفة بشأن الملكية الفكرية.
المساهمون سبنسر كوين، Google جاريد فايندر، Google أنطونيو فونتان، Google كيرن أوفرتورف، Google نيهاف جاين، Google سالار خان، Google سيباستيان كلوز، Google يورغن ستورم، Google فيني داسيلفا، Google ريكاردو كامبل، Google
نظرة عامة
تهدف هذه الإضافة إلى توفير بيانات شبكية للعناصر التي تمثّل تقريبًا الكائنات المادية في محيطك. ويمكن استخدامها لتصوّر المشهد في تطبيق غامر والسماح للكائنات الافتراضية بالتفاعل مع الكائنات المادية، مثل التصادمات.
يمكن أن تكون بيانات ربط المشاهد معلومات شخصية حساسة، وهي مرتبطة ارتباطًا وثيقًا بالخصوصية الشخصية وسلامة البيانات. ننصح بشدة بأن تطلب التطبيقات التي تخزّن بيانات ربط المشاهد أو تنقلها من المستخدم دائمًا الموافقة النشطة والمحدّدة على إجراء ذلك.
الأذونات
يجب أن تتضمّن تطبيقات Android الإذن
android.permission.SCENE_UNDERSTANDING_FINE
في ملف البيان الخاص بها.
يُعدّ الإذن android.permission.SCENE_UNDERSTANDING_FINE
من الأذونات الحساسة لأنّه يسمح لوقت التشغيل بدراسة بيئة المستخدم.
يجب أن يطلب التطبيق الإذن في وقت التشغيل لاستخدام الوظائف التالية:
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(مستوى الحماية: خطير)
فحص إمكانات النظام
يمكن لأحد التطبيقات التحقّق مما إذا كان النظام قادرًا على إنشاء شبكة من المشهد من خلال ربط بنية XrSystemSceneMeshingPropertiesANDROID ببنية XrSystemProperties عند استدعاء xrGetSystemProperties.
XrSystemSceneMeshingPropertiesANDROID
typedef struct XrSystemSceneMeshingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;
أوصاف العضوية
-
type
هو XrStructureType لهذا الهيكل. next
هوNULL
أو مؤشر إلى البنية التالية في سلسلة بنيات. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.-
supportsSceneMeshing
هو XrBool32، يشير إلى ما إذا كان النظام يتيح ربط المشاهد.
إذا كانت قيمة supportsSceneMeshing
هي XR_FALSE
، لا يتيح النظام ميزة "دمج المشاهد".
يجب أن يتجنّب التطبيق استخدام وظيفة ربط المشاهد عندما تكون قيمة
supportsSceneMeshing
هي XR_FALSE
، لأنّ طلبات
xrCreateSceneMeshingTrackerANDROID ستفشل.
إذا كانت قيمة supportsSceneMeshing
هي XR_TRUE
، يعني ذلك أنّ النظام يتيح ميزة "ربط المشاهد".
الاستخدام الصالح (الضمني)
- يجب تفعيل إضافة
XR_ANDROID_scene_meshing
قبل استخدام XrSystemSceneMeshingPropertiesANDROID - يجب أن يكون
type
XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
- يجب أن تكون قيمة
next
هيNULL
أو مؤشرًا صالحًا إلى البنية التالية في سلسلة البِنى
XrSceneMeshSemanticLabelSetANDROID
يصف التعداد XrSceneMeshSemanticLabelSetANDROID مجموعات التصنيفات الدلالية لعملية إنشاء شبكة المشهد.
يمثّل كل قيمة في هذا النوع تعدادًا آخر يحتوي على التصنيفات الدلالية.
على سبيل المثال، تمثّل القيمة XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
المجموعة XrSceneMeshSemanticLabelANDROID.
typedef enum XrSceneMeshSemanticLabelSetANDROID {
XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID = 0,
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID = 1,
XR_SCENE_MESH_SEMANTIC_LABEL_SET_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelSetANDROID;
xrEnumerateSupportedSemanticLabelSetsANDROID
يمكن للتطبيق الحصول على مجموعات التصنيفات الدلالية التي يتيحها النظام باستخدام الدالة xrEnumerateSupportedSemanticLabelSetsANDROID.
XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t supportedSemanticLabelSetsInputCapacity,
uint32_t* supportedSemanticLabelSetsOutputCount,
XrSceneMeshSemanticLabelSetANDROID* supportedSemanticLabelSets);
أوصاف المَعلمات
-
instance
هو XrInstance تم إنشاؤه بواسطة التطبيق. -
systemId
هو XrSystemId تمت إعادة محاولة الحصول عليه من xrGetSystem. -
supportedSemanticLabelSetsInputCapacity
هي مدةsupportedSemanticLabelSets
. supportedSemanticLabelSetsOutputCount
هو عدد العناصر فيsupportedSemanticLabelSets
التي تم تعديلها بواسطة وقت التشغيل بدءًا من بداية المصفوفة.-
supportedSemanticLabelSets
هي مصفوفة من XrSceneMeshSemanticLabelSetANDROID التي يكتب إليها وقت التشغيل مجموعات التصنيفات الدلالية المتوافقة.
من المتوقّع أن يتوافق كل نظام مع XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
على الأقل لأنّ قيمة التعداد هذه
لا تمثّل أي مجموعة تصنيفات دلالية، ويمكن استخدامها في حال
لم يكن التطبيق بحاجة إلى دلالات الرؤوس.
إنشاء معرّف لتتبُّع دمج المشاهد
XrSceneMeshingTrackerANDROID
XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)
يمثّل معرّف XrSceneMeshingTrackerANDROID أداة تتبُّع لربط المشاهد وإدارة الموارد ذات الصلة.
يمكن استخدام هذا المعرّف لإنشاء لقطة لشبكة مشهد باستخدام xrCreateSceneMeshSnapshotANDROID في هذه الإضافة.
xrCreateSceneMeshingTrackerANDROID
يمكن للتطبيق إنشاء معرّف XrSceneMeshingTrackerANDROID باستخدام الدالة xrCreateSceneMeshingTrackerANDROID.
XrResult xrCreateSceneMeshingTrackerANDROID(
XrSession session,
const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
XrSceneMeshingTrackerANDROID* tracker);
أوصاف المَعلمات
-
session
هي XrSession يكون فيها برنامج تتبُّع ربط المشهد نشطًا. createInfo
هو مؤشر إلى بنية XrSceneMeshingTrackerCreateInfoANDROID المستخدَمة لوصف أداة تتبُّع ربط المشهد التي سيتم إنشاؤها.-
tracker
هو معرّف XrSceneMeshingTrackerANDROID الذي تم عرضه.
إذا كان النظام لا يتيح ربط المشاهد، ستعرض الدالة xrCreateSceneMeshingTrackerANDROID القيمة
XR_ERROR_FEATURE_UNSUPPORTED
.
يمكن للتطبيق التحقّق من توافق النظام من خلال استدعاء xrGetSystemProperties باستخدام بنية XrSystemSceneMeshingPropertiesANDROID.
يمكن استخدام مجموعات التصنيفات الدلالية التي يتيحها النظام فقط في XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet عند إنشاء أداة تتبُّع لربط المشهد. يمكن استخدام الدالة xrEnumerateSupportedSemanticLabelSetsANDROID للحصول على قائمة بمجموعات التصنيفات الدلالية المتوافقة.
إذا طلب التطبيق semanticLabelSet
غير متوافق، ستعرض الدالة xrCreateSceneMeshingTrackerANDROID القيمة XR_ERROR_FEATURE_UNSUPPORTED
.
يتضمّن معرّف xrCreateSceneMeshingTrackerANDROID جميع الموارد اللازمة لإنشاء شبكة المشهد. بعد الانتهاء من تجربة ربط المشاهد، يجب أن يوقف التطبيق المعالج باستخدام الدالة xrDestroySceneMeshingTrackerANDROID.
XrSceneMeshingTrackerCreateInfoANDROID
يصف البنية XrSceneMeshingTrackerCreateInfoANDROID المعلومات اللازمة لإنشاء معرّف XrSceneMeshingTrackerANDROID.
typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSceneMeshSemanticLabelSetANDROID semanticLabelSet;
XrBool32 enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;
أوصاف العضوية
-
type
هو XrStructureType لهذا الهيكل. next
هوNULL
أو مؤشر إلى البنية التالية في سلسلة بنيات. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.-
semanticLabelSet
هو XrSceneMeshSemanticLabelSetANDROID يُستخدَم لتحديد مجموعة التصنيفات الدلالية التي سيتم استخدامها في إنشاء شبكة المشهد. إذا تم ضبط هذه القيمة علىXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
، سيتجاهل وقت التشغيل حقل المخزن المؤقت XrSceneSubmeshDataANDROID::vertexSemantics. -
enableNormals
هو XrBool32 يُستخدَم لتحديد ما إذا كان سيتم تضمين متجهات عادية للرؤوس في مخزن بيانات شبكة المشهد عند الحصول على بيانات شبكة المشهد.
xrDestroySceneMeshingTrackerANDROID
تؤدي الدالة xrDestroySceneMeshingTrackerANDROID إلى تحرير
tracker
والموارد الأساسية عند الانتهاء من تجارب
ربط المشهد.
XrResult xrDestroySceneMeshingTrackerANDROID(
XrSceneMeshingTrackerANDROID tracker);
أوصاف المَعلمات
-
tracker
هو XrSceneMeshingTrackerANDROID تم إنشاؤه سابقًا باستخدام xrCreateSceneMeshingTrackerANDROID.
إنشاء مقبض للقطة شبكة مشهد
XrSceneMeshSnapshotANDROID
XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)
يمثّل معرّف XrSceneMeshSnapshotANDROID لقطة لشبكة مشهد. يتم إنشاء ذلك باستخدام xrCreateSceneMeshSnapshotANDROID التي تأخذ بشكل أساسي لقطة لبيانات شبكة المشهد في وقت استدعاء الدالة.
يمكن استخدام هذا المعرّف لاسترداد معلومات وبيانات الشبكة الفرعية باستخدام xrGetAllSubmeshStatesANDROID وxrGetSubmeshDataANDROID.
XrSceneMeshSnapshotCreateInfoANDROID
يصف البنية XrSceneMeshSnapshotCreateInfoANDROID المعلومات اللازمة لإنشاء معرّف XrSceneMeshSnapshotANDROID.
typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
XrBoxf boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;
أوصاف العضوية
-
type
هو XrStructureType لهذا الهيكل. next
هوNULL
أو مؤشر إلى البنية التالية في سلسلة بنيات. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.-
baseSpace
هي XrSpace تُستخدَم لوصف مساحة المرجع التي يجب تمثيل معلومات وضع الشبكات الفرعية للمشهد فيها. -
time
هو XrTime الذي يصف الوقت الذي ستتم فيه معالجة شبكة المشهد أو عرضها. -
boundingBox
هو XrBoxf يصف مربّع الإحاطة الذي سيتم ضمنه الحصول على شبكة المشهد.
XrSceneMeshTrackingStateANDROID
يصف التعداد XrSceneMeshTrackingStateANDROID حالة التتبُّع الخاصة بأداة تتبُّع ربط المشاهد. تمثّل كل قيمة في هذا التعداد حالة أداة تتبُّع ربط المشهد. يتم تضمين هذه السمة في بنية XrSceneMeshSnapshotCreationResultANDROID التي يتم عرضها من xrCreateSceneMeshSnapshotANDROID.
typedef enum XrSceneMeshTrackingStateANDROID {
XR_SCENE_MESH_TRACKING_STATE_INITIALIZING_ANDROID = 0,
XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID = 1,
XR_SCENE_MESH_TRACKING_STATE_WAITING_ANDROID = 2,
XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID = 3,
XR_SCENE_MESH_TRACKING_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshTrackingStateANDROID;
XrSceneMeshSnapshotCreationResultANDROID
يخزّن البنية XrSceneMeshSnapshotCreationResultANDROID نتيجة إنشاء لقطة لشبكة مشهد تم إرجاعها من xrCreateSceneMeshSnapshotANDROID. تتضمّن النتيجة معرّف اللقطة وحالة التتبُّع لبرنامج تتبُّع ربط المشهد في وقت إنشاء اللقطة.
typedef struct XrSceneMeshSnapshotCreationResultANDROID {
XrStructureType type;
void* next;
XrSceneMeshSnapshotANDROID snapshot;
XrSceneMeshTrackingStateANDROID trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;
أوصاف العضوية
-
type
هو XrStructureType لهذا الهيكل. next
هوNULL
أو مؤشر إلى البنية التالية في سلسلة بنيات. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.-
snapshot
هو معرّف XrSceneMeshSnapshotANDROID تم إنشاؤه بواسطة وقت التشغيل. -
trackingState
هو XrSceneMeshTrackingStateANDROID يصف حالة أداة تتبُّع ربط المشهد في وقت إنشاء اللقطة.
xrCreateSceneMeshSnapshotANDROID
يمكن للتطبيق استخدام الدالة xrCreateSceneMeshSnapshotANDROID لإنشاء لقطة لشبكة المشهد من أداة تتبُّع ربط المشهد. تعرض هذه الدالة معرّف XrSceneMeshSnapshotANDROID بالإضافة إلى XrSceneMeshTrackingStateANDROID مضمّن في بنية XrSceneMeshSnapshotCreationResultANDROID. المقبض هو من الناحية الفنية لقطة من بيانات شبكة المشهد في وقت الإنشاء. يمكن استخدام هذا المعرّف لطلب معلومات وبيانات شبكة المشهد باستخدام الدالتَين xrGetAllSubmeshStatesANDROID وxrGetSubmeshDataANDROID على التوالي.
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
أوصاف المَعلمات
-
tracker
هو معرّف XrSceneMeshingTrackerANDROID تم إنشاؤه سابقًا باستخدام xrCreateSceneMeshingTrackerANDROID. -
createInfo
هو مؤشر إلى بنية XrSceneMeshSnapshotCreateInfoANDROID التي تحتوي على المعلومات اللازمة لإنشاء لقطة لشبكة المشهد. -
outSnapshotCreationResult
هو مؤشر إلى عنصر XrSceneMeshSnapshotCreationResultANDROID الذي تتم تعبئته بواسطة وقت التشغيل بنتيجة إنشاء اللقطة.
الحصول على بيانات شبكة المشهد من لقطة شبكة المشهد
XrSceneSubmeshStateANDROID
يصف XrSceneSubmeshStateANDROID شبكة فرعية. يحتوي على المعلومات الأساسية حول الشبكة الفرعية (المعرّف، والموضع، والحدود، ووقت آخر تعديل).
typedef struct XrSceneSubmeshStateANDROID {
XrStructureType type;
void* next;
XrUuid submeshId;
XrTime lastUpdatedTime;
XrPosef submeshPoseInBaseSpace;
XrExtent3Df bounds;
} XrSceneSubmeshStateANDROID;
أوصاف العضوية
-
type
هو XrStructureType لهذا الهيكل. next
هوNULL
أو مؤشر إلى البنية التالية في سلسلة بنيات. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.-
submeshId
هو XrUuid يحدّد الشبكة الفرعية. -
lastUpdatedTime
هو XrTime يمثّل الوقت الذي تم فيه إجراء آخر تعديل على الشبكة الفرعية. -
submeshPoseInBaseSpace
هو XrPosef يمثّل وضعية الشبكة الفرعية في المساحة الأساسية المستخدَمة لإنشاء لقطة شبكة المشهد. وهذا هو أيضًا موضع مركز المربّع المحيط بالشبكة الفرعية. -
bounds
هو XrExtent3Df يصف أبعاد المربّع المحيط الذي يضم الشبكة الفرعية. هذه الحدود هي في المساحة الأساسية التي تم استخدامها لإنشاء معرّف شبكة المشهد.
xrGetAllSubmeshStatesANDROID
يمكن للتطبيق استخدام الدالة xrGetAllSubmeshStatesANDROID للحصول على حالة جميع الشبكات الفرعية في شبكة المشهد. يحتوي هذا الحقل على معلومات أساسية تتيح للتطبيق اختيار الشبكات الفرعية التي يريد الحصول على بياناتها. يمكن استخدام هذه الدالة في تعبير من خطوتين.
XrResult xrGetAllSubmeshStatesANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshStateCapacityInput,
uint32_t* submeshStateCountOutput,
XrSceneSubmeshStateANDROID* submeshStates);
أوصاف المَعلمات
-
snapshot
هو معرّف XrSceneMeshSnapshotANDROID تم إنشاؤه سابقًا باستخدام xrCreateSceneMeshSnapshotANDROID. -
submeshStateCapacityInput
هو طولsubmeshStates
. submeshStateCountOutput
هو عدد العناصر فيsubmeshStates
التي تم تعديلها بواسطة وقت التشغيل بدءًا من بداية الصفيفة.-
submeshStates
هو مصفوفة من بنى XrSceneSubmeshStateANDROID التي ستعرض عليها وقت التشغيل حالة جميع الشبكات الفرعية في شبكة المشهد.
XrSceneSubmeshDataANDROID
يحتوي XrSceneSubmeshDataANDROID على بيانات المثلثات الخاصة بشبكة فرعية بالإضافة إلى معرّف الشبكة الفرعية. يتم استخدام هذا الهيكل في xrGetSubmeshDataANDROID للحصول على بيانات الشبكة الفرعية. يجب أن يضبط التطبيق رقم تعريف الشبكة الفرعية لهذا البنية ومؤشرات المخزن المؤقت إلى المخازن المؤقتة المخصّصة، حتى يمكن ملء البيانات التي تم إرجاعها للشبكة الفرعية في المخازن المؤقتة المخصّصة. يمكن للتطبيق استخدام xrGetSubmeshDataANDROID كعبارة ذات استدعاءَين حيث يتطلّب الاستدعاء الأول من التطبيق ضبط معرّف الشبكة الفرعية والحصول على أحجام المخازن المؤقتة المطلوبة لبيانات الشبكة الفرعية، ثم يمكن للتطبيق تخصيص المخازن المؤقتة والحصول على البيانات في الاستدعاء الثاني.
typedef struct XrSceneSubmeshDataANDROID {
XrStructureType type;
const void* next;
XrUuid submeshId;
uint32_t vertexCapacityInput;
uint32_t vertexCountOutput;
XrVector3f* vertexPositions;
XrVector3f* vertexNormals;
uint8_t* vertexSemantics;
uint32_t indexCapacityInput;
uint32_t indexCountOutput;
uint32_t* indices;
} XrSceneSubmeshDataANDROID;
أوصاف العضوية
-
type
هو XrStructureType لهذا الهيكل. next
هوNULL
أو مؤشر إلى البنية التالية في سلسلة بنيات. لم يتم تحديد أي بنى من هذا النوع في OpenXR الأساسية أو هذه الإضافة.-
submeshId
هو XrUuid يحدّد الشبكة الفرعية. vertexCapacityInput
هي مدةvertexPositions
وvertexNormals
وvertexSemantics
.vertexCountOutput
هو عدد العناصر فيvertexPositions
وvertexNormals
وvertexSemantics
التي تم تعديلها بواسطة وقت التشغيل بدءًا من بداية المصفوفة.vertexPositions
هي مصفوفة من XrVector3f التي ستعرض عليها وقت التشغيل مواضع رؤوس الشبكة الفرعية.-
vertexNormals
هو مصفوفة من XrVector3f التي ستعرض عليها وقت التشغيل المتجهات العمودية للرؤوس في الشبكة الفرعية. يمكن ترك هذا الحقل فارغًا إذا أنشأ التطبيق أداة تتبُّع مع إيقاف الإعدادات العادية.NULL
vertexSemantics
هي مصفوفة منuint8_t
التي ستعرض وقت التشغيل دلالات الرأس للشبكة الفرعية. يمكن ترك هذا الحقل فارغًاNULL
إذا أنشأ التطبيق أداة تتبُّع مع ضبطXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
التصنيف الدلالي.-
indexCapacityInput
هو طولindices
. indexCountOutput
هو عدد العناصر فيindices
التي تم تعديلها بواسطة وقت التشغيل بدءًا من بداية المصفوفة.indices
هي مصفوفة منuint32_t
التي سيخرج منها وقت التشغيل فهارس الشبكة الفرعية.
xrGetSubmeshDataANDROID
يمكن للتطبيق استخدام الدالة xrGetSubmeshDataANDROID للحصول على بيانات لقائمة محدّدة من الشبكات الفرعية. يمكن استخدام هذه الدالة في تعبير من خطوتين. في الطلب الأول، يجب أن يضبط التطبيق معرّفًا صالحًا للشبكة الفرعية (أي يمكن استرداده من xrGetAllSubmeshStatesANDROID باستخدام لقطة شبكة المشهد نفسها) وسعة صفرية لكل عنصر في القائمة المحدّدة من الشبكات الفرعية للحصول على أحجام المخازن المؤقتة المطلوبة لبيانات الشبكة الفرعية. في طلب البيانات الثاني، يجب أن يضبط التطبيق مؤشرات المخزن المؤقت على مخزن مؤقت مخصّص لكل عنصر في قائمة الشبكات الفرعية المحدّدة، بالإضافة إلى سعة المخازن المؤقتة للحصول على بيانات الشبكات الفرعية.
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
أوصاف المَعلمات
-
snapshot
هو معرّف XrSceneMeshSnapshotANDROID تم إنشاؤه سابقًا باستخدام xrCreateSceneMeshSnapshotANDROID. -
submeshDataCount
هو طولinoutSubmeshData
. -
inoutSubmeshData
هي مصفوفة من XrSceneSubmeshDataANDROID يتم فيها ملء كل عنصر ببيانات الشبكة في وقت التشغيل استنادًا إلى معرّف الشبكة الفرعية.
XrSceneMeshSemanticLabelANDROID
التعداد XrSceneMeshSemanticLabelANDROID هو المجموعة التلقائية من التصنيفات الدلالية التي يمكن استخدامها لتصنيف رؤوس الشبكة من أجل وصف سطح البيئة المادية الذي يقع عليه رأس الشبكة.
يتم تمثيل مجموعة التعدادات هذه بالقيمة
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
في
XrSceneMeshSemanticLabelSetANDROID.
typedef enum XrSceneMeshSemanticLabelANDROID {
XR_SCENE_MESH_SEMANTIC_LABEL_OTHER_ANDROID = 0,
XR_SCENE_MESH_SEMANTIC_LABEL_FLOOR_ANDROID = 1,
XR_SCENE_MESH_SEMANTIC_LABEL_CEILING_ANDROID = 2,
XR_SCENE_MESH_SEMANTIC_LABEL_WALL_ANDROID = 3,
XR_SCENE_MESH_SEMANTIC_LABEL_TABLE_ANDROID = 4,
XR_SCENE_MESH_SEMANTIC_LABEL_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelANDROID;
تدمير لقطة شبكة مشهد
xrDestroySceneMeshSnapshotANDROID
يمكن للتطبيق استخدام الدالة xrDestroySceneMeshSnapshotANDROID لتدمير لقطة لشبكة مشهد. بعد إتلاف المعرّف، لا يمكن للتطبيق استخدامه للحصول على معلومات أو بيانات الشبكة الفرعية. يتم إيقاف المعرّف تلقائيًا عند إيقاف أداة التتبُّع لأنّ معرّف أداة التتبُّع هو العنصر الرئيسي لمعرّف لقطة شبكة المشهد.
XrResult xrDestroySceneMeshSnapshotANDROID(
XrSceneMeshSnapshotANDROID snapshot);
أوصاف المَعلمات
-
snapshot
هو معرّف XrSceneMeshSnapshotANDROID تم إنشاؤه سابقًا باستخدام xrCreateSceneMeshSnapshotANDROID وسيتم إتلافه بواسطة هذه الدالة.
مثال على الرمز البرمجي لإنشاء شبكة المشهد
يوضّح مثال الرمز البرمجي التالي كيفية الوصول إلى بيانات شبكة المشهد لعرضها.
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_xrCreateSceneMeshingTrackerANDROID xrCreateSceneMeshingTrackerANDROID;
PFN_xrDestroySceneMeshingTrackerANDROID xrDestroySceneMeshingTrackerANDROID;
PFN_xrEnumerateSupportedSemanticLabelSetsANDROID xrEnumerateSupportedSemanticLabelSetsANDROID;
PFN_xrCreateSceneMeshSnapshotANDROID xrCreateSceneMeshSnapshotANDROID;
PFN_xrDestroySceneMeshSnapshotANDROID xrDestroySceneMeshSnapshotANDROID;
PFN_xrGetAllSubmeshStatesANDROID xrGetAllSubmeshStatesANDROID;
PFN_xrGetSubmeshDataANDROID xrGetSubmeshDataANDROID;
// Inspect system capability
XrSystemSceneMeshingPropertiesANDROID sceneMeshingProps = {
.type = XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &sceneMeshingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!sceneMeshingProps.supportsSceneMeshing) {
// scene meshing is not supported.
return;
}
uint32_t supportedsemanticLabelSetsCount = 0;
xrEnumerateSupportedSemanticLabelSetsANDROID(
instance, systemId, 0, &supportedsemanticLabelSetsCount, nullptr);
std::vector<XrSceneMeshSemanticLabelSetANDROID> supportedSemanticLabelSets(
supportedsemanticLabelSetsCount);
xrEnumerateSupportedSemanticLabelSetsANDROID(
instance, systemId, supportedsemanticLabelSetsCount,
&supportedsemanticLabelSetsCount, supportedSemanticLabelSets.data());
XrSceneMeshSemanticLabelSetANDROID semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID;
// Check if system supports XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
if (std::find(supportedSemanticLabelSets.begin(), supportedSemanticLabelSets.end(),
XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID) !=
supportedSemanticLabelSets.end()) {
semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID;
}
XrSceneMeshingTrackerCreateInfoANDROID trackerCreateInfo = {
.type = XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID,
.semanticLabelSet = semanticLabelSet,
.enableNormals = XR_TRUE
};
XrSceneMeshingTrackerANDROID tracker = XR_NULL_HANDLE;
CHK_XR(xrCreateSceneMeshingTrackerANDROID(session, &trackerCreateInfo, &tracker));
XrSceneMeshSnapshotCreationResultANDROID snapshotResult = {
.type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID,
.snapshot = XR_NULL_HANDLE
};
XrSceneMeshSnapshotANDROID& snapshot = snapshotResult.snapshot;
XrSceneMeshSnapshotCreateInfoANDROID createInfo = {
.type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
};
// app update loop
while (true) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
XrBoxf box; // populated with the bounding box of the camera frustum
// ...
createInfo.baseSpace = appPlaySpace;
createInfo.time = time;
createInfo.boundingBox = box;
// Grab the scene mesh snapshot. This way the app can: know all of the submesh infos,
// choose the appropriate submeshes for which to get data, allocate the necessary
// buffer for those submeshes, and then get the data.
CHK_XR(xrCreateSceneMeshSnapshotANDROID(tracker, &createInfo, &snapshotResult));
// check the tracking state
if (snapshotResult.trackingState == XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID) {
// unrecoverable error. Exit the app.
if (snapshot != XR_NULL_HANDLE) {
CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
snapshot = XR_NULL_HANDLE;
}
break;
} else if (snapshotResult.trackingState != XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID) {
// The tracker is not tracking. Try again later.
if (snapshot != XR_NULL_HANDLE) {
CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
snapshot = XR_NULL_HANDLE;
}
continue;
}
// 2-call idiom for getting submesh states
std::vector<XrSceneSubmeshStateANDROID> states;
uint32_t submeshCount = 0;
CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, 0, &submeshCount, nullptr));
states.resize(submeshCount);
for (XrSceneSubmeshStateANDROID& state : states) {
state = {.type = XR_TYPE_SCENE_SUBMESH_STATE_ANDROID};
}
CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, submeshCount, &submeshCount, states.data()));
// To store the poses for the selected submeshes
std::vector<XrPosef> submeshesPoses;
submeshesPoses.reserve(submeshCount);
std::vector<XrSceneSubmeshDataANDROID> submeshes;
submeshes.reserve(submeshCount);
// Iterate the states and determine which submeshes the app wants data for
for (XrSceneSubmeshStateANDROID& state : states) {
// Modify this bool as necessary by looking at states. Maybe state.lastUpdatedTime
// is below a threshold or maybe the bounding box does not intersect with camera view
// frustum (The submesh will be culled).
bool needed;
if (needed) {
// Add the selected submesh to the submeshes list. Set the capacity
// zero for now since the size of the buffer will be determined later.
XrSceneSubmeshDataANDROID submesh = {
.type = XR_TYPE_SCENE_SUBMESH_DATA_ANDROID,
.submeshId = state.submeshId,
.vertexCapacityInput = 0,
.vertexCountOutput = 0,
.vertexPositions = nullptr,
.vertexNormals = nullptr,
.vertexSemantics = nullptr,
.indexCapacityInput = 0,
.indexCountOutput = 0,
.indices = nullptr,
};
submeshes.push_back(submesh);
submeshesPoses.push_back(state.submeshPoseInBaseSpace);
}
}
// Grab the data for the selected submeshes using the 2-call idiom.
CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));
for (XrSceneSubmeshDataANDROID& submesh : submeshes) {
submesh.vertexCapacityInput = submesh.vertexCountOutput;
submesh.vertexCountOutput = 0;
submesh.vertexPositions = new XrVector3f[submesh.vertexCountOutput];
submesh.vertexNormals = new XrVector3f[submesh.vertexCountOutput];
submesh.vertexSemantics = new uint8_t[submesh.vertexCountOutput];
submesh.indexCapacityInput = submesh.indexCountOutput;
submesh.indexCountOutput = 0;
submesh.indices = new uint32_t[submesh.indexCountOutput];
}
CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));
// Destroy the scene mesh snapshot since we have finally grabbed the submeshes data. In
// next iteration app can: create a new one to get latest mesh data
CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
snapshot = XR_NULL_HANDLE;
// Iterate the submeshes and get the vertex positions, vertex normals and
// vertex semantics data for the selected submeshes
for (uint32_t i = 0; i < submeshes.size(); i++) {
XrSceneSubmeshDataANDROID& data = submeshes[i];
XrVector3f* vertexPositions = data.vertexPositions;
XrVector3f* vertexNormals = data.vertexNormals;
XrSceneMeshSemanticLabelANDROID* vertexSemantics =
reinterpret_cast<XrSceneMeshSemanticLabelANDROID*>(data.vertexSemantics);
XrPosef pose = submeshesPoses[i];
// *** Use the data as per needs ***
// Release the allocated memory for the data buffers when done using
delete [] data.vertexPositions;
delete [] data.vertexNormals;
delete [] data.vertexSemantics;
delete [] data.indices;
}
// ...
// Finish frame loop
// ...
}
CHK_XR(xrDestroySceneMeshingTrackerANDROID(tracker));
أنواع العناصر الجديدة
ثوابت التعداد الجديدة
تمت إضافة ما يلي إلى تعداد XrObjectType:
XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID
تمت إضافة ما يلي إلى تعداد XrStructureType:
XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID
XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID
XR_TYPE_SCENE_SUBMESH_STATE_ANDROID
XR_TYPE_SCENE_SUBMESH_DATA_ANDROID
عمليات التعداد الجديدة
التركيبات الجديدة
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
الدوال الجديدة
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
المشاكل
سجلّ التعديلات
- النسخة 3، 15-05-2025 (سَلار خان) ** وصف الإضافة الأوّلي
OpenXR™ وشعار OpenXR هما علامتان تجاريتان مملوكتان لشركة The Khronos Group Inc. ومسجّلتان كعلامة تجارية في الصين والاتحاد الأوروبي واليابان والمملكة المتحدة.