XR_ANDROID_spatial_discovery_bounds
String de nome
XR_ANDROID_spatial_discovery_bounds
Tipo de extensão
Extensão de instância
Número de ramal registrado
762
Revisão
1
Status de ratificação
Não ratificado
Dependências de extensão e versão
XR_EXT_spatial_entity
Colaboradores
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Yin Li, Microsoft
Ron Bessems, Meta
Karthik Kadappan, Magic Leap
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Visão geral
Essa extensão adiciona definições para limites espaciais que permitem que os aplicativos filtrem entidades espaciais descobertas ao chamar xrCreateSpatialDiscoverySnapshotAsyncEXT .
Limites espaciais
A estrutura XrSpatialBoundsSpherefANDROID é definida como:
typedef struct XrSpatialBoundsSpherefANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrSpheref sphere;
} XrSpatialBoundsSpherefANDROID;
Descrições dos membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.spaceé o XrSpace em que as poses dos limites são definidas.timeé umXrTimeem que as poses dos limites são definidas.sphereé um XrSpheref que descreve o volume esférico em que o ambiente de execução precisa restringir a descoberta de entidades espaciais.
Os recursos espaciais que oferecem suporte a XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID (conforme enumerado por xrEnumerateSpatialCapabilityFeaturesEXT) permitem que o aplicativo restrinja a descoberta a entidades espaciais com localização ou limites dentro ou que se cruzam com sphere ao encadear XrSpatialBoundsSpherefANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Para um snapshot de descoberta em que o recurso aplicável é compatível com XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID , se essa estrutura estiver presente na cadeia next, o ambiente de execução não pode incluir entidades espaciais com localização ou limites totalmente fora de sphere .
É importante observar que a inclusão de XrSpatialBoundsSpherefANDROID na próxima cadeia de XrSpatialDiscoverySnapshotCreateInfoEXT funciona como uma condição "AND" com os outros filtros fornecidos. As entidades provenientes de recursos espaciais que não são compatíveis com XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID não podem ser incluídas no snapshot de descoberta. Esse comportamento é diferente do restante da especificação do OpenXR, em que estruturas não reconhecidas ou não compatíveis na próxima cadeia de ponteiros são ignoradas pelo ambiente de execução. Além disso, conforme descrito na seção Exclusividade da estrutura da próxima cadeia, o ambiente de execução só vai processar a primeira ocorrência da estrutura XrSpatialBoundsSpherefANDROID na próxima cadeia.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_discovery_boundsprecisa ser ativada antes de usar XrSpatialBoundsSpherefANDROID. -
typeprecisa serXR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas -
spaceprecisa ser um identificador XrSpace válido
A estrutura XrSpatialBoundsBoxfANDROID é definida como:
typedef struct XrSpatialBoundsBoxfANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrBoxf box;
} XrSpatialBoundsBoxfANDROID;
Descrições dos membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.spaceé o XrSpace em que as poses dos limites são definidas.timeé umXrTimeem que as poses dos limites são definidas.boxé um XrBoxf que descreve o volume da caixa em que o ambiente de execução precisa restringir a descoberta de entidades espaciais.
Os recursos espaciais compatíveis com XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID (conforme enumerado por xrEnumerateSpatialCapabilityFeaturesEXT) permitem que o aplicativo restrinja a descoberta a entidades espaciais com localização ou limites dentro ou que se cruzam com box ao encadear XrSpatialBoundsBoxfANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Para um snapshot de descoberta em que o recurso aplicável é compatível com XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID , se essa estrutura estiver presente na cadeia next, o ambiente de execução não pode incluir entidades espaciais com localização ou limites totalmente fora de box .
É importante observar que a inclusão de XrSpatialBoundsBoxfANDROID na próxima cadeia de XrSpatialDiscoverySnapshotCreateInfoEXT funciona como uma condição "AND" com os outros filtros fornecidos. As entidades provenientes de recursos espaciais que não são compatíveis com XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID não podem ser incluídas no snapshot de descoberta. Esse comportamento é diferente do restante da especificação do OpenXR, em que estruturas não reconhecidas ou não compatíveis na próxima cadeia de ponteiros são ignoradas pelo ambiente de execução. Além disso, conforme descrito na seção Exclusividade da estrutura da próxima cadeia, o ambiente de execução só vai processar a primeira ocorrência da estrutura XrSpatialBoundsBoxfANDROID na próxima cadeia.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_discovery_boundsprecisa ser ativada antes de usar XrSpatialBoundsBoxfANDROID. -
typeprecisa serXR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas -
spaceprecisa ser um identificador XrSpace válido
A estrutura XrSpatialBoundsFrustumfANDROID é definida como:
typedef struct XrSpatialBoundsFrustumfANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrFrustumf frustum;
} XrSpatialBoundsFrustumfANDROID;
Descrições dos membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.spaceé o XrSpace em que as poses dos limites são definidas.timeé umXrTimeem que as poses dos limites são definidas.frustumé um XrFrustumf que descreve o volume do tronco em que o ambiente de execução precisa restringir a descoberta de entidades espaciais.
Os recursos espaciais que oferecem suporte a XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID (conforme enumerado por xrEnumerateSpatialCapabilityFeaturesEXT) permitem que o aplicativo restrinja a descoberta a entidades espaciais com localização ou limites dentro ou que se cruzam com frustum ao encadear XrSpatialBoundsFrustumfANDROID a XrSpatialDiscoverySnapshotCreateInfoEXT :: next . Para um snapshot de descoberta em que o recurso aplicável é compatível com XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID , se essa estrutura estiver presente na cadeia next, o ambiente de execução não pode incluir entidades espaciais com localização ou limites totalmente fora de frustum .
É importante observar que a inclusão de XrSpatialBoundsFrustumfANDROID na próxima cadeia de XrSpatialDiscoverySnapshotCreateInfoEXT funciona como uma condição "AND" com os outros filtros fornecidos. As entidades provenientes de recursos espaciais que não são compatíveis com XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID não podem ser incluídas no snapshot de descoberta. Esse comportamento é diferente do restante da especificação do OpenXR, em que estruturas não reconhecidas ou não compatíveis na próxima cadeia de ponteiros são ignoradas pelo ambiente de execução. Além disso, conforme descrito na seção Exclusividade da estrutura da próxima cadeia, o ambiente de execução só vai processar a primeira ocorrência da estrutura XrSpatialBoundsFrustumfANDROID na próxima cadeia.
Uso válido (implícito)
- A extensão
XR_ANDROID_spatial_discovery_boundsprecisa ser ativada antes de usar XrSpatialBoundsFrustumfANDROID -
typeprecisa serXR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas -
spaceprecisa ser um identificador XrSpace válido
Exemplo
O código a seguir demonstra como usar limites espaciais para filtrar a descoberta de entidades espaciais.
// previously initialized & configured with the XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT capability.
XrSpatialContextEXT spatialContext;
// Enumerate supported features for XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT capability
uint32_t featureCount = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> fooFeatures(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, featureCount, &featureCount, fooFeatures.data()));
// Check if spatial sphere bounds filter is supported
const auto supportsFeature = [&fooFeatures](XrSpatialCapabilityFeatureEXT feature) {
return std::find(fooFeatures.begin(), fooFeatures.end(), feature) != fooFeatures.end();
};
const bool supportsSphereBoundsFilter = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID);
// We want to look for entities in a sphere around the head with a radius of 2m.
XrSpatialBoundsSpherefANDROID sphereBounds {
.type = XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID,
.space = viewSpace,
.time = predictedDisplayTime,
.sphere = {
.center = {
.orientation = {
.w = 1.0f,
},
},
.radius = 2.0f,
},
};
// We want to look for entities that have the following components.
std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT};
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{
.type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
.next = supportsSphereBoundsFilter ? &sphereBounds : nullptr,
.componentTypeCount = snapshotComponents.size(),
.componentTypes = snapshotComponents.data(),
};
XrFutureEXT future = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
Novas estruturas
Estendendo XrSpatialDiscoverySnapshotCreateInfoEXT :
Novas constantes de tipo enumerado
XR_ANDROID_SPATIAL_DISCOVERY_BOUNDS_EXTENSION_NAMEXR_ANDROID_spatial_discovery_bounds_SPEC_VERSIONEstendendo XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROIDXR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROIDXR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID
Estendendo XrStructureType :
XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROIDXR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROIDXR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID
Problemas
Por que o suporte para limites espaciais depende de uma definição de XrSpatialCapabilityFeatureEXT?
- Resolvido
- Resposta: nem todos os recursos espaciais são capazes de oferecer suporte a limites espaciais. Um exemplo disso é uma entidade de contêiner global hipotética que não tem nenhuma posição espacial ou limites próprios, mas apenas ajuda a coletar e organizar as outras entidades dentro dela. Os valores XrSpatialCapabilityFeatureEXT enumerados pelo recurso ajudam a informar ao app sobre o suporte à filtragem de limites espaciais.
Histórico de versões
Revisão 1, 03/05/2025 (Nihav Jain, Google)
- Descrição inicial da extensão