ردیابی فضایی صفحه‌ای 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 این ساختار است.
  • 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

کامپوننت دوبعدی محدود

مولفه دوبعدی محدود، مرکز و محدوده صفحه‌ای را که توسط موجودیتی که روی آن قرار دارد، نمایش داده می‌شود، فراهم می‌کند. برای جزئیات بیشتر به بخش دوبعدی محدود مراجعه کنید.

کامپوننت ترازبندی صفحه

داده‌های کامپوننت

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 را به زنجیره 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_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 این ساختار است.
  • next NULL یا اشاره‌گری به ساختار بعدی در یک زنجیره ساختار است.
  • 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_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 باشد.

کاربرد معتبر (ضمنی)

ساختار لیست کامپوننت برای پرس و جو از داده‌ها

ساختار 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 را به زنجیره 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_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 این ساختار است.
  • next NULL یا اشاره‌گری به ساختار بعدی در یک زنجیره ساختار است.
  • 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_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

مسائل

تاریخچه نسخه

  • نسخه ۱، ۲۰۲۴-۰۷-۰۲ (نیهاو جین، گوگل)

    • توضیحات اولیه افزونه