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, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir.
  • capability, XrSpatialCapabilityEXT ve zorunlu olmalıdır XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT .
  • enabledComponentCount, enabledComponents dizisindeki öğelerin sayısını açıklayan bir uint32_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ı)

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_EXT
  • XR_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, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir.
  • planeAlignmentCount, planeAlignments dizisindeki öğelerin sayısını açıklayan bir uint32_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ı)

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, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir.
  • meshCount, meshes dizisindeki öğelerin sayısını açıklayan bir uint32_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ı)

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_EXT tü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ı)

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, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir.
  • polygonCount, polygons dizisindeki öğelerin sayısını açıklayan bir uint32_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ı)

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, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir.
  • semanticLabelCount, semanticLabels dizisindeki öğelerin sayısını açıklayan bir uint32_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ı)

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

Yeni Sıralamalar

Yeni Enum Sabitleri

  • XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_plane_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT uzatılıyor :

    • XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
  • XrSpatialComponentTypeEXT'yi genişletme :

    • 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 uzatma :

    • 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

Sayılar

Sürüm Geçmişi

  • 1. düzeltme, 02.07.2024 (Nihav Jain, Google)

    • İlk uzantı açıklaması