ردیابی فضایی صفحهای XR_EXT
رشته نام
XR_EXT_spatial_plane_tracking
نوع افزونه
افزونه نمونه
شماره داخلی ثبت شده
۷۴۲ عدد
بازنگری
۱
وضعیت تصویب
تصویب شده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_entity
مشارکتکنندگان
نیهاو جین، گوگل
ناتالی فلوری، متا
یویچی تاگوچی، متا
ران بسمس، متا
یین لی، مایکروسافت
جیمی آلمپارامبیل، بایتدنس
ژیپنگ لیو، 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;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
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باید اشارهگری به آرایهای ازenabledComponentCountبا مقادیر معتبر XrSpatialComponentTypeEXT باشد. - پارامتر
enabledComponentCountباید بزرگتر از0باشد.
قطعات تضمین شده
یک زمان اجرا که از XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT پشتیبانی میکند، باید اجزای مکانی زیر را به عنوان اجزای تضمینشدهی تمام موجودیتهای کشفشده توسط این قابلیت ارائه دهد و آنها را در xrEnumerateSpatialCapabilityComponentTypesEXT شمارش کند :
-
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT -
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
کامپوننت دوبعدی محدود
مولفه دوبعدی محدود، مرکز و محدوده صفحهای را که توسط موجودیتی که روی آن قرار دارد، نمایش داده میشود، فراهم میکند. برای جزئیات بیشتر به بخش دوبعدی محدود مراجعه کنید.
کامپوننت ترازبندی صفحه
دادههای کامپوننت
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;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
planeAlignmentCountیکuint32_tاست که تعداد عناصر موجود در آرایهplaneAlignmentsتوصیف میکند. -
planeAlignmentsآرایهای از XrSpatialPlaneAlignmentEXT است.
برای پرسوجوی مؤلفه ترازبندی صفحهای موجودیتهای مکانی در XrSpatialSnapshotEXT ، XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes وارد کنید و XrSpatialComponentPlaneAlignmentListEXT را به زنجیره next XrSpatialComponentDataQueryResultEXT :: اضافه کنید.
اگر XrSpatialComponentPlaneAlignmentListEXT در زنجیره next XrSpatialComponentDataQueryResultEXT :: باشد اما 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 از قابلیتی که از این مولفه پشتیبانی میکند، آن را فعال کند.
این کامپوننت برای قرار گرفتن در زنجیره next XrSpatialCapabilityConfigurationBaseHeaderEXT :: نیازی به پیکربندی خاصی ندارد.
اجزای اختیاری
یک زمان اجرا که از 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;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
meshCountیکuint32_tاست که تعداد عناصر موجود در آرایهmeshesرا توصیف میکند. -
meshesآرایهای از XrSpatialMeshDataEXT است.
برای جستجوی مؤلفهی دوبعدی مشِ موجودیتهای مکانی در XrSpatialSnapshotEXT ، XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes وارد کنید و XrSpatialComponentMesh2DListEXT را به زنجیرهی next XrSpatialComponentDataQueryResultEXT :: اضافه کنید.
اگر XrSpatialComponentMesh2DListEXT در زنجیره next XrSpatialComponentDataQueryResultEXT :: باشد اما 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 از قابلیتی که از این مولفه پشتیبانی میکند، آن را فعال کند.
این کامپوننت برای قرار گرفتن در زنجیره next XrSpatialCapabilityConfigurationBaseHeaderEXT :: نیازی به پیکربندی خاصی ندارد.
کامپوننت دوبعدی چندضلعی
دادههای کامپوننت
ساختار XrSpatialPolygon2DDataEXT به صورت زیر تعریف میشود:
typedef struct XrSpatialPolygon2DDataEXT {
XrPosef origin;
XrSpatialBufferEXT vertexBuffer;
} XrSpatialPolygon2DDataEXT;
توضیحات اعضا
-
originیک XrPosef است که مبدأ چندضلعی را تعریف میکند. تمام رئوس چندضلعی نسبت به این مبدأ در صفحه XY هستند. -
vertexBufferیک XrSpatialBufferEXT است که شناسه (ID) را برای بافری از نوع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;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
polygonCountیکuint32_tاست که تعداد عناصر موجود در آرایهpolygonsرا توصیف میکند. -
polygonsآرایهای از XrSpatialPolygon2DDataEXT است.
برای جستجوی مولفه چندضلعی دوبعدی از موجودیتهای مکانی در XrSpatialSnapshotEXT ، XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes وارد کنید و XrSpatialComponentPolygon2DListEXT را به زنجیره next XrSpatialComponentDataQueryResultEXT :: اضافه کنید.
اگر XrSpatialComponentPolygon2DListEXT در زنجیره next XrSpatialComponentDataQueryResultEXT :: باشد اما 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 از قابلیتی که از این مولفه پشتیبانی میکند، آن را فعال کند.
این کامپوننت برای قرار گرفتن در زنجیره next XrSpatialCapabilityConfigurationBaseHeaderEXT :: نیازی به پیکربندی خاصی ندارد.
برچسب معنایی صفحهای
دادههای کامپوننت
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;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
semanticLabelCountیکuint32_tاست که تعداد عناصر موجود در آرایهsemanticLabelsرا توصیف میکند. -
semanticLabelsآرایهای از XrSpatialPlaneSemanticLabelEXT است.
برای جستجوی مؤلفه برچسب معنایی صفحه مربوط به موجودیتهای مکانی در XrSpatialSnapshotEXT ، XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT را در XrSpatialComponentDataQueryConditionEXT :: componentTypes وارد کنید و XrSpatialComponentPlaneSemanticLabelListEXT را به زنجیره next XrSpatialComponentDataQueryResultEXT :: اضافه کنید.
اگر XrSpatialComponentPlaneSemanticLabelListEXT در زنجیره بعدی XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE از xrQuerySpatialSpatialComponentDataEXT بازگرداند.
اگر 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 از قابلیتی که از این مولفه پشتیبانی میکند، آن را فعال کند.
این کامپوننت برای قرار گرفتن در زنجیره next XrSpatialCapabilityConfigurationBaseHeaderEXT :: نیازی به پیکربندی خاصی ندارد.
کد مثال
پیکربندی قابلیت ردیابی هواپیما
کد مثال زیر نحوه پیکربندی قابلیت ردیابی صفحه را هنگام ایجاد یک زمینه مکانی نشان میدهد.
// 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));
کشف موجودیتهای مکانی و جستجوی دادههای کامپوننت
کد مثال زیر نحوهی کشف موجودیتهای مکانی برای یک context پیکربندیشده با 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
// ...
}
سازههای جدید
Enum های جدید
ثابتهای شمارشی جدید
-
XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAME -
XR_EXT_spatial_plane_tracking_SPEC_VERSION گسترش XrSpatialCapabilityEXT :
-
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
-
بسط XrSpatialComponentTypeEXT :
-
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT -
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT -
XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT -
XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
-
گسترش XrStructureType :
-
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT -
XR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT -
XR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXT -
XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT -
XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT
-
مسائل
تاریخچه نسخه
نسخه ۱، ۲۰۲۴-۰۷-۰۲ (نیهاو جین، گوگل)
- توضیحات اولیه افزونه