XR_ANDROID_geospatial_anchor
String de nome
XR_ANDROID_geospatial_anchor
Tipo de extensão
Extensão de instância
Número da extensão registrada
798
Revisão
1
Status de ratificação
Não ratificado
Dependências de extensão e versão
XR_ANDROID_geospatial
e
XR_EXT_future
e
XR_EXT_spatial_entity
e
XR_EXT_spatial_anchor
Data da última modificação
2025-10-30
Status do IP
Não há reivindicações de IP conhecidas.
Colaboradores
John Ullman, Google
Ben King, Google
Nihav Jain, Google
Jared Finder, Google
Visão geral
Essa extensão oferece âncoras geoespaciais e de superfície que se baseiam na extensão geoespacial básica. As âncoras geoespaciais são posicionadas no espaço em relação à Terra em uma determinada latitude, longitude e altitude. As âncoras de superfície são âncoras relativas à Terra que são colocadas em uma determinada latitude, longitude e altitude em relação a uma superfície, conforme conhecido pelo Serviço de posicionamento visual. À medida que a precisão da posição do tempo de execução em relação à Terra melhora, a postura da âncora se ajusta de acordo.
Capacidade do sistema para âncoras geoespaciais
A estrutura XrSystemGeospatialAnchorPropertiesANDROID é definida da seguinte maneira:
typedef struct XrSystemGeospatialAnchorPropertiesANDROID {
XrStructureType type;
void* next;
uint32_t maxSurfaceAnchorCount;
} XrSystemGeospatialAnchorPropertiesANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no OpenXR principal ou nesta extensão.maxSurfaceAnchorCounté umuint32_tque indica o número máximo de âncoras de superfície que podem ser criadas.
Um aplicativo pode inspecionar os recursos de âncora geoespacial do sistema encadeando uma estrutura XrSystemGeospatialAnchorPropertiesANDROID à XrSystemProperties ao chamar xrGetSystemProperties .
Se XrSystemGeospatialPropertiesANDROID :: supportsGeospatial for XR_TRUE , maxSurfaceAnchorCount vai indicar o número máximo de fixações de superfície compatíveis com o tempo de execução. O limite precisa ser maior que 0 nesse caso.
Se XrSystemGeospatialPropertiesANDROID :: supportsGeospatial não for XR_TRUE , então maxSurfaceAnchorCount precisa ser 0.
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de usar XrSystemGeospatialAnchorPropertiesANDROID. -
typeprecisa serXR_TYPE_SYSTEM_GEOSPATIAL_ANCHOR_PROPERTIES_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas.
Rastreamento de planos para âncoras
A estrutura XrGeospatialTrackerAnchorTrackingInfoANDROID é definida como:
typedef struct XrGeospatialTrackerAnchorTrackingInfoANDROID {
XrStructureType type;
const void* next;
XrBool32 shouldTrackPlanes;
} XrGeospatialTrackerAnchorTrackingInfoANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.shouldTrackPlanesé umXrBool32que indica se o rastreador geoespacial vai rastrear planos para melhorar o posicionamento de fixações bloqueadas na superfície.
O rastreamento de planos pode ser ativado para melhorar o posicionamento de âncoras fixadas na superfície.
Se o aplicativo quiser ativar o rastreamento de planos para melhorar as posturas de âncora de superfície, ele poderá encadear uma estrutura XrGeospatialTrackerAnchorTrackingInfoANDROID a XrGeospatialTrackerCreateInfoANDROID ao chamar xrCreateGeospatialTrackerANDROID .
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de usar XrGeospatialTrackerAnchorTrackingInfoANDROID. -
typeprecisa serXR_TYPE_GEOSPATIAL_TRACKER_ANCHOR_TRACKING_INFO_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas.
Âncoras geoespaciais
A função xrCreateGeospatialAnchorANDROID é definida como:
XrResult xrCreateGeospatialAnchorANDROID(
XrSpatialContextEXT spatialContext,
const XrGeospatialAnchorCreateInfoANDROID* createInfo,
XrSpatialEntityIdEXT* anchorEntityId);
Descrições dos parâmetros
spatialContexté o XrSpatialContextEXT em que a âncora será criada. O contexto precisa ser configurado paraXR_SPATIAL_CAPABILITY_ANCHOR_EXT. Caso contrário, o ambiente de execução precisa retornarXR_ERROR_VALIDATION_FAILURE.createInfoé um ponteiro para XrGeospatialAnchorCreateInfoANDROID que contém parâmetros de criação de âncora.anchorEntityIdé um ponteiro paraXrSpatialEntityIdEXTem que o ID da entidade âncora é retornado.
Se o XrGeospatialTrackerANDROID especificado em XrGeospatialAnchorCreateInfoANDROID :: geospatialTracker não estiver no estado XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID, o tempo de execução deverá retornar XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID .
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de chamar xrCreateGeospatialAnchorANDROID. -
spatialContextprecisa ser um identificador XrSpatialContextEXT válido -
createInfoprecisa ser um ponteiro para uma estrutura XrGeospatialAnchorCreateInfoANDROID válida -
anchorEntityIdprecisa ser um ponteiro para um valorXrSpatialEntityIdEXT
Códigos de retorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROIDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
A estrutura XrGeospatialAnchorCreateInfoANDROID é definida como:
typedef struct XrGeospatialAnchorCreateInfoANDROID {
XrStructureType type;
const void* next;
XrGeospatialTrackerANDROID geospatialTracker;
XrGeospatialPoseANDROID geospatialPose;
} XrGeospatialAnchorCreateInfoANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.geospatialTrackeré o XrGeospatialTrackerANDROID a ser usado para criar a âncora.geospatialPoseé um ponteiro para XrGeospatialPoseANDROID que define a localização e a orientação da âncora.
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de usar XrGeospatialAnchorCreateInfoANDROID. -
typeprecisa serXR_TYPE_GEOSPATIAL_ANCHOR_CREATE_INFO_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
geospatialTrackerprecisa ser um identificador XrGeospatialTrackerANDROID válido -
geospatialPoseprecisa ser uma estrutura XrGeospatialPoseANDROID válida
Anúncios fixos na superfície
As âncoras de superfície são colocadas em relação a uma superfície, como terreno ou telhados.
A enumeração XrSurfaceAnchorTypeANDROID é definida como:
typedef enum XrSurfaceAnchorTypeANDROID {
XR_SURFACE_ANCHOR_TYPE_TERRAIN_ANDROID = 1,
XR_SURFACE_ANCHOR_TYPE_ROOFTOP_ANDROID = 2,
XR_SURFACE_ANCHOR_TYPE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSurfaceAnchorTypeANDROID;
A enumeração XrSurfaceAnchorTypeANDROID especifica o tipo de superfície em relação a uma âncora.
Os enumeradores têm os seguintes valores:
Descrição da enumeração
XR_SURFACE_ANCHOR_TYPE_TERRAIN_ANDROID
Tipo de uma âncora colocada em relação ao solo.
XR_SURFACE_ANCHOR_TYPE_ROOFTOP_ANDROID
Tipo de âncora colocada em relação ao telhado ou ao chão quando não há um edifício.
A função xrCreateSurfaceAnchorAsyncANDROID é definida como:
XrResult xrCreateSurfaceAnchorAsyncANDROID(
XrSpatialContextEXT spatialContext,
const XrSurfaceAnchorCreateInfoANDROID* createInfo,
XrFutureEXT* future);
Descrições dos parâmetros
spatialContexté o XrSpatialContextEXT em que a âncora será criada.createInfoé um ponteiro para XrSurfaceAnchorCreateInfoANDROID que contém parâmetros de criação de âncora.futureé um ponteiro paraXrFutureEXTque vai armazenar o resultado da operação assíncrona.
A função xrCreateSurfaceAnchorAsyncANDROID inicia uma operação assíncrona para criar uma âncora de superfície. Ao contrário das âncoras geoespaciais padrão, o tempo de execução pode buscar dados de terreno para determinar a altitude correta. O ambiente de execução precisa retornar XR_ERROR_LIMIT_REACHED se o aplicativo tentar criar mais de XrSystemGeospatialAnchorPropertiesANDROID :: âncoras de superfície maxSurfaceAnchorCount por vez. Se o XrGeospatialTrackerANDROID especificado em XrSurfaceAnchorCreateInfoANDROID :: geospatialTracker não estiver no estado XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID, o tempo de execução deverá retornar XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID . A operação pode falhar de forma assíncrona com o resultado XR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROID se não houver dados de superfície para o local especificado. O tempo de execução precisa retornar XR_ERROR_VALIDATION_FAILURE se XR_SPATIAL_CAPABILITY_ANCHOR_EXT não tiver sido configurado para spatialContext .
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de chamar xrCreateSurfaceAnchorAsyncANDROID. -
spatialContextprecisa ser um identificador XrSpatialContextEXT válido -
createInfoprecisa ser um ponteiro para uma estrutura XrSurfaceAnchorCreateInfoANDROID válida -
futureprecisa ser um ponteiro para um valorXrFutureEXT
Códigos de retorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROIDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
A estrutura XrSurfaceAnchorCreateInfoANDROID é definida como:
typedef struct XrSurfaceAnchorCreateInfoANDROID {
XrStructureType type;
const void* next;
XrGeospatialTrackerANDROID geospatialTracker;
XrSurfaceAnchorTypeANDROID surfaceAnchorType;
XrQuaternionf eastUpSouthOrientation;
double latitude;
double longitude;
double altitudeRelativeToSurface;
} XrSurfaceAnchorCreateInfoANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.geospatialTrackeré o XrGeospatialTrackerANDROID a ser usado.surfaceAnchorTypeé o XrSurfaceAnchorTypeANDROID da âncora.eastUpSouthOrientationé a orientação em relação a um sistema de coordenadas em que +X=Leste, +Y=Cima e +Z=Sul.latitudeé a latitude em graus, entre -89,9 e +89,9.longitudeé a longitude em graus, entre -180 e +180.altitudeRelativeToSurfaceé a altitude em metros em relação à superfície especificada porsurfaceAnchorType.
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de usar XrSurfaceAnchorCreateInfoANDROID. -
typeprecisa serXR_TYPE_SURFACE_ANCHOR_CREATE_INFO_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
geospatialTrackerprecisa ser um identificador XrGeospatialTrackerANDROID válido -
surfaceAnchorTypeprecisa ser um valor XrSurfaceAnchorTypeANDROID válido -
latitudeprecisa ser um valordoubleválido -
longitudeprecisa ser um valordoubleválido -
altitudeRelativeToSurfaceprecisa ser um valordoubleválido
A função xrCreateSurfaceAnchorCompleteANDROID é definida como:
XrResult xrCreateSurfaceAnchorCompleteANDROID(
XrSpatialContextEXT spatialContext,
XrFutureEXT future,
XrSurfaceAnchorCreateCompletionANDROID* completion);
Descrições dos parâmetros
spatialContexté o XrSpatialContextEXT usado para criação.futureé oXrFutureEXTretornado por xrCreateSurfaceAnchorAsyncANDROID .completioné um ponteiro para XrSurfaceAnchorCreateCompletionANDROID que recebe o resultado.
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de chamar xrCreateSurfaceAnchorCompleteANDROID. -
spatialContextprecisa ser um identificador XrSpatialContextEXT válido -
completionprecisa ser um ponteiro para uma estrutura XrSurfaceAnchorCreateCompletionANDROID.
Códigos de retorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
A estrutura XrSurfaceAnchorCreateCompletionANDROID contém o resultado da criação assíncrona de uma âncora de superfície.
typedef struct XrSurfaceAnchorCreateCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialEntityIdEXT anchorEntityId;
} XrSurfaceAnchorCreateCompletionANDROID;
Descrições de membros
typeé o XrStructureType dessa estrutura.nextéNULLou um ponteiro para a próxima estrutura em uma cadeia de estruturas.futureResulté o XrResult da operação de criação. SefutureResultforXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID, uma estrutura na cadeianextpoderá fornecer mais informações sobre a falha.anchorEntityIdé oXrSpatialEntityIdEXTda âncora criada ou XR_NULL_SPATIAL_ENTITY_ID_EXT sefutureResultnão forXR_SUCCESS.
Códigos de retorno futuros
Valores de futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROIDXR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROIDXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID
Uso válido (implícito)
- A extensão
XR_ANDROID_geospatial_anchorprecisa ser ativada antes de usar XrSurfaceAnchorCreateCompletionANDROID. -
typeprecisa serXR_TYPE_SURFACE_ANCHOR_CREATE_COMPLETION_ANDROID -
nextprecisa serNULLou um ponteiro válido para a próxima estrutura em uma cadeia de estruturas. -
futureResultprecisa ser um valor XrResult válido
Exemplo
Criar uma âncora de terreno
PFN_xrCreateSpatialContextAsyncEXT xrCreateSpatialContextAsyncEXT;
PFN_xrCreateSpatialContextCompleteEXT xrCreateSpatialContextCompleteEXT;
PFN_xrCreateSurfaceAnchorAsyncANDROID xrCreateSurfaceAnchorAsyncANDROID;
PFN_xrPollFutureEXT xrPollFutureEXT;
PFN_xrCreateSurfaceAnchorCompleteANDROID xrCreateSurfaceAnchorCompleteANDROID;
XrInstance instance;
XrSession session;
XrGeospatialTrackerANDROID geospatialTracker;
// Create a spatial context
XrSpatialContextEXT spatialContext{};
{
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
};
XrSpatialCapabilityConfigurationAnchorEXT
anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
anchorConfig.enabledComponentCount = enabledComponents.size();
anchorConfig.enabledComponents = enabledComponents.data();
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
};
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));
// ... wait until future is ready ...
XrCreateSpatialContextCompletionEXT contextCompletion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &contextCompletion));
if (contextCompletion.futureResult != XR_SUCCESS) {
return;
}
spatialContext = contextCompletion.spatialContext;
}
XrSurfaceAnchorCreateInfoANDROID anchorCreateInfo{
XR_TYPE_SURFACE_ANCHOR_CREATE_INFO_ANDROID};
anchorCreateInfo.surfaceAnchorType = XR_SURFACE_ANCHOR_TYPE_TERRAIN_ANDROID;
anchorCreateInfo.eastUpSouthOrientation = {0, 0, 0, 1};
anchorCreateInfo.latitude = 37.7749;
anchorCreateInfo.longitude = -122.4194;
anchorCreateInfo.altitudeRelativeToSurface = 0;
anchorCreateInfo.geospatialTracker = geospatialTracker;
XrFutureEXT anchorFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSurfaceAnchorAsyncANDROID(spatialContext, &anchorCreateInfo, &anchorFuture));
XrFuturePollInfoEXT anchorPollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT anchorPollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
anchorPollInfo.future = anchorFuture;
anchorPollResult.state = XR_FUTURE_STATE_PENDING_EXT;
while (anchorPollResult.state == XR_FUTURE_STATE_PENDING_EXT) {
// Do in render loop/state loop.
CHK_XR(xrPollFutureEXT(instance, &anchorPollInfo, &anchorPollResult));
}
XrSurfaceAnchorCreateCompletionANDROID anchorCompletion{
XR_TYPE_SURFACE_ANCHOR_CREATE_COMPLETION_ANDROID};
CHK_XR(xrCreateSurfaceAnchorCompleteANDROID(spatialContext, anchorFuture, &anchorCompletion));
if (anchorCompletion.futureResult == XR_SUCCESS) {
// Use completion.anchorEntityId.
XrSpatialEntityIdEXT anchorId = anchorCompletion.anchorEntityId;
// Query in UpdateSnapshot.
}
Novos comandos
- xrCreateGeospatialAnchorANDROID
- xrCreateSurfaceAnchorAsyncANDROID
- xrCreateSurfaceAnchorCompleteANDROID
Novas estruturas
- XrGeospatialAnchorCreateInfoANDROID
- XrSurfaceAnchorCreateCompletionANDROID
- XrSurfaceAnchorCreateInfoANDROID
Extensão de XrGeospatialTrackerCreateInfoANDROID :
Extensão de XrSystemProperties :
Novos tipos enumerados
Novas constantes de enumeração
XR_ANDROID_GEOSPATIAL_ANCHOR_EXTENSION_NAMEXR_ANDROID_geospatial_anchor_SPEC_VERSIONExtensão de XrResult :
XR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROID
Extensão de XrStructureType :
XR_TYPE_GEOSPATIAL_ANCHOR_CREATE_INFO_ANDROIDXR_TYPE_GEOSPATIAL_TRACKER_ANCHOR_TRACKING_INFO_ANDROIDXR_TYPE_SURFACE_ANCHOR_CREATE_COMPLETION_ANDROIDXR_TYPE_SURFACE_ANCHOR_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_GEOSPATIAL_ANCHOR_PROPERTIES_ANDROID
Problemas
Histórico de versões
Revisão 1, 30/10/2025 (Ben King)
- Rascunho inicial.