XR_EXT_spatial_plane_tracking
رشته نام
XR_EXT_spatial_plane_tracking
نوع افزونه
افزونه نمونه
شماره داخلی ثبتشده
742
بازبینی
1
وضعیت تصویب
تصویبشده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_entity
همیاران
Nihav Jain، Google
Natalie Fleury، Meta
Yuichi Taguchi، Meta
Ron Bessems، Meta
Yin Li، Microsoft
Jimmy Alamparambil، ByteDance
Zhipeng Liu، ByteDance
Jun Yan، ByteDance
نمای کلی
این افزونه براساس XR_EXT_spatial_entity ساخته شده است و قابلیت فضایی ردیابی صفحه را برای چارچوب نهاد فضایی تعریف میکند.
پشتیبانی زمان اجرا
اگر زمان اجرا از ردیابی صفحه پشتیبانی میکند، باید این موضوع را با شمارش XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT در xrEnumerateSpatialCapabilitiesEXT نشان دهد.
پیکربندی
ساختار XrSpatialCapabilityConfigurationPlaneTrackingEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialCapabilityConfigurationPlaneTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationPlaneTrackingEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
capabilityیک XrSpatialCapabilityEXT است و بایدXR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXTباشد. enabledComponentCountیکuint32_tاست که تعداد عناصر را در آرایهenabledComponentsتوصیف میکند.-
enabledComponentsاشارهگری به آرایهای از XrSpatialComponentTypeEXT است.
برنامهها میتوانند قابلیت فضایی XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT را با گنجاندن اشارهگری به ساختار XrSpatialCapabilityConfigurationPlaneTrackingEXT در XrSpatialContextCreateInfoEXT :: capabilityConfigs فعال کنند.
اگر capability XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT نباشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_plane_trackingباید قبلاز استفاده از XrSpatialCapabilityConfigurationPlaneTrackingEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
capabilityباید مقدار XrSpatialCapabilityEXT معتبری باشد -
enabledComponentsباید اشارهگری به آرایهای از مقادیر معتبرenabledComponentCountXrSpatialComponentTypeEXT باشد - پارامتر
enabledComponentCountباید بزرگتر از0باشد
قطعات تضمینشده
زمان اجرایی که از XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT پشتیبانی میکند باید مؤلفههای فضایی زیر را بهعنوان مؤلفههای تضمینشده همه موجودیتهای کشفشده توسط این قابلیت ارائه دهد و باید آنها را در xrEnumerateSpatialCapabilityComponentTypesEXT فهرست کند:
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
عنصر دوبعدی محدودشده
مؤلفه دوبعدی محدودشده، مرکز و حدود صفحهای را که توسط نهاد قرارگرفته روی آن نشان داده میشود ارائه میدهد. برای جزئیات بیشتر، Bounded 2D را ببینید.
عنصر تراز کردن سطح
دادههای مؤلفه
typedef enum XrSpatialPlaneAlignmentEXT {
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT = 0,
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT = 1,
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT = 2,
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT = 3,
XR_SPATIAL_PLANE_ALIGNMENT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneAlignmentEXT;
شمارش XrSpatialPlaneAlignmentEXT تراز صفحه منسوب به موجودیت فضایی را با مؤلفه XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT توصیف میکند.
مقادیر فهرست معانی زیر را دارند:
شرح شمارشی
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT
نهاد افقی است و رو به بالا است (مثلاً کف).
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT
نهاد افقی است و رو به پایین است (مثلاً سقف).
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT
نهاد عمودی است (مثلاً دیوار).
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT
نهاد دارای جهت دلخواه، غیرعمودی، و غیر افقی است.
ساختار فهرست مؤلفه برای پرسمان دادهها
ساختار XrSpatialComponentPlaneAlignmentListEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialComponentPlaneAlignmentListEXT {
XrStructureType type;
void* next;
uint32_t planeAlignmentCount;
XrSpatialPlaneAlignmentEXT* planeAlignments;
} XrSpatialComponentPlaneAlignmentListEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. planeAlignmentCountیکuint32_tاست که تعداد عناصر را در آرایهplaneAlignmentsتوصیف میکند.-
planeAlignmentsآرایهای از XrSpatialPlaneAlignmentEXT است.
برای پرسمان کردن مؤلفه تراز صفحه موجودیتهای فضایی در XrSpatialSnapshotEXT ، XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes اضافه کنید و XrSpatialComponentPlaneAlignmentListEXT را به زنجیره XrSpatialComponentDataQueryResultEXT :: next اضافه کنید.
اگر XrSpatialComponentPlaneAlignmentListEXT در زنجیره XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.
اگر planeAlignmentCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_plane_trackingباید قبلاز استفاده از XrSpatialComponentPlaneAlignmentListEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
planeAlignmentsباید اشارهگری به آرایهای از مقادیرplaneAlignmentCountXrSpatialPlaneAlignmentEXT باشد - پارامتر
planeAlignmentCountباید بزرگتر از0باشد
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT در XrSpatialCapabilityComponentTypesEXT :: componentTypes برای قابلیتی شمارش شده باشد، برنامه میتواند آن را با گنجاندن شمارنده در فهرست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents از ساختار مشتقشده XrSpatialCapabilityConfigurationBaseHeaderEXT مربوط به قابلیتی که از این مؤلفه پشتیبانی میکند فعال کند.
این مؤلفه برای گنجانده شدن در زنجیره XrSpatialCapabilityConfigurationBaseHeaderEXT :: next به پیکربندی خاصی نیاز ندارد.
اجزای اختیاری
زمان اجرایی که از XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT پشتیبانی میکند ممکن است علاوهبر مؤلفههای فهرستشده در بخش مؤلفههای تضمینشده، از مؤلفههای فضایی دیگری نیز پشتیبانی کند. برنامه از xrEnumerateSpatialCapabilityComponentTypesEXT برای دریافت فهرست کامل مؤلفههایی که زمان اجرا پشتیبانی میکند استفاده میکند، سپس مؤلفههایی را که به آنها علاقه دارد هنگام ایجاد بافت فضایی پیکربندی میکند.
عنصر دوبعدی توری
دادههای مؤلفه
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT از ساختار XrSpatialMeshDataEXT برای دادههایش استفاده میکند.
ساختار فهرست مؤلفه برای پرسمان دادهها
ساختار XrSpatialComponentMesh2DListEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialComponentMesh2DListEXT {
XrStructureType type;
void* next;
uint32_t meshCount;
XrSpatialMeshDataEXT* meshes;
} XrSpatialComponentMesh2DListEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. meshCountیکuint32_tاست که تعداد عناصر را در آرایهmeshesتوصیف میکند.-
meshesآرایهای از XrSpatialMeshDataEXT است.
برای پرسمان عنصر دوبعدی مش از موجودیتهای فضایی در XrSpatialSnapshotEXT ، XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes اضافه کنید و XrSpatialComponentMesh2DListEXT را به زنجیره XrSpatialComponentDataQueryResultEXT :: next اضافه کنید.
اگر XrSpatialComponentMesh2DListEXT در زنجیره XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.
اگر meshCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.
برای XrSpatialMeshDataEXT که توسط زمان اجرا در آرایه meshes پر شده است، XrSpatialBufferEXT :: bufferType برای XrSpatialMeshDataEXT :: vertexBuffer باید XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT باشد و XrSpatialBufferEXT :: bufferType برای XrSpatialMeshDataEXT :: indexBuffer باید XR_SPATIAL_BUFFER_TYPE_UINT16_EXT باشد.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_plane_trackingباید قبلاز استفاده از XrSpatialComponentMesh2DListEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
meshesباید اشارهگری به آرایهای از ساختارهایmeshCountXrSpatialMeshDataEXT باشد - پارامتر
meshCountباید بزرگتر از0باشد
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT در XrSpatialCapabilityComponentTypesEXT :: componentTypes برای قابلیتی شمارش شده باشد، برنامه میتواند آن را با گنجاندن شمارنده در فهرست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents از ساختار مشتقشده XrSpatialCapabilityConfigurationBaseHeaderEXT مربوط به قابلیتی که از این مؤلفه پشتیبانی میکند فعال کند.
این مؤلفه برای گنجانده شدن در زنجیره XrSpatialCapabilityConfigurationBaseHeaderEXT :: next به پیکربندی خاصی نیاز ندارد.
عنصر چندضلعی دوبعدی
دادههای مؤلفه
ساختار XrSpatialPolygon2DDataEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialPolygon2DDataEXT {
XrPosef origin;
XrSpatialBufferEXT vertexBuffer;
} XrSpatialPolygon2DDataEXT;
توضیحات عضو
originیک XrPosef است که مبدأ چندضلعی را تعریف میکند. همه رأسهای چندضلعی نسبت به این مبدأ در صفحه X-Y هستند.-
vertexBufferیک XrSpatialBufferEXT است که شناسه میانگیر نوعXR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXTرا ارائه میدهد و میانگیر رأس نهادی را که این مؤلفه روی آن قرار دارد نشان میدهد. رأسها باید بهترتیب پادساعتگرد برگردانده شوند. چندضلعیای که این رأسها نشان میدهند نباید خودمتداخل باشد و میتواند مقعر باشد.
XrSpatialBufferEXT :: bufferType برای vertexBuffer باید XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT باشد.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_plane_trackingباید قبلاز استفاده از XrSpatialPolygon2DDataEXT فعال شود -
vertexBufferباید ساختار XrSpatialBufferEXT معتبری باشد
ساختار فهرست مؤلفه برای پرسمان دادهها
ساختار XrSpatialComponentPolygon2DListEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialComponentPolygon2DListEXT {
XrStructureType type;
void* next;
uint32_t polygonCount;
XrSpatialPolygon2DDataEXT* polygons;
} XrSpatialComponentPolygon2DListEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. polygonCountیکuint32_tاست که تعداد عناصر را در آرایهpolygonsتوصیف میکند.-
polygonsآرایهای از XrSpatialPolygon2DDataEXT است.
برای پرسمان عنصر چندضلعی دوبعدی موجودیتهای فضایی در XrSpatialSnapshotEXT، XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes اضافه کنید و XrSpatialComponentPolygon2DListEXT را به زنجیره XrSpatialComponentDataQueryResultEXT :: next اضافه کنید.
اگر XrSpatialComponentPolygon2DListEXT در زنجیره XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.
اگر polygonCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_plane_trackingباید قبلاز استفاده از XrSpatialComponentPolygon2DListEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
polygonsباید اشارهگری به آرایهای از ساختارهایpolygonCountXrSpatialPolygon2DDataEXT باشد - پارامتر
polygonCountباید بزرگتر از0باشد
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT در XrSpatialCapabilityComponentTypesEXT :: componentTypes برای قابلیتی شمارش شده باشد، برنامه میتواند آن را با گنجاندن شمارنده در فهرست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents از ساختار مشتقشده XrSpatialCapabilityConfigurationBaseHeaderEXT مربوط به قابلیتی که از این مؤلفه پشتیبانی میکند فعال کند.
این مؤلفه برای گنجانده شدن در زنجیره XrSpatialCapabilityConfigurationBaseHeaderEXT :: next به پیکربندی خاصی نیاز ندارد.
برچسب معنایی هواپیما
دادههای مؤلفه
typedef enum XrSpatialPlaneSemanticLabelEXT {
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT = 2,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT = 3,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT = 4,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT = 5,
XR_SPATIAL_PLANE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneSemanticLabelEXT;
شمارش XrSpatialPlaneSemanticLabelEXT مجموعهای از برچسبهای معنایی را برای صفحهها توصیف میکند.
شرح شمارشی
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
زمان اجرا نتوانست این نهاد را طبقهبندی کند.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT
نهاد طبقه است.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT
نهاد دیوار است.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT
نهاد سقف است.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT
نهاد جدول است.
ساختار فهرست مؤلفه برای پُرسمان دادهها
ساختار XrSpatialComponentPlaneSemanticLabelListEXT بهصورت زیر تعریف میشود:
typedef struct XrSpatialComponentPlaneSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialPlaneSemanticLabelEXT* semanticLabels;
} XrSpatialComponentPlaneSemanticLabelListEXT;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. semanticLabelCountیکuint32_tاست که تعداد عناصر را در آرایهsemanticLabelsتوصیف میکند.-
semanticLabelsآرایهای از XrSpatialPlaneSemanticLabelEXT است.
برای پرسمان عنصر برچسب معنایی صفحه از نهادهای فضایی در XrSpatialSnapshotEXT، XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes اضافه کنید و XrSpatialComponentPlaneSemanticLabelListEXT را به زنجیره XrSpatialComponentDataQueryResultEXT :: next اضافه کنید.
اگر XrSpatialComponentPlaneSemanticLabelListEXT در زنجیره بعدی XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.
اگر semanticLabelCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_EXT_spatial_plane_trackingباید قبلاز استفاده از XrSpatialComponentPlaneSemanticLabelListEXT فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXTباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
semanticLabelsباید اشارهگری به آرایهای از مقادیرsemanticLabelCountXrSpatialPlaneSemanticLabelEXT باشد - پارامتر
semanticLabelCountباید بزرگتر از0باشد
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT در XrSpatialCapabilityComponentTypesEXT :: componentTypes برای قابلیتی شمارش شده باشد، برنامه میتواند آن را با گنجاندن شمارنده در فهرست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents از ساختار مشتقشده XrSpatialCapabilityConfigurationBaseHeaderEXT مربوط به قابلیتی که از این مؤلفه پشتیبانی میکند فعال کند.
این مؤلفه برای گنجانده شدن در زنجیره XrSpatialCapabilityConfigurationBaseHeaderEXT :: next به پیکربندی خاصی نیاز ندارد.
کد نمونه
پیکربندی قابلیت ردیابی هواپیما
کد نمونه زیر نحوه پیکربندی قابلیت ردیابی صفحه را هنگام ایجاد بافت فضایی نشان میدهد.
// Check if plane tracking capability is supported
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
return;
}
// Enumerate supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT planeComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
std::vector<XrSpatialComponentTypeEXT> planeCapabilityComponents(planeComponents.componentTypeCountOutput);
planeComponents.componentTypeCapacityInput = planeCapabilityComponents.size();
planeComponents.componentTypes = planeCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
// Check if polygon 2D and plane semantic labels optional components are supported
const auto supportsComponent = [&planeCapabilityComponents](XrSpatialComponentTypeEXT component) {
return std::find(planeCapabilityComponents.begin(), planeCapabilityComponents.end(), component) != planeCapabilityComponents.end();
};
const bool supportsPolygon2DComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
const bool supportsSemanticLabelComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
// Create a spatial context
XrSpatialContextEXT spatialContext{};
// Enable the 2 guaranteed components of the plane tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
// Optionally enable polygon2D if it is supported
if (supportsPolygon2DComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
// Optionally enable semantic labels if it is supported
if (supportsSemanticLabelComponent) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
}
XrSpatialCapabilityConfigurationPlaneTrackingEXT planeConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT};
planeConfig.capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT;
planeConfig.enabledComponentCount = enabledComponents.size();
planeConfig.enabledComponents = enabledComponents.data();
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&planeConfig),
};
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));
waitUntilReady(createContextFuture);
XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
return;
}
spatialContext = completion.spatialContext;
// ...
// Discover entities with the spatial context
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
کاوش نهادهای فضایی و دادههای مؤلفه پُرسمان
کد نمونه زیر نشان میدهد که چگونه میتوان موجودیتهای فضایی را برای زمینهای که با XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT پیکربندی شده است کشف کرد و دادههای مؤلفه آن را پُرسمان کرد.
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
if (supportsPolygon2DComponent) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
if (supportsSemanticLabelComponent) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrSpatialBounded2DDataEXT> bounded2D(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT bounded2DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
bounded2DList.boundCount = bounded2D.size();
bounded2DList.bounds = bounded2D.data();
queryResult.next = &bounded2DList;
std::vector<XrSpatialPolygon2DDataEXT> polygons;
XrSpatialComponentPolygon2DListEXT polygonList{XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT};
if (supportsPolygon2DComponent) {
polygons.resize(queryResult.entityIdCountOutput);
polygonList.polygonCount = polygons.size();
polygonList.polygons = polygons.data();
polygonList.next = queryResult.next;
queryResult.next = &polygonList;
}
std::vector<XrSpatialPlaneSemanticLabelEXT> semanticLabels;
XrSpatialComponentPlaneSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT};
if (supportsSemanticLabelComponent) {
semanticLabels.resize(queryResult.entityIdCountOutput);
semanticLabelsList.semanticLabelCount = semanticLabels.size();
semanticLabelsList.semanticLabels = semanticLabels.data();
semanticLabelsList.next = queryResult.next;
queryResult.next = &semanticLabelsList;
}
CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
if (entityStates[i] != XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
continue;
}
// 2D bounds for entity entityIds[i] is bounded2D[i].extents centered on bounded2D[i].center.
if (supportsPolygon2DComponent) {
// 2D polygon for entity entityIds[i] is the buffer represented by polygons[i].bufferId.
// Application uses flink:xrGetSpatialBufferVector2fEXT to get the buffer data.
}
if (supportsSemanticLabelComponent) {
// semantic label for entity entityIds[i] is semanticLabels[i].
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
}
};
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
XrResult result = xrPollEvent(instance, &event);
if (result == XR_SUCCESS) {
switch (event.type) {
case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
*reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
// Discover spatial entities for the context that we received the "discovery
// recommended" event for.
discoverSpatialEntities(eventdata.spatialContext, time);
break;
}
}
}
// ...
// Finish frame loop
// ...
}
سازههای جدید
- XrSpatialCapabilityConfigurationPlaneTrackingEXT
- XrSpatialPolygon2DDataEXT
درحال گسترش دادن XrSpatialComponentDataQueryResultEXT :
Enums جدید
ثابتهای شمارشی جدید
XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_plane_tracking_SPEC_VERSIONدرحال گسترش دادن XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
درحال گسترش دادن XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
درحال گسترش دادن XrStructureType :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT
مشکلات
سابقه نسخه
بازبینی ۱، ۲۰۲۴/۰۷/۰۲ (Nihav Jain، Google)
- شرح اولیه افزونه