XR_ANDROID_geospatial_anchor
Name String
XR_ANDROID_geospatial_anchor
Tipo di estensione
Estensione dell'istanza
Numero di interno registrato
798
Revisione
1
Stato della ratifica
Non ratificato
Dipendenze di estensioni e versioni
XR_ANDROID_geospatial
e
XR_EXT_future
e
XR_EXT_spatial_entity
e
XR_EXT_spatial_anchor
Data ultima modifica
30/10/2025
Stato IP
Nessuna rivendicazione di PI nota.
Collaboratori
John Ullman, Google
Ben King, Google
Nihav Jain, Google
Jared Finder, Google
Panoramica
Questa estensione fornisce ancoraggi geospaziali e ancoraggi di superficie che si basano sull'estensione geospaziale di base. Le ancore geospaziali sono ancore posizionate nello spazio rispetto alla Terra a una determinata latitudine, longitudine e altitudine. Le ancore di superficie sono ancore relative alla Terra posizionate a una determinata latitudine, longitudine e altitudine rispetto a una superficie nota al servizio di posizionamento visivo. Man mano che la precisione della posizione del runtime rispetto alla Terra migliora, la posa dell'ancora si adatta di conseguenza.
Funzionalità di sistema per gli ancoraggi geospaziali
La struttura XrSystemGeospatialAnchorPropertiesANDROID è definita come:
typedef struct XrSystemGeospatialAnchorPropertiesANDROID {
XrStructureType type;
void* next;
uint32_t maxSurfaceAnchorCount;
} XrSystemGeospatialAnchorPropertiesANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture. Nessuna struttura di questo tipo è definita in OpenXR di base o in questa estensione.maxSurfaceAnchorCountè unuint32_tche indica il numero massimo di ancoraggi di superficie che possono essere creati.
Un'applicazione può ispezionare le funzionalità di ancoraggio geospaziale del sistema concatenando una struttura XrSystemGeospatialAnchorPropertiesANDROID a XrSystemProperties quando chiama xrGetSystemProperties .
Se XrSystemGeospatialPropertiesANDROID :: supportsGeospatial è XR_TRUE, maxSurfaceAnchorCount indica il numero massimo di ancoraggi di superficie supportati dal runtime. In questo caso, il limite deve essere maggiore di 0.
Se XrSystemGeospatialPropertiesANDROID :: supportsGeospatial non è XR_TRUE, maxSurfaceAnchorCount deve essere 0.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere abilitata prima di utilizzare XrSystemGeospatialAnchorPropertiesANDROID -
typedeve essereXR_TYPE_SYSTEM_GEOSPATIAL_ANCHOR_PROPERTIES_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
Tracciamento dei piani per le ancora
La struttura XrGeospatialTrackerAnchorTrackingInfoANDROID è definita come:
typedef struct XrGeospatialTrackerAnchorTrackingInfoANDROID {
XrStructureType type;
const void* next;
XrBool32 shouldTrackPlanes;
} XrGeospatialTrackerAnchorTrackingInfoANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.shouldTrackPlanesè unXrBool32che indica se il tracker geospaziale monitorerà i piani per migliorare il posizionamento delle ancora bloccate sulla superficie.
Il rilevamento dei piani può essere attivato per migliorare il posizionamento delle ancora bloccate sulla superficie.
Se l'applicazione vuole attivare il rilevamento dei piani per migliorare le pose degli ancoraggi di superficie, può concatenare una struttura XrGeospatialTrackerAnchorTrackingInfoANDROID a XrGeospatialTrackerCreateInfoANDROID quando chiama xrCreateGeospatialTrackerANDROID .
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere attivata prima di utilizzare XrGeospatialTrackerAnchorTrackingInfoANDROID -
typedeve essereXR_TYPE_GEOSPATIAL_TRACKER_ANCHOR_TRACKING_INFO_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
Ancoraggi geospaziali
La funzione xrCreateGeospatialAnchorANDROID è definita come:
XrResult xrCreateGeospatialAnchorANDROID(
XrSpatialContextEXT spatialContext,
const XrGeospatialAnchorCreateInfoANDROID* createInfo,
XrSpatialEntityIdEXT* anchorEntityId);
Descrizioni dei parametri
spatialContextè l'XrSpatialContextEXT in cui creare l'ancoraggio. Il contesto deve essere configurato perXR_SPATIAL_CAPABILITY_ANCHOR_EXT, altrimenti il runtime deve restituireXR_ERROR_VALIDATION_FAILURE.createInfoè un puntatore a XrGeospatialAnchorCreateInfoANDROID contenente i parametri di creazione dell'ancoraggio.anchorEntityIdè un puntatore aXrSpatialEntityIdEXTin cui viene restituito l'ID entità di ancoraggio.
Se l'elemento XrGeospatialTrackerANDROID specificato in XrGeospatialAnchorCreateInfoANDROID :: geospatialTracker non è nello stato XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID, il runtime deve restituire XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID .
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere attivata prima di chiamare xrCreateGeospatialAnchorANDROID -
spatialContextdeve essere un handle XrSpatialContextEXT valido -
createInfodeve essere un puntatore a una struttura XrGeospatialAnchorCreateInfoANDROID valida -
anchorEntityIddeve essere un puntatore a un valoreXrSpatialEntityIdEXT
Codici di risposta
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_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
La struttura XrGeospatialAnchorCreateInfoANDROID è definita come:
typedef struct XrGeospatialAnchorCreateInfoANDROID {
XrStructureType type;
const void* next;
XrGeospatialTrackerANDROID geospatialTracker;
XrGeospatialPoseANDROID geospatialPose;
} XrGeospatialAnchorCreateInfoANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.geospatialTrackerè l'oggetto XrGeospatialTrackerANDROID da utilizzare per creare l'ancoraggio.geospatialPoseè un puntatore a XrGeospatialPoseANDROID che definisce la posizione e l'orientamento dell'ancoraggio.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere abilitata prima di utilizzare XrGeospatialAnchorCreateInfoANDROID -
typedeve essereXR_TYPE_GEOSPATIAL_ANCHOR_CREATE_INFO_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
geospatialTrackerdeve essere un handle XrGeospatialTrackerANDROID valido -
geospatialPosedeve essere una struttura XrGeospatialPoseANDROID valida
Ancoraggi di superficie
Le ancora di superficie sono ancore posizionate rispetto a una superficie, come il terreno o i tetti.
L'enumerazione XrSurfaceAnchorTypeANDROID è definita come:
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;
L'enumerazione XrSurfaceAnchorTypeANDROID specifica il tipo di superficie a cui è relativo un ancoraggio.
Gli enumeratori hanno i seguenti valori:
Descrizione enum
XR_SURFACE_ANCHOR_TYPE_TERRAIN_ANDROID
Tipo di ancoraggio posizionato rispetto al suolo.
XR_SURFACE_ANCHOR_TYPE_ROOFTOP_ANDROID
Tipo di ancoraggio posizionato rispetto al tetto o al suolo dove non è presente un edificio.
La funzione xrCreateSurfaceAnchorAsyncANDROID è definita come:
XrResult xrCreateSurfaceAnchorAsyncANDROID(
XrSpatialContextEXT spatialContext,
const XrSurfaceAnchorCreateInfoANDROID* createInfo,
XrFutureEXT* future);
Descrizioni dei parametri
spatialContextè l'XrSpatialContextEXT in cui creare l'ancoraggio.createInfoè un puntatore a XrSurfaceAnchorCreateInfoANDROID contenente i parametri di creazione dell'ancoraggio.futureè un puntatore aXrFutureEXTche conterrà il risultato dell'operazione asincrona.
La funzione xrCreateSurfaceAnchorAsyncANDROID avvia un'operazione asincrona per creare un ancoraggio di superficie. A differenza degli ancoraggi geospaziali standard, il runtime potrebbe recuperare i dati del terreno per determinare l'altitudine corretta. Il runtime deve restituire XR_ERROR_LIMIT_REACHED se l'applicazione tenta di creare più di XrSystemGeospatialAnchorPropertiesANDROID :: maxSurfaceAnchorCount ancoraggi di superficie alla volta. Se XrGeospatialTrackerANDROID specificato in XrSurfaceAnchorCreateInfoANDROID :: geospatialTracker non è nello stato XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID, il runtime deve restituire XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID . L'operazione potrebbe non riuscire in modo asincrono con il risultato XR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROID se non sono presenti dati sulla superficie per la località specificata. Il runtime deve restituire XR_ERROR_VALIDATION_FAILURE se XR_SPATIAL_CAPABILITY_ANCHOR_EXT non è stato configurato per spatialContext .
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere abilitata prima di chiamare xrCreateSurfaceAnchorAsyncANDROID -
spatialContextdeve essere un handle XrSpatialContextEXT valido -
createInfodeve essere un puntatore a una struttura XrSurfaceAnchorCreateInfoANDROID valida -
futuredeve essere un puntatore a un valoreXrFutureEXT
Codici di risposta
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_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
La struttura XrSurfaceAnchorCreateInfoANDROID è definita come:
typedef struct XrSurfaceAnchorCreateInfoANDROID {
XrStructureType type;
const void* next;
XrGeospatialTrackerANDROID geospatialTracker;
XrSurfaceAnchorTypeANDROID surfaceAnchorType;
XrQuaternionf eastUpSouthOrientation;
double latitude;
double longitude;
double altitudeRelativeToSurface;
} XrSurfaceAnchorCreateInfoANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.geospatialTrackerè l'oggetto XrGeospatialTrackerANDROID da utilizzare.surfaceAnchorTypeè l'XrSurfaceAnchorTypeANDROID per l'ancoraggio.eastUpSouthOrientationè l'orientamento rispetto a un sistema di coordinate in cui +X=Est, +Y=Su e +Z=Sud.latitudeè la latitudine in gradi, compresa tra -89,9 e +89,9.longitudeè la longitudine in gradi, compresa tra -180 e +180.altitudeRelativeToSurfaceè l'altitudine in metri rispetto alla superficie specificata dasurfaceAnchorType.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere abilitata prima di utilizzare XrSurfaceAnchorCreateInfoANDROID -
typedeve essereXR_TYPE_SURFACE_ANCHOR_CREATE_INFO_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
geospatialTrackerdeve essere un handle XrGeospatialTrackerANDROID valido -
surfaceAnchorTypedeve essere un valore XrSurfaceAnchorTypeANDROID valido -
latitudedeve essere un valoredoublevalido -
longitudedeve essere un valoredoublevalido -
altitudeRelativeToSurfacedeve essere un valoredoublevalido
La funzione xrCreateSurfaceAnchorCompleteANDROID è definita come:
XrResult xrCreateSurfaceAnchorCompleteANDROID(
XrSpatialContextEXT spatialContext,
XrFutureEXT future,
XrSurfaceAnchorCreateCompletionANDROID* completion);
Descrizioni dei parametri
spatialContextè l'oggetto XrSpatialContextEXT utilizzato per la creazione.futureè ilXrFutureEXTrestituito da xrCreateSurfaceAnchorAsyncANDROID .completionè un puntatore a XrSurfaceAnchorCreateCompletionANDROID che riceve il risultato.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere attivata prima di chiamare xrCreateSurfaceAnchorCompleteANDROID -
spatialContextdeve essere un handle XrSpatialContextEXT valido -
completiondeve essere un puntatore a una struttura XrSurfaceAnchorCreateCompletionANDROID
Codici di risposta
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
La struttura XrSurfaceAnchorCreateCompletionANDROID contiene il risultato di una creazione asincrona di un ancoraggio di superficie.
typedef struct XrSurfaceAnchorCreateCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrSpatialEntityIdEXT anchorEntityId;
} XrSurfaceAnchorCreateCompletionANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.futureResultè l'XrResult dell'operazione di creazione. SefutureResultèXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID, una struttura nella catenanextpotrebbe fornire ulteriori informazioni sull'errore.anchorEntityIdè ilXrSpatialEntityIdEXTdell'ancoraggio creato o XR_NULL_SPATIAL_ENTITY_ID_EXT sefutureResultnon èXR_SUCCESS.
Codici di reso futuri
Valori 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
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatial_anchordeve essere abilitata prima di utilizzare XrSurfaceAnchorCreateCompletionANDROID -
typedeve essereXR_TYPE_SURFACE_ANCHOR_CREATE_COMPLETION_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
futureResultdeve essere un valore XrResult valido
Esempio
Crea un ancoraggio del 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.
}
Nuovi comandi
- xrCreateGeospatialAnchorANDROID
- xrCreateSurfaceAnchorAsyncANDROID
- xrCreateSurfaceAnchorCompleteANDROID
Nuove strutture
- XrGeospatialAnchorCreateInfoANDROID
- XrSurfaceAnchorCreateCompletionANDROID
- XrSurfaceAnchorCreateInfoANDROID
Estensione di XrGeospatialTrackerCreateInfoANDROID :
Estensione di XrSystemProperties :
Nuovi enum
Nuove costanti enum
XR_ANDROID_GEOSPATIAL_ANCHOR_EXTENSION_NAMEXR_ANDROID_geospatial_anchor_SPEC_VERSIONEstensione di XrResult :
XR_ERROR_SURFACE_ANCHOR_LOCATION_UNSUPPORTED_ANDROID
Estensione di 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
Problemi
Cronologia delle versioni
Revisione 1, 30/10/2025 (Ben King)
- Bozza iniziale.