XR_ANDROID_geospatial
Stringa del nome
XR_ANDROID_geospatial
Tipo di estensione
Estensione dell'istanza
Numero di interno registrato
790
Revisione
1
Stato di ratifica
Non ratificato
Dipendenze da estensioni e versioni
XR_EXT_future
Data ultima modifica
2025-12-18
Stato IP
Nessuna rivendicazione di proprietà intellettuale nota.
Collaboratori
John Ullman, Google
Ben King, Google
Nihav Jain, Google
Jared Finder, Google
Panoramica
Questa estensione fornisce il monitoraggio geospaziale per l'API Geospatial di Google, che fornisce orientamento e geolocalizzazione precisi e consente all'applicazione di posizionare i contenuti rispetto alla Terra. A questo scopo, utilizza una combinazione di rilevamento del movimento, GPS e altri sensori, nonché il sistema di posizionamento visivo (VPS) di Google. Il VPS confronta le immagini della fotocamera di un dispositivo con le immagini di Street View per determinare una posizione esatta e un orientamento precisi. L'API Geospatial spesso fornisce una precisione di posizionamento inferiore al metro (ordini di grandezza migliore del GPS) e una precisione di orientamento inferiore al grado.
Per utilizzare correttamente le API in questa estensione (oltre a verificare il supporto dell'estensione), l'applicazione deve aver impostato correttamente le credenziali di autenticazione tramite un meccanismo, ad esempio XR_ANDROID_google_cloud_auth . Per ulteriori dettagli sulla configurazione e sui risultati degli errori, consulta la documentazione dell'estensione di autenticazione.
Autorizzazioni
Per utilizzare questa estensione, le applicazioni Android devono avere l'autorizzazione android.permission.ACCESS_FINE_LOCATION elencata nel file manifest. L'autorizzazione android.permission.ACCESS_FINE_LOCATION è considerata pericolosa. L'applicazione deve richiedere l'autorizzazione in fase di runtime per utilizzare queste funzioni:
(livello di protezione: pericoloso)
Ispezionare la funzionalità del sistema
La struttura XrSystemGeospatialPropertiesANDROID è definita come:
typedef struct XrSystemGeospatialPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsGeospatial;
} XrSystemGeospatialPropertiesANDROID;
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.supportsGeospatialè unXrBool32, che indica se il sistema attuale supporta le funzionalità geospaziali.
Un'applicazione può verificare se il sistema supporta le funzionalità geospaziali concatenando una struttura XrSystemGeospatialPropertiesANDROID alla struttura XrSystemProperties quando chiama xrGetSystemProperties .
Se un runtime restituisce XR_FALSE per supportsGeospatial , il sistema non supporta le funzionalità geospaziali, pertanto deve restituire XR_ERROR_FEATURE_UNSUPPORTED da xrCreateGeospatialTrackerANDROID . L'applicazione deve evitare di utilizzare la funzionalità geospaziale quando supportsGeospatial è XR_FALSE .
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di utilizzare XrSystemGeospatialPropertiesANDROID -
typedeve essereXR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
Creare un handle di monitoraggio geospaziale
XR_DEFINE_HANDLE(XrGeospatialTrackerANDROID)
La funzione xrCreateGeospatialTrackerANDROID è definita come:
XrResult xrCreateGeospatialTrackerANDROID(
XrSession session,
const XrGeospatialTrackerCreateInfoANDROID* createInfo,
XrGeospatialTrackerANDROID* geospatialTrackerOutput);
Descrizioni dei parametri
sessionè una XrSession in cui il tracker geospaziale sarà attivo.createInfoè un puntatore a una struttura XrGeospatialTrackerCreateInfoANDROID che specifica i parametri iniziali del tracker geospaziale.geospatialTrackerOutputè un puntatore a un handle in cui viene restituito l'oggetto XrGeospatialTrackerANDROID creato.
Un'applicazione può creare un handle XrGeospatialTrackerANDROID chiamando xrCreateGeospatialTrackerANDROID . L'handle XrGeospatialTrackerANDROID restituito può essere utilizzato successivamente nelle chiamate API. Se l'applicazione non ha ottenuto le autorizzazioni richieste, il runtime deve restituire XR_ERROR_PERMISSION_INSUFFICIENT . Può esistere un solo XrGeospatialTrackerANDROID alla volta per una determinata XrSession . L'applicazione deve assicurarsi che tutti gli oggetti XrGeospatialTrackerANDROID precedenti siano stati eliminati prima di chiamare di nuovo questa funzione, altrimenti il runtime deve restituire XR_ERROR_LIMIT_REACHED . Se il tracker viene creato correttamente, inizialmente entra nello stato XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID e l'applicazione deve attendere che lo stato cambi in XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID prima di utilizzare il tracker. Vedi XrEventDataGeospatialTrackerStateChangedANDROID . Se l'applicazione passa un XrGeospatialTrackerANDROID che non si trova nello stato XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID a una funzione che lo richiede, il runtime deve restituire XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID .
L'handle XrGeospatialTrackerANDROID deve essere liberato tramite la funzione xrDestroyGeospatialTrackerANDROID.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di chiamare xrCreateGeospatialTrackerANDROID -
sessiondeve essere un handle XrSession valido -
createInfodeve essere un puntatore a una struttura XrGeospatialTrackerCreateInfoANDROID valida -
geospatialTrackerOutputdeve essere un puntatore a un handle XrGeospatialTrackerANDROID
Codici di ritorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
La struttura XrGeospatialTrackerCreateInfoANDROID è definita come:
typedef struct XrGeospatialTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrGeospatialTrackerCreateInfoANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di utilizzare XrGeospatialTrackerCreateInfoANDROID -
typedeve essereXR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture . Vedi anche: XrGeospatialTrackerAnchorTrackingInfoANDROID
La funzione xrDestroyGeospatialTrackerANDROID è definita come:
XrResult xrDestroyGeospatialTrackerANDROID(
XrGeospatialTrackerANDROID geospatialTracker);
Descrizioni dei parametri
geospatialTrackerè XrGeospatialTrackerANDROID da eliminare.
Un'applicazione può utilizzare la funzione xrDestroyGeospatialTrackerANDROID per rilasciare il tracker geospaziale e le risorse sottostanti.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di chiamare xrDestroyGeospatialTrackerANDROID -
geospatialTrackerdeve essere un handle XrGeospatialTrackerANDROID valido
Thread Safety
- L'accesso a
geospatialTrackere a tutti gli handle secondari deve essere sincronizzato esternamente
Codici di ritorno
XR_SUCCESS
XR_ERROR_CALL_ORDER_INVALIDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
Stato del tracker geospaziale
L'enumerazione XrGeospatialTrackerStateANDROID è definita come:
typedef enum XrGeospatialTrackerStateANDROID {
XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID = 0,
XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID = 1,
XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID = 2,
XR_GEOSPATIAL_TRACKER_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrGeospatialTrackerStateANDROID;
L'enumerazione XrGeospatialTrackerStateANDROID identifica i diversi stati di un tracker geospaziale.
Gli enumeranti hanno i seguenti valori:
Descrizione enum
XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID
Il tracker geospaziale non è in esecuzione.
XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID
Il tracker geospaziale è in esecuzione e utilizzabile.
XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID
Il tracker geospaziale non è stato inizializzato e non sarà mai utilizzabile.
La struttura XrEventDataGeospatialTrackerStateChangedANDROID è definita come:
typedef struct XrEventDataGeospatialTrackerStateChangedANDROID {
XrStructureType type;
const void* next;
XrGeospatialTrackerANDROID geospatialTracker;
XrGeospatialTrackerStateANDROID state;
XrResult initializationResult;
XrTime time;
} XrEventDataGeospatialTrackerStateChangedANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.geospatialTrackerè XrGeospatialTrackerANDROID il cui stato è cambiato.stateè il nuovo XrGeospatialTrackerStateANDROID .initializationResultè il risultato dell'errore sestateèXR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID, altrimentiXR_SUCCESS.timeè ilXrTimein cui si è verificata la modifica dello stato.
La struttura XrEventDataGeospatialTrackerStateChangedANDROID viene inviata quando cambia lo stato del tracker geospaziale. Se l'applicazione ha un XrGeospatialTrackerANDROID valido , deve eseguire il polling per questo evento. Il primo evento ricevuto per un tracker avrà state XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID . Dopo un periodo di tempo determinato in fase di runtime, lo stato deve passare a XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID o XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID . Questa transizione richiederà un periodo di tempo arbitrario. Se state cambia in XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID, deve essere l'ultimo evento ricevuto per questo tracker e il campo initializationResult conterrà il codice di errore. Potrebbero essere necessari diversi secondi prima che si verifichi un errore. In questo caso, l'applicazione deve eliminare il tracker. Se state cambia in XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID , tutti gli ancoraggi geospaziali creati in precedenza devono interrompere definitivamente il monitoraggio e devono essere distrutti dall'applicazione. Lo stato potrebbe cambiare più volte tra XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID e XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere abilitata prima di utilizzare XrEventDataGeospatialTrackerStateChangedANDROID -
typedeve essereXR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
Posizione geospaziale
La struttura XrGeospatialPoseANDROID è definita come:
typedef struct XrGeospatialPoseANDROID {
XrQuaternionf eastUpSouthOrientation;
double latitude;
double longitude;
double altitude;
} XrGeospatialPoseANDROID;
Descrizioni dei membri
eastUpSouthOrientationè un XrQuaternionf che definisce l'orientamento rispetto a un sistema di coordinate in cui +X=Est, +Y=Su e +Z=Sud.latitudeè la latitudine in gradi, compresa tra -90 e +90.longitudeè la longitudine in gradi, compresa tra -180 e +180.altitudeè l'altitudine in metri sopra l'ellissoide WGS84.
La struttura XrGeospatialPoseANDROID rappresenta una posizione e un orientamento rispetto alla Terra utilizzando l'ellissoide WGS84.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di utilizzare XrGeospatialPoseANDROID -
latitudedeve essere un valoredoublevalido -
longitudedeve essere un valoredoublevalido -
altitudedeve essere un valoredoublevalido
L'enumerazione XrGeospatialPoseFlagBitsANDROID è definita come:
// Flag bits for XrGeospatialPoseFlagsANDROID
static const XrGeospatialPoseFlagsANDROID XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID = 0x00000001;
static const XrGeospatialPoseFlagsANDROID XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID = 0x00000002;
L'enumerazione XrGeospatialPoseFlagBitsANDROID specifica i flag per le pose geospaziali.
I bit di flag hanno i seguenti significati:
Descrizioni dei flag
XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID: indica che il membro dell'orientamento contiene dati validiXR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID: indica che il membro della posizione contiene dati validi
Il tipo XrGeospatialPoseFlagsANDROID è una maschera di bit di XrGeospatialPoseFlagBitsANDROID .
typedef XrFlags64 XrGeospatialPoseFlagsANDROID;
Conversione di XrPosef in Geospatial Pose
La funzione xrLocateGeospatialPoseFromPoseANDROID è definita come:
XrResult xrLocateGeospatialPoseFromPoseANDROID(
XrGeospatialTrackerANDROID geospatialTracker,
const XrGeospatialPoseFromPoseLocateInfoANDROID* locateInfo,
XrGeospatialPoseResultANDROID* geospatialPoseResult);
Descrizioni dei parametri
geospatialTrackerè XrGeospatialTrackerANDROID da utilizzare per la conversione.locateInfoè un puntatore a XrGeospatialPoseFromPoseLocateInfoANDROID contenente i parametri di query.geospatialPoseResultè un puntatore a XrGeospatialPoseResultANDROID che riceve il risultato.
La funzione xrLocateGeospatialPoseFromPoseANDROID converte una posa in XrGeospatialPoseFromPoseLocateInfoANDROID :: space in una posa geospaziale. Se lo stato di geospatialTracker non è XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID , il runtime deve restituire XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID . Se la funzione restituisce XR_SUCCESS , il campo XrGeospatialPoseResultANDROID :: poseFlags di geospatialPoseResult determina quali campi di output sono validi. Se XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID non è impostato in XrGeospatialPoseResultANDROID :: poseFlags , l'applicazione non deve leggere i campi XrGeospatialPoseANDROID :: latitude , XrGeospatialPoseANDROID :: longitude , XrGeospatialPoseANDROID :: altitude , XrGeospatialPoseResultANDROID :: horizontalAccuracy o XrGeospatialPoseResultANDROID :: verticalAccuracy in XrGeospatialPoseResultANDROID . Se XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID non è impostato in XrGeospatialPoseResultANDROID :: poseFlags , l'applicazione non deve leggere XrGeospatialPoseANDROID :: eastUpSouthOrientation o XrGeospatialPoseResultANDROID :: orientationYawAccuracy . Se XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID non è impostato, XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID non deve essere impostato.
Se la precisione è inferiore al previsto, questo potrebbe indicare che il dispositivo non utilizza la localizzazione VPS. L'applicazione può chiedere all'utente di puntare il dispositivo verso cartelli e edifici per migliorare la localizzazione.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di chiamare xrLocateGeospatialPoseFromPoseANDROID -
geospatialTrackerdeve essere un handle XrGeospatialTrackerANDROID valido -
locateInfodeve essere un puntatore a una struttura XrGeospatialPoseFromPoseLocateInfoANDROID valida -
geospatialPoseResultdeve essere un puntatore a una struttura XrGeospatialPoseResultANDROID
Codici di ritorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROIDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
La struttura XrGeospatialPoseFromPoseLocateInfoANDROID è definita come:
typedef struct XrGeospatialPoseFromPoseLocateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrPosef pose;
} XrGeospatialPoseFromPoseLocateInfoANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.spaceè lo XrSpace in cui è definitopose.timeè ilXrTimein cui valutarepose.poseè XrPosef inspaceda convertire in una posa geospaziale.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di utilizzare XrGeospatialPoseFromPoseLocateInfoANDROID -
typedeve essereXR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
spacedeve essere un handle XrSpace valido
La struttura XrGeospatialPoseResultANDROID è definita come:
typedef struct XrGeospatialPoseResultANDROID {
XrStructureType type;
void* next;
XrGeospatialPoseFlagsANDROID poseFlags;
XrGeospatialPoseANDROID geospatialPose;
double horizontalAccuracy;
double verticalAccuracy;
double orientationYawAccuracy;
} XrGeospatialPoseResultANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.poseFlagsè una maschera di bit di XrGeospatialPoseFlagsANDROID che indica la validità dei componenti della posa.geospatialPoseè XrGeospatialPoseANDROID risultante .horizontalAccuracyè l'accuratezza orizzontale stimata della posizione della postura spaziale, definita come il raggio in metri del cerchio con un livello di confidenza del 68% intorno alla latitudine e alla longitudine indicate.verticalAccuracyè la precisione verticale stimata della posizione della postura spaziale, definita come la distanza in metri del livello di confidenza del 68% intorno all'altitudine specificata. In altre parole, c'è una probabilità del 68% che l'altitudine reale si trovi nell'intervallo [ XrGeospatialPoseANDROID ::altitude-verticalAccuracy, XrGeospatialPoseANDROID ::altitude\+verticalAccuracy].orientationYawAccuracyè l'accuratezza stimata dell'orientamento della postura geospaziale, definita come il raggio in gradi del livello di confidenza del 68% intorno all'orientamento specificato.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di utilizzare XrGeospatialPoseResultANDROID -
typedeve essereXR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture
Conversione di una posa geospaziale in un XrPosef
La funzione xrLocateGeospatialPoseANDROID è definita come:
XrResult xrLocateGeospatialPoseANDROID(
XrGeospatialTrackerANDROID geospatialTracker,
const XrGeospatialPoseLocateInfoANDROID* locateInfo,
XrSpaceLocation* location);
Descrizioni dei parametri
geospatialTrackerè XrGeospatialTrackerANDROID da utilizzare per la conversione.locateInfoè un puntatore a XrGeospatialPoseLocateInfoANDROID contenente i parametri di query.locationè un puntatore a XrSpaceLocation che riceve la posa risultante.
La funzione xrLocateGeospatialPoseANDROID converte una posa geospaziale in un XrSpaceLocation . Se XrGeospatialTrackerANDROID non è in esecuzione, il runtime deve restituire XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID . Se la funzione restituisce XR_SUCCESS , il campo XrSpaceLocation :: locationFlags di location determina quali campi di output sono validi.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di chiamare xrLocateGeospatialPoseANDROID -
geospatialTrackerdeve essere un handle XrGeospatialTrackerANDROID valido -
locateInfodeve essere un puntatore a una struttura XrGeospatialPoseLocateInfoANDROID valida -
locationdeve essere un puntatore a una struttura XrSpaceLocation
Codici di ritorno
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_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
La struttura XrGeospatialPoseLocateInfoANDROID è definita come:
typedef struct XrGeospatialPoseLocateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrGeospatialPoseANDROID geospatialPose;
} XrGeospatialPoseLocateInfoANDROID;
Descrizioni dei membri
typeè l'XrStructureType di questa struttura.nextèNULLo un puntatore alla struttura successiva in una catena di strutture.spaceè l'XrSpace in cui verrà rappresentata la posa risultante.timeè ilXrTimein cui individuare la posa.geospatialPoseè XrGeospatialPoseANDROID da convertire.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di utilizzare XrGeospatialPoseLocateInfoANDROID -
typedeve essereXR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
spacedeve essere un handle XrSpace valido -
geospatialPosedeve essere una struttura XrGeospatialPoseANDROID valida
Disponibilità di VPS
L'enumerazione XrVPSAvailabilityANDROID è definita come:
typedef enum XrVPSAvailabilityANDROID {
XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID = 1,
XR_VPS_AVAILABILITY_AVAILABLE_ANDROID = 2,
XR_VPSAVAILABILITY_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrVPSAvailabilityANDROID;
L'enumerazione XrVPSAvailabilityANDROID indica la disponibilità di VPS.
Gli enumeranti hanno i seguenti valori:
Descrizione enum
XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID
VPS non è disponibile vicino alla posizione indicata.
XR_VPS_AVAILABILITY_AVAILABLE_ANDROID
Il VPS è disponibile vicino alla posizione specificata.
La funzione xrCheckVpsAvailabilityAsyncANDROID è definita come:
XrResult xrCheckVpsAvailabilityAsyncANDROID(
XrSession session,
double latitude,
double longitude,
XrFutureEXT* future);
Descrizioni dei parametri
sessionè l'XrSession da utilizzare per il controllo.latitudeè la latitudine in gradi.longitudeè la longitudine in gradi.futureè un puntatore aXrFutureEXTche conterrà il risultato dell'operazione asincrona.
La disponibilità del servizio di posizionamento visivo (VPS) indica se il VPS può essere utilizzato per migliorare l'accuratezza geospaziale in una determinata posizione.
La funzione xrCheckVpsAvailabilityAsyncANDROID avvia un controllo asincrono della disponibilità di VPS in una determinata posizione. L'applicazione non ha bisogno di un XrGeospatialTrackerANDROID per chiamare questa funzione e può utilizzare il risultato di questa operazione per decidere se crearne uno. Se l'applicazione non ha ottenuto le autorizzazioni richieste, il runtime deve restituire XR_ERROR_PERMISSION_INSUFFICIENT .
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di chiamare xrCheckVpsAvailabilityAsyncANDROID -
sessiondeve essere un handle XrSession valido -
latitudedeve essere un valoredoublevalido -
longitudedeve essere un valoredoublevalido -
futuredeve essere un puntatore a un valoreXrFutureEXT
Codici di ritorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
La funzione xrCheckVpsAvailabilityCompleteANDROID è definita come segue:
XrResult xrCheckVpsAvailabilityCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrVPSAvailabilityCheckCompletionANDROID* completion);
Descrizioni dei parametri
sessionè l'XrSession utilizzato per il controllo.futureè ilXrFutureEXTrestituito da xrCheckVpsAvailabilityAsyncANDROID .completionè un puntatore a XrVPSAvailabilityCheckCompletionANDROID che riceve il risultato.
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di chiamare xrCheckVpsAvailabilityCompleteANDROID -
sessiondeve essere un handle XrSession valido -
completiondeve essere un puntatore a una struttura XrVPSAvailabilityCheckCompletionANDROID
Codici di ritorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
La struttura XrVPSAvailabilityCheckCompletionANDROID è definita come:
typedef struct XrVPSAvailabilityCheckCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrVPSAvailabilityANDROID availability;
} XrVPSAvailabilityCheckCompletionANDROID;
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 controllo. SefutureResultèXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID, una struttura nella catenanextpotrebbe fornire maggiori informazioni sull'errore.availabilityè il valore risultante di XrVPSAvailabilityANDROID . L'applicazione non deve leggere questo campo a meno chefutureResultnon siaXR_SUCCESS.
Codici di reso futuri
Valori futureResult:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID
Utilizzo valido (implicito)
- L'estensione
XR_ANDROID_geospatialdeve essere attivata prima di utilizzare XrVPSAvailabilityCheckCompletionANDROID -
typedeve essereXR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID -
nextdeve essereNULLo un puntatore valido alla struttura successiva in una catena di strutture -
futureResultdeve essere un valore XrResult valido -
availabilitydeve essere un valore XrVPSAvailabilityANDROID valido
Esempio
Configurare il tracker geospaziale
PFN_xrCheckVpsAvailabilityAsyncANDROID xrCheckVpsAvailabilityAsyncANDROID;
PFN_xrPollFutureEXT xrPollFutureEXT;
PFN_xrCheckVpsAvailabilityCompleteANDROID xrCheckVpsAvailabilityCompleteANDROID;
PFN_xrCreateGeospatialTrackerANDROID xrCreateGeospatialTrackerANDROID;
XrInstance instance = XR_NULL_HANDLE;
XrSystemId systemId = XR_NULL_SYSTEM_ID;
XrSession session = XR_NULL_HANDLE;
double lat = 37.422, lng = -122.084;
// Check for support.
XrSystemGeospatialPropertiesANDROID geospatialSystemProperties{
XR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{XR_TYPE_SYSTEM_PROPERTIES,
&geospatialSystemProperties};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (!geospatialSystemProperties.supportsGeospatial) {
return;
}
// Check VPS Availability.
XrFutureEXT future = XR_NULL_FUTURE_EXT;
CHK_XR(xrCheckVpsAvailabilityAsyncANDROID(session, lat, lng, &future));
XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
pollInfo.future = future;
pollResult.state = XR_FUTURE_STATE_PENDING_EXT;
while (pollResult.state == XR_FUTURE_STATE_PENDING_EXT) {
// Do in render loop/state loop.
CHK_XR(xrPollFutureEXT(instance, &pollInfo, &pollResult));
}
XrVPSAvailabilityCheckCompletionANDROID vpsCompletion{
XR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID};
CHK_XR(xrCheckVpsAvailabilityCompleteANDROID(session, future, &vpsCompletion));
if (vpsCompletion.futureResult == XR_SUCCESS) {
if (vpsCompletion.availability == XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID) {
// Visual Positioning Service is not available. Accuracy of positions and
// orientations from Geospatial APIs are expected to be lower at this location.
} else {
// Visual Positioning Service is available. Higher accuracy of position and
// orientation is achievable at this location.
}
}
// Create Geospatial Tracker.
XrGeospatialTrackerCreateInfoANDROID createInfo{
XR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROID};
XrGeospatialTrackerANDROID geospatialTracker = XR_NULL_HANDLE;
CHK_XR(xrCreateGeospatialTrackerANDROID(session, &createInfo, &geospatialTracker));
// In application main event loop:
while (true) {
XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
if (xrPollEvent(instance, &event) != XR_SUCCESS) {
continue;
}
switch (event.type) {
case XR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROID:
const XrEventDataGeospatialTrackerStateChangedANDROID& eventData =
*reinterpret_cast<XrEventDataGeospatialTrackerStateChangedANDROID*>(&event);
switch (eventData.state) {
case XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID:
// Destroy existing anchors, if any.
break;
case XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID:
// Start adding content.
break;
case XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID:
// Handle eventData.initializationResult error result.
break;
}
}
}
Chiamare le API Geospatial Pose
PFN_xrLocateGeospatialPoseFromPoseANDROID xrLocateGeospatialPoseFromPoseANDROID;
PFN_xrLocateGeospatialPoseANDROID xrLocateGeospatialPoseANDROID;
XrGeospatialTrackerANDROID geospatialTracker;
// Get pose from view space.
XrSpace viewSpace;
XrPosef identityPose = {{0,0,0,1},{0,0,0}};
XrGeospatialPoseFromPoseLocateInfoANDROID poseGetInfo{
XR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROID};
XrGeospatialPoseResultANDROID poseResult{
XR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROID};
poseGetInfo.space = viewSpace;
poseGetInfo.pose = identityPose;
poseGetInfo.time = 0; // Next frame timestamp.
CHK_XR(xrLocateGeospatialPoseFromPoseANDROID(geospatialTracker, &poseGetInfo, &poseResult));
if ((poseResult.poseFlags & XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID) &&
(poseResult.poseFlags & XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID)) {
// poseResult.geospatialPose is valid.
}
// Convert Geospatial pose to an XrSpaceLocation.
XrGeospatialPoseLocateInfoANDROID poseLocateInfo{
XR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROID};
XrSpaceLocation location{XR_TYPE_SPACE_LOCATION};
poseLocateInfo.space = viewSpace;
poseLocateInfo.geospatialPose = poseResult.geospatialPose;
poseLocateInfo.time = 0; // Next frame timestamp.
CHK_XR(xrLocateGeospatialPoseANDROID(geospatialTracker, &poseLocateInfo, &location));
if ((location.locationFlags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) &&
(location.locationFlags & XR_SPACE_LOCATION_POSITION_VALID_BIT)) {
// location.pose is valid.
}
Nuovi tipi di oggetti
Nuovi comandi
- xrCheckVpsAvailabilityAsyncANDROID
- xrCheckVpsAvailabilityCompleteANDROID
- xrCreateGeospatialTrackerANDROID
- xrDestroyGeospatialTrackerANDROID
- xrLocateGeospatialPoseANDROID
- xrLocateGeospatialPoseFromPoseANDROID
Nuove strutture
- XrEventDataGeospatialTrackerStateChangedANDROID
- XrGeospatialPoseANDROID
- XrGeospatialPoseFromPoseLocateInfoANDROID
- XrGeospatialPoseLocateInfoANDROID
- XrGeospatialPoseResultANDROID
- XrGeospatialTrackerCreateInfoANDROID
- XrVPSAvailabilityCheckCompletionANDROID
Estensione di XrSystemProperties :
Nuovi enum
Nuove maschere di bit
Nuove costanti enum
XR_ANDROID_GEOSPATIAL_EXTENSION_NAMEXR_ANDROID_geospatial_SPEC_VERSIONEstensione di XrObjectType :
XR_OBJECT_TYPE_GEOSPATIAL_TRACKER_ANDROID
Estensione di XrResult :
XR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROIDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
Estensione di XrStructureType :
XR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROIDXR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROIDXR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROIDXR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROIDXR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROIDXR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID
Problemi
Cronologia delle versioni
Revisione 1, 18/12/2025 (Ben King)
- Descrizione iniziale dell'estensione.