XR_EXT_spatial_plane_tracking

Name String

XR_EXT_spatial_plane_tracking

Uzantı Türü

Örnek uzantısı

Kayıtlı Dahili Numara

742

Düzeltme

1

Onay Durumu

Onaylandı

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 bunu xrEnumerateSpatialCapabilitiesEXT içinde XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT değerini numaralandırarak belirtmesi gerekir.

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 değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • capability, bir XrSpatialCapabilityEXT'tir ve XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT olmalıdır.
  • enabledComponentCount, enabledComponents dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • enabledComponents, XrSpatialComponentTypeEXT dizisine işaret eden bir göstergedir.

Uygulamalar, XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationPlaneTrackingEXT yapısına işaretçi ekleyerek XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT uzamsal özelliğini etkinleştirebilir.

capability, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Garantili Bileşenler

XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT özelliğini 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 listelemelidir:

  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
  • XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT

Sınırlı 2D Bileşen

Sınırlı 2D bileşeni, üzerinde bulunduğu varlık tarafından temsil edilen düzlemin merkezini ve kapsamı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 varlıkla ilişkili düzlemin XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT bileşeniyle hizalaması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ı bakar (ör. zemin).

XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT

Varlık yataydır ve aşağı bakar (ör. tavan).

XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT

Varlık dikeydir (ör. duvar).

XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT

Öğe rastgele, dikey ve yatay olmayan bir yöne sahiptir.

Verileri sorgulamak 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 değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • planeAlignmentCount, planeAlignments dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • planeAlignments, XrSpatialPlaneAlignmentEXT dizisidir.

XrSpatialSnapshotEXT içindeki uzamsal varlıkların düzlem hizalama bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentPlaneAlignmentListEXT ekleyin.

XrSpatialComponentPlaneAlignmentListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.

planeAlignmentCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı 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 listelenenlere ek olarak diğer uzamsal bileşenleri de destekleyebilir. Uygulamalar, çalışma zamanının desteklediği bileşenlerin tam listesini almak için xrEnumerateSpatialCapabilityComponentTypesEXT'i 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.

Verileri sorgulamak 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 değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • meshCount, meshes dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • meshes, XrSpatialMeshDataEXT dizisidir.

XrSpatialSnapshotEXT içindeki uzamsal varlıkların 2D ağ bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentMesh2DListEXT ekleyin.

XrSpatialComponentMesh2DListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir.

meshCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Çalışma zamanı tarafından meshes dizisinde doldurulan XrSpatialMeshDataEXT için XrSpatialMeshDataEXT :: vertexBuffer için XrSpatialBufferEXT :: bufferType, XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT olmalıdır ve XrSpatialMeshDataEXT :: indexBuffer için XrSpatialBufferEXT :: bufferType, XR_SPATIAL_BUFFER_TYPE_UINT16_EXT olmalıdır.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı ekleyerek bu özelliği etkinleştirebilir.

Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.

2D Poligon 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ıç noktasını tanımlayan bir XrPosef değeridir. Çokgenin tüm köşeleri, X-Y düzlemindeki bu başlangıç noktasına göredir.
  • vertexBuffer, XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT türündeki bir arabelleğin kimliğini sağlayan ve bu bileşenin bulunduğu varlığın köşe arabelleğini temsil eden bir XrSpatialBufferEXT'tir. Köşe noktaları saat yönünün tersine olmalıdır. Bu köşelerle temsil edilen poligon, kendi kendini kesen bir poligon olmamalıdır ve içbükey olabilir.

XrSpatialBufferEXT :: bufferType, vertexBuffer için XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT olmalıdır.

Geçerli Kullanım (Dolaylı)

Verileri sorgulamak 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 değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • polygonCount, polygons dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • polygons, XrSpatialPolygon2DDataEXT dizisidir.

XrSpatialSnapshotEXT içindeki uzamsal varlıkların poligon 2D bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentPolygon2DListEXT ekleyin.

XrSpatialComponentPolygon2DListEXT, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir .

polygonCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı 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 açıklar.

Enum Açıklaması

XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT

Çalışma zamanı bu varlığı sınıflandıramadı.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT

Varlık bir kattır.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT

Varlık bir duvardır.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT

Varlık bir tavandır.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT

Varlık bir tablodur.

Verileri Sorgulamak İç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 değeridir.
  • next, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • semanticLabelCount, semanticLabels dizisindeki öğe sayısını açıklayan bir uint32_t değeridir.
  • semanticLabels, XrSpatialPlaneSemanticLabelEXT dizisidir.

XrSpatialSnapshotEXT içindeki uzamsal varlıkların düzlem semantik etiket bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentPlaneSemanticLabelListEXT ekleyin.

XrSpatialComponentPlaneSemanticLabelListEXT, XrSpatialComponentDataQueryResultEXT :: next öğesinin sonraki zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes öğesine dahil değilse çalışma zamanı, xrQuerySpatialComponentDataEXT öğesinden XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir .

semanticLabelCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı 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));

Mekansal Varlıkları Keşfetme ve Bileşen Verilerini Sorgulama

Aşağıdaki örnek kodda, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ile yapılandırılmış bir bağlam için uzamsal varlıkların nasıl keşfedileceği ve bileşen verilerinin nasıl sorgulanacağı gösterilmektedir.

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 Enum Veri Türleri

Yeni Enum Sabitleri

  • XR_EXT_SPATIAL_PLANE_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_plane_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT'yi genişletme:

    • 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'ı genişletme:

    • 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

  • Düzeltme 1, 02.07.2024 (Nihav Jain, Google)

    • İlk uzantı açıklaması