XR_EXT_spatial_plane_tracking
String Nama
XR_EXT_spatial_plane_tracking
Jenis Ekstensi
Ekstensi instance
Nomor Ekstensi Terdaftar
742
Revisi
1
Status Ratifikasi
Diratifikasi
Dependensi Ekstensi dan Versi
XR_EXT_spatial_entity
Kontributor
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Ringkasan
Ekstensi ini dibuat berdasarkan XR_EXT_spatial_entity dan menentukan kemampuan spasial pelacakan bidang untuk framework entity spasial.
Dukungan Runtime
Jika runtime mendukung pelacakan bidang, runtime harus menunjukkannya dengan menghitung XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT dalam xrEnumerateSpatialCapabilitiesEXT .
Konfigurasi
Struktur XrSpatialCapabilityConfigurationPlaneTrackingEXT ditentukan sebagai:
typedef struct XrSpatialCapabilityConfigurationPlaneTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationPlaneTrackingEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.capabilityadalah XrSpatialCapabilityEXT dan harus berupaXR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT.enabledComponentCountadalahuint32_tyang menjelaskan jumlah elemen dalam arrayenabledComponents.enabledComponentsadalah pointer ke array XrSpatialComponentTypeEXT .
Aplikasi dapat mengaktifkan kemampuan spasial XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT dengan menyertakan pointer ke struktur XrSpatialCapabilityConfigurationPlaneTrackingEXT di XrSpatialContextCreateInfoEXT :: capabilityConfigs .
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE jika capability bukan XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_plane_trackingharus diaktifkan sebelum menggunakan XrSpatialCapabilityConfigurationPlaneTrackingEXT -
typeharus berupaXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
capabilityharus berupa nilai XrSpatialCapabilityEXT yang valid -
enabledComponentsmust berupa pointer ke array nilaienabledComponentCountXrSpatialComponentTypeEXT yang valid - Parameter
enabledComponentCountharus lebih besar dari0
Komponen yang Dijamin
Runtime yang mendukung XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT harus menyediakan komponen spasial berikut sebagai komponen terjamin dari semua entitas yang ditemukan oleh kemampuan ini dan harus mencantumkannya di xrEnumerateSpatialCapabilityComponentTypesEXT :
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
Komponen 2D Terikat
Komponen 2D yang dibatasi memberikan pusat dan luas bidang yang diwakili oleh entitas yang ada di dalamnya. Lihat Bounded 2D untuk mengetahui detail selengkapnya.
Komponen Penyelarasan Bidang
Data komponen
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;
Enumerasi XrSpatialPlaneAlignmentEXT menjelaskan perataan bidang yang terkait dengan entitas spasial dengan komponen XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT.
Nilai enumerasi memiliki arti berikut:
Deskripsi Enum
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT
Entitas bersifat horizontal dan menghadap ke atas (misalnya, lantai).
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT
Entitas horizontal dan menghadap ke bawah (misalnya, langit-langit).
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT
Entitasnya vertikal (misalnya, dinding).
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT
Entitas memiliki orientasi yang arbitrer, tidak vertikal, dan tidak horizontal.
Struktur daftar komponen untuk membuat kueri data
Struktur XrSpatialComponentPlaneAlignmentListEXT ditentukan sebagai:
typedef struct XrSpatialComponentPlaneAlignmentListEXT {
XrStructureType type;
void* next;
uint32_t planeAlignmentCount;
XrSpatialPlaneAlignmentEXT* planeAlignments;
} XrSpatialComponentPlaneAlignmentListEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.planeAlignmentCountadalahuint32_tyang menjelaskan jumlah elemen dalam arrayplaneAlignments.planeAlignmentsadalah array XrSpatialPlaneAlignmentEXT .
Untuk mengkueri komponen penyelarasan bidang entitas spasial dalam XrSpatialSnapshotEXT , sertakan XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentPlaneAlignmentListEXT ke rantai XrSpatialComponentDataQueryResultEXT :: next.
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentPlaneAlignmentListEXT ada dalam rantai XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika planeAlignmentCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_plane_trackingharus diaktifkan sebelum menggunakan XrSpatialComponentPlaneAlignmentListEXT -
typeharus berupaXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
planeAlignmentsharus berupa pointer ke array nilaiplaneAlignmentCountXrSpatialPlaneAlignmentEXT - Parameter
planeAlignmentCountharus lebih besar dari0
Konfigurasi
Jika XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT dicantumkan dalam XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumeran dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur turunan XrSpatialCapabilityConfigurationBaseHeaderEXT dari kemampuan yang mendukung komponen ini.
Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
Komponen Opsional
Runtime yang mendukung XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT dapat mendukung komponen spasial lain selain yang tercantum di bagian Komponen yang Dijamin. Aplikasi menggunakan xrEnumerateSpatialCapabilityComponentTypesEXT untuk mendapatkan daftar lengkap komponen yang didukung runtime, lalu mengonfigurasi komponen yang diinginkannya saat membuat konteks spasial.
Komponen Mesh 2D
Data komponen
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT menggunakan struktur XrSpatialMeshDataEXT untuk datanya.
Struktur daftar komponen untuk membuat kueri data
Struktur XrSpatialComponentMesh2DListEXT ditentukan sebagai:
typedef struct XrSpatialComponentMesh2DListEXT {
XrStructureType type;
void* next;
uint32_t meshCount;
XrSpatialMeshDataEXT* meshes;
} XrSpatialComponentMesh2DListEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.meshCountadalahuint32_tyang menjelaskan jumlah elemen dalam arraymeshes.meshesadalah array XrSpatialMeshDataEXT .
Untuk membuat kueri komponen 2D mesh entitas spasial dalam XrSpatialSnapshotEXT , sertakan XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentMesh2DListEXT ke rantai XrSpatialComponentDataQueryResultEXT :: next.
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentMesh2DListEXT ada dalam rantai XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika meshCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Untuk XrSpatialMeshDataEXT yang diisi oleh runtime dalam array meshes, XrSpatialBufferEXT :: bufferType untuk XrSpatialMeshDataEXT :: vertexBuffer harus berupa XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT dan XrSpatialBufferEXT :: bufferType untuk XrSpatialMeshDataEXT :: indexBuffer harus berupa XR_SPATIAL_BUFFER_TYPE_UINT16_EXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_plane_trackingharus diaktifkan sebelum menggunakan XrSpatialComponentMesh2DListEXT -
typeharus berupaXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
meshesharus berupa pointer ke array strukturmeshCountXrSpatialMeshDataEXT - Parameter
meshCountharus lebih besar dari0
Konfigurasi
Jika XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT dicantumkan dalam XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumeran dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur turunan XrSpatialCapabilityConfigurationBaseHeaderEXT dari kemampuan yang mendukung komponen ini.
Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
Komponen 2D Poligon
Data Komponen
Struktur XrSpatialPolygon2DDataEXT ditentukan sebagai:
typedef struct XrSpatialPolygon2DDataEXT {
XrPosef origin;
XrSpatialBufferEXT vertexBuffer;
} XrSpatialPolygon2DDataEXT;
Deskripsi Anggota
originadalah XrPosef yang menentukan asal poligon. Semua verteks poligon bersifat relatif terhadap asal ini dalam bidang X-Y.vertexBufferadalah XrSpatialBufferEXT yang menyediakan ID untuk buffer jenisXR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXTdan merepresentasikan buffer vertex entity tempat komponen ini berada. Verteks harus ditampilkan dalam urutan berlawanan arah jarum jam. Poligon yang diwakili oleh verteks ini tidak boleh bersimpangan sendiri dan dapat cekung.
XrSpatialBufferEXT :: bufferType untuk vertexBuffer harus berupa XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_plane_trackingharus diaktifkan sebelum menggunakan XrSpatialPolygon2DDataEXT -
vertexBufferharus berupa struktur XrSpatialBufferEXT yang valid
Struktur daftar komponen untuk membuat kueri data
Struktur XrSpatialComponentPolygon2DListEXT ditentukan sebagai:
typedef struct XrSpatialComponentPolygon2DListEXT {
XrStructureType type;
void* next;
uint32_t polygonCount;
XrSpatialPolygon2DDataEXT* polygons;
} XrSpatialComponentPolygon2DListEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.polygonCountadalahuint32_tyang menjelaskan jumlah elemen dalam arraypolygons.polygonsadalah array XrSpatialPolygon2DDataEXT .
Untuk mengkueri komponen 2D poligon entitas spasial dalam XrSpatialSnapshotEXT , sertakan XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentPolygon2DListEXT ke rantai XrSpatialComponentDataQueryResultEXT :: next.
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentPolygon2DListEXT ada dalam rantai XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika polygonCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_plane_trackingharus diaktifkan sebelum menggunakan XrSpatialComponentPolygon2DListEXT -
typeharus berupaXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
polygonsharus berupa pointer ke array strukturpolygonCountXrSpatialPolygon2DDataEXT - Parameter
polygonCountharus lebih besar dari0
Konfigurasi
Jika XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT dicantumkan dalam XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumeran dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur turunan XrSpatialCapabilityConfigurationBaseHeaderEXT dari kemampuan yang mendukung komponen ini.
Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
Label Semantik Pesawat
Data Komponen
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;
Enumerasi XrSpatialPlaneSemanticLabelEXT menjelaskan sekumpulan label semantik untuk bidang.
Deskripsi Enum
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
Runtime tidak dapat mengklasifikasikan entitas ini.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT
Entitas adalah lantai.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT
Entitasnya adalah dinding.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT
Entitasnya adalah langit-langit.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT
Entitas adalah tabel.
Struktur Daftar Komponen untuk Mengueri Data
Struktur XrSpatialComponentPlaneSemanticLabelListEXT ditentukan sebagai:
typedef struct XrSpatialComponentPlaneSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialPlaneSemanticLabelEXT* semanticLabels;
} XrSpatialComponentPlaneSemanticLabelListEXT;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.semanticLabelCountadalahuint32_tyang menjelaskan jumlah elemen dalam arraysemanticLabels.semanticLabelsadalah array XrSpatialPlaneSemanticLabelEXT .
Untuk mengkueri komponen label semantik bidang entitas spasial dalam XrSpatialSnapshotEXT , sertakan XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentPlaneSemanticLabelListEXT ke rantai XrSpatialComponentDataQueryResultEXT :: next.
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentPlaneSemanticLabelListEXT ada di rantai XrSpatialComponentDataQueryResultEXT berikutnya :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika semanticLabelCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_EXT_spatial_plane_trackingharus diaktifkan sebelum menggunakan XrSpatialComponentPlaneSemanticLabelListEXT -
typeharus berupaXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
semanticLabelsharus berupa pointer ke array nilaisemanticLabelCountXrSpatialPlaneSemanticLabelEXT - Parameter
semanticLabelCountharus lebih besar dari0
Konfigurasi
Jika XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT dicantumkan dalam XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan enumeran dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents dari struktur turunan XrSpatialCapabilityConfigurationBaseHeaderEXT dari kemampuan yang mendukung komponen ini.
Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
Kode Contoh
Mengonfigurasi Kemampuan Pelacakan Bidang
Contoh kode berikut menunjukkan cara mengonfigurasi kemampuan pelacakan bidang saat membuat konteks spasial.
// 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));
Menemukan Entitas Spasial & Data Komponen Kueri
Contoh kode berikut menunjukkan cara menemukan entitas spasial untuk konteks yang dikonfigurasi dengan XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT dan mengkueri data komponennya.
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
// ...
}
Struktur Baru
- XrSpatialCapabilityConfigurationPlaneTrackingEXT
- XrSpatialPolygon2DDataEXT
Memperluas XrSpatialComponentDataQueryResultEXT :
Enum Baru
Konstanta Enum Baru
XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_plane_tracking_SPEC_VERSIONMemperluas XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
Memperluas 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
Memperluas 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
Masalah
Riwayat Versi
Revisi 1, 02-07-2024 (Nihav Jain, Google)
- Deskripsi ekstensi awal