XR_EXT_spatial_plane_tracking
Name String
XR_EXT_spatial_plane_tracking
Uzantı Türü
Örnek uzantısı
Kayıtlı Uzantı Numarası
742
Düzeltme
1
Onay durumu
Onaylanma tarihi
Uzantı ve Sürüm Bağımlılıkları
XR_EXT_spatial_entity
Katkıda bulunanlar
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Genel Bakış
Bu uzantı, XR_EXT_spatial_entity üzerine kuruludur ve uzamsal varlık çerçevesi için düzlem izleme uzamsal özelliğini tanımlar.
Çalışma Zamanı Desteği
Çalışma zamanı düzlem izlemeyi destekliyorsa xrEnumerateSpatialCapabilitiesEXT içinde XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT öğesini numaralandırarak bunu belirtmelidir .
Yapılandırma
XrSpatialCapabilityConfigurationPlaneTrackingEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialCapabilityConfigurationPlaneTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationPlaneTrackingEXT;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.capability, XrSpatialCapabilityEXT ve zorunlu olmalıdırXR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT.enabledComponentCount,enabledComponentsdizisindeki öğelerin sayısını açıklayan biruint32_t'dir.enabledComponents, XrSpatialComponentTypeEXT dizisine yönelik bir işaretçidir .
Uygulamalar, XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde XrSpatialCapabilityConfigurationPlaneTrackingEXT yapısına bir işaretçi ekleyerek XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT uzamsal capability nesnesini etkinleştirebilir .
Çalışma zamanı, capability değeri XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT değilse XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir .
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_plane_trackinguzantısı, XrSpatialCapabilityConfigurationPlaneTrackingEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır. -
enabledComponentsenabledComponentCountgeçerli XrSpatialComponentTypeEXT değerlerinden oluşan bir dizinin işaretçisi olmalıdır. -
enabledComponentCountparametresi0değerinden büyük olmalıdır.
Garantili Bileşenler
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT destekleyen bir çalışma zamanı, bu özellik tarafından keşfedilen tüm varlıkların garantili bileşenleri olarak aşağıdaki uzamsal bileşenleri sağlamalı ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT içinde numaralandırmalıdır :
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
Sınırlanmış 2D Bileşen
Sınırlanmış 2D bileşen, üzerinde bulunduğu öğe tarafından temsil edilen düzlemin merkezini ve kapsamlarını sağlar. Daha fazla bilgi için Sınırlı 2D bölümüne bakın.
Düzlem Hizalama Bileşeni
Bileşen verileri
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 numaralandırması, uzamsal öğeyle ilişkili düzlemin XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT bileşeniyle hizalanmasını açıklar.
Numaralandırma değerleri aşağıdaki anlamlara sahiptir:
Enum Açıklaması
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT
Varlık yataydır ve yukarıya (ör. zemin) bakar.
XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT
Varlık yataydır ve aşağıya bakar (ör. tavan).
XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT
Öğe dikey (ör. duvar) olmalıdır.
XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT
Öğenin rastgele, dikey ve yatay olmayan bir yönü var.
Verilere sorgu uygulamak için bileşen listesi yapısı
XrSpatialComponentPlaneAlignmentListEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialComponentPlaneAlignmentListEXT {
XrStructureType type;
void* next;
uint32_t planeAlignmentCount;
XrSpatialPlaneAlignmentEXT* planeAlignments;
} XrSpatialComponentPlaneAlignmentListEXT;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.planeAlignmentCount,planeAlignmentsdizisindeki öğelerin sayısını açıklayan biruint32_t'dir.planeAlignments, XrSpatialPlaneAlignmentEXT dizisidir .
XrSpatialSnapshotEXT içindeki uzamsal öğelerin düzlem hizalama bileşenini sorgulamak için XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT öğesini XrSpatialComponentDataQueryConditionEXT :: componentTypes içine ekleyin ve XrSpatialComponentPlaneAlignmentListEXT öğesini XrSpatialComponentDataQueryResultEXT :: next zincirine ekleyin.
Çalışma zamanı, XrSpatialComponentPlaneAlignmentListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa xrQuerySpatialComponentDataEXT'den XR_ERROR_VALIDATION_FAILURE döndürmelidir.
Çalışma zamanı, planeAlignmentCount değeri XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse xrQuerySpatialComponentDataEXT işlevinden XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir .
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_plane_trackinguzantısı, XrSpatialComponentPlaneAlignmentListEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
planeAlignmentsplaneAlignmentCountXrSpatialPlaneAlignmentEXT değerleri dizisine yönelik bir işaretçi olmalıdır. -
planeAlignmentCountparametresi0değerinden büyük olmalıdır.
Yapılandırma
Bazı özellikler için XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT, XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde numaralandırılıyorsa bir uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırılmış değeri ekleyerek bu özelliği etkinleştirebilir.
Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.
İsteğe Bağlı Bileşenler
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT destekleyen bir çalışma zamanı, Garantili Bileşenler bölümünde listelenenlerin yanı sıra diğer uzamsal bileşenleri de destekleyebilir. Bir uygulama, çalışma zamanının desteklediği bileşenlerin tam listesini almak için xrEnumerateSpatialCapabilityComponentTypesEXT'yi kullanır, ardından uzamsal bağlamı oluştururken ilgilendiği bileşenleri yapılandırır.
Mesh 2D Bileşeni
Bileşen verileri
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT, verileri için XrSpatialMeshDataEXT yapısını kullanır.
Verilere sorgu uygulamak için bileşen listesi yapısı
XrSpatialComponentMesh2DListEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialComponentMesh2DListEXT {
XrStructureType type;
void* next;
uint32_t meshCount;
XrSpatialMeshDataEXT* meshes;
} XrSpatialComponentMesh2DListEXT;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.meshCount,meshesdizisindeki öğelerin sayısını açıklayan biruint32_t'dir.meshes, XrSpatialMeshDataEXT dizisidir .
XrSpatialSnapshotEXT içindeki uzamsal öğelerin örgü 2D bileşenini sorgulamak için XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT öğesini XrSpatialComponentDataQueryConditionEXT :: componentTypes içine ekleyin ve XrSpatialComponentMesh2DListEXT öğesini XrSpatialComponentDataQueryResultEXT :: next zincirine ekleyin.
Çalışma zamanı, XrSpatialComponentMesh2DListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa xrQuerySpatialComponentDataEXT'den XR_ERROR_VALIDATION_FAILURE döndürmelidir .
Çalışma zamanı, meshCount değeri XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse xrQuerySpatialComponentDataEXT işlevinden XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir .
Çalışma zamanında meshes dizisinde doldurulan XrSpatialMeshDataEXT için XrSpatialBufferEXT :: bufferType XrSpatialMeshDataEXT :: vertexBuffer XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT olmalı ve XrSpatialBufferEXT :: bufferType XrSpatialMeshDataEXT :: indexBuffer XR_SPATIAL_BUFFER_TYPE_UINT16_EXT olmalıdır .
Geçerli Kullanım (Dolaylı)
- XrSpatialComponentMesh2DListEXT kullanılmadan önce
XR_EXT_spatial_plane_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya geçerli bir işaretçi olmalıdır. -
meshesmeshCountXrSpatialMeshDataEXT yapılarının dizisine yönelik bir işaretçi olmalıdır. -
meshCountparametresi0değerinden büyük olmalıdır.
Yapılandırma
Bazı özellikler için XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT, XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde numaralandırılıyorsa bir uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırılmış değeri ekleyerek bu özelliği etkinleştirebilir.
Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.
Poligon 2D Bileşeni
Bileşen Verileri
XrSpatialPolygon2DDataEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialPolygon2DDataEXT {
XrPosef origin;
XrSpatialBufferEXT vertexBuffer;
} XrSpatialPolygon2DDataEXT;
Üye Açıklamaları
origin, poligonun başlangıcını tanımlayan bir XrPosef'dir. Çokgenin tüm köşeleri, X-Y düzleminde bu kaynağa göre belirlenir.vertexBuffer,XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXTtüründe bir arabelleğin kimliğini sağlayan ve bu bileşenin bulunduğu varlığın köşe arabelleğini temsil eden bir XrSpatialBufferEXT'dir. Köşeler saat yönünün tersine sırada döndürülmelidir. Bu köşelerle temsil edilen poligon kendi kendini kesmemeli ve içbükey olabilir.
XrSpatialBufferEXT :: bufferType for vertexBuffer must be XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT .
Geçerli Kullanım (Dolaylı)
- XrSpatialPolygon2DDataEXT kullanılmadan önce
XR_EXT_spatial_plane_trackinguzantısı etkinleştirilmelidir. -
vertexBuffergeçerli bir XrSpatialBufferEXT yapısı olmalıdır.
Verilere sorgu uygulamak için bileşen listesi yapısı
XrSpatialComponentPolygon2DListEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialComponentPolygon2DListEXT {
XrStructureType type;
void* next;
uint32_t polygonCount;
XrSpatialPolygon2DDataEXT* polygons;
} XrSpatialComponentPolygon2DListEXT;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.polygonCount,polygonsdizisindeki öğelerin sayısını açıklayan biruint32_t'dir.polygons, XrSpatialPolygon2DDataEXT dizisidir .
XrSpatialSnapshotEXT içindeki uzamsal öğelerin poligon 2D bileşenini sorgulamak için XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT öğesini XrSpatialComponentDataQueryConditionEXT :: componentTypes içine ekleyin ve XrSpatialComponentPolygon2DListEXT öğesini XrSpatialComponentDataQueryResultEXT :: next zincirine ekleyin.
Çalışma zamanı, XrSpatialComponentPolygon2DListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa xrQuerySpatialComponentDataEXT'den XR_ERROR_VALIDATION_FAILURE döndürmelidir .
Çalışma zamanı, polygonCount değeri XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse xrQuerySpatialComponentDataEXT işlevinden XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir .
Geçerli Kullanım (Dolaylı)
- XrSpatialComponentPolygon2DListEXT kullanılmadan önce
XR_EXT_spatial_plane_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
polygonspolygonCountXrSpatialPolygon2DDataEXT yapılarının dizisine yönelik bir işaretçi olmalıdır. -
polygonCountparametresi0değerinden büyük olmalıdır.
Yapılandırma
Bazı özellikler için XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT, XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde numaralandırılıyorsa bir uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırılmış değeri ekleyerek bu özelliği etkinleştirebilir.
Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.
Uçak Anlamsal Etiketi
Bileşen Verileri
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 numaralandırması, düzlemler için bir dizi anlamsal etiketi tanımlar.
Enum Açıklaması
XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
Çalışma zamanı bu öğeyi sınıflandıramadı.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT
Varlık bir kat.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT
Öğe bir duvar.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT
Varlık bir tavan.
XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT
Öğe bir tablodur.
Verilere Sorgu Uygulamak İçin Bileşen Listesi Yapısı
XrSpatialComponentPlaneSemanticLabelListEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialComponentPlaneSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialPlaneSemanticLabelEXT* semanticLabels;
} XrSpatialComponentPlaneSemanticLabelListEXT;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.semanticLabelCount,semanticLabelsdizisindeki öğelerin sayısını açıklayan biruint32_t'dir.semanticLabels, XrSpatialPlaneSemanticLabelEXT dizisidir .
Bir XrSpatialSnapshotEXT içindeki uzamsal varlıkların düzlem anlamsal etiket bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT ekleyin ve XrSpatialComponentPlaneSemanticLabelListEXT'yi XrSpatialComponentDataQueryResultEXT :: next zincirine ekleyin.
Çalışma zamanı, XrSpatialComponentPlaneSemanticLabelListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirinde yer alıyorsa ancak XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa xrQuerySpatialComponentDataEXT işlevinden XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir .
Çalışma zamanı, semanticLabelCount değeri XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse xrQuerySpatialComponentDataEXT işlevinden XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir .
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_plane_trackinguzantısı, XrSpatialComponentPlaneSemanticLabelListEXT kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXTolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya geçerli bir işaretçi olmalıdır. -
semanticLabelssemanticLabelCountXrSpatialPlaneSemanticLabelEXT değerleri dizisine yönelik bir işaretçi olmalıdır. -
semanticLabelCountparametresi0değerinden büyük olmalıdır.
Yapılandırma
Bazı özellikler için XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT, XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde numaralandırılıyorsa bir uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırılmış değeri ekleyerek bu özelliği etkinleştirebilir.
Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.
Örnek Kod
Düzlem İzleme Özelliğini Yapılandırma
Aşağıdaki örnek kodda, uzamsal bağlam oluştururken düzlem izleme özelliğinin nasıl yapılandırılacağı gösterilmektedir.
// 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));
Uzamsal öğeleri keşfetme ve bileşen verilerini sorgulama
Aşağıdaki örnek kod, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ile yapılandırılmış bir bağlam için uzamsal öğelerin nasıl keşfedileceğini ve bileşen verilerinin nasıl sorgulanacağını gösterir.
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
// ...
}
Yeni Yapılar
- XrSpatialCapabilityConfigurationPlaneTrackingEXT
- XrSpatialPolygon2DDataEXT
XrSpatialComponentDataQueryResultEXT'yi genişletme :
Yeni Sıralamalar
Yeni Enum Sabitleri
XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_plane_tracking_SPEC_VERSIONXrSpatialCapabilityEXT uzatılıyor :
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
XrSpatialComponentTypeEXT'yi genişletme :
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
XrStructureType uzatma :
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
Sayılar
Sürüm Geçmişi
1. düzeltme, 02.07.2024 (Nihav Jain, Google)
- İlk uzantı açıklaması