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;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫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_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT پشتیبانی می‌کند باید مؤلفه‌های فضایی زیر را به‌عنوان مؤلفه‌های تضمین‌شده همه موجودیت‌های کشف‌شده توسط این قابلیت ارائه دهد و باید آن‌ها را در xrEnumerateSpatialCapabilityComponentTypesEXT فهرست کند:

  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
  • XR_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;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫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_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;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫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 باید اشاره‌گری به آرایه‌ای از ساختارهای meshCount XrSpatialMeshDataEXT باشد
  • پارامتر 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 باشد.

استفاده معتبر (ضمنی)

ساختار فهرست مؤلفه برای پرسمان داده‌ها

ساختار XrSpatialComponentPolygon2DListEXT به‌صورت زیر تعریف می‌شود:

typedef struct XrSpatialComponentPolygon2DListEXT {
    XrStructureType               type;
    void*                         next;
    uint32_t                      polygonCount;
    XrSpatialPolygon2DDataEXT*    polygons;
} XrSpatialComponentPolygon2DListEXT;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫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_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;

توضیحات عضو

  • type XrStructureType این ساختار است.
  • ‫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_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
  // ...
}

سازه‌های جدید

Enums جدید

ثابت‌های شمارشی جدید

  • 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

مشکلات

سابقه نسخه

  • بازبینی ۱، ۲۰۲۴/۰۷/۰۲ (Nihav Jain،‏ Google)

    • شرح اولیه افزونه