XR_ANDROID_geospatial
Строка имени
XR_ANDROID_geospatial
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
790
Пересмотр
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
XR_EXT_future
Дата последнего изменения
2025-12-18
Статус IP
Известных претензий на интеллектуальную собственность нет.
Авторы
Джон Уллман, Google
Бен Кинг, Google
Нихав Джайн, Google
Джаред Финдер, Google
Обзор
Это расширение обеспечивает геопространственное отслеживание для API Google Geospatial, которое предоставляет точные географические координаты и ориентацию, а также позволяет приложению размещать контент относительно Земли. Для этого используется комбинация отслеживания движения, GPS и других датчиков, а также системы визуального позиционирования Google (VPS). VPS сравнивает изображения с камеры устройства с изображениями Street View, чтобы определить точное местоположение и ориентацию. API Geospatial часто обеспечивает точность позиционирования менее метра (на порядки лучше, чем GPS) и точность ориентации менее градуса.
Для успешного использования API этого расширения (за исключением проверки поддержки расширения) приложение должно успешно установить учетные данные аутентификации с помощью какого-либо механизма, например, XR_ANDROID_google_cloud_auth . Более подробную информацию о настройке и результатах ошибок см. в документации расширения аутентификации.
Разрешения
Для использования этого расширения приложениям Android необходимо указать в манифесте разрешение android.permission.ACCESS_FINE_LOCATION. Разрешение android.permission.ACCESS_FINE_LOCATION считается опасным. Приложение должно запрашивать это разрешение во время выполнения, чтобы использовать следующие функции:
(Уровень защиты: опасный)
Проверьте возможности системы.
Структура XrSystemGeospatialPropertiesANDROID определяется следующим образом:
typedef struct XrSystemGeospatialPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsGeospatial;
} XrSystemGeospatialPropertiesANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
nextравноNULLили указателю на следующую структуру в цепочке структур. В ядре OpenXR и в этом расширении такие структуры не определены. -
supportsGeospatial— это тип данныхXrBool32, указывающий, поддерживает ли текущая система геопространственные объекты.
Приложение может проверить, поддерживает ли система геопространственные объекты, связав структуру XrSystemGeospatialPropertiesANDROID со структурой XrSystemProperties при вызове метода xrGetSystemProperties .
Если среда выполнения возвращает XR_FALSE для supportsGeospatial , система не поддерживает геопространственные объекты и, следовательно, должна вернуть XR_ERROR_FEATURE_UNSUPPORTED из xrCreateGeospatialTrackerANDROID . Приложение должно избегать использования геопространственных функций, когда supportsGeospatial имеет значение XR_FALSE .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrSystemGeospatialPropertiesANDROID. -
typeдолжен бытьXR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур.
Создайте идентификатор геопространственного трекера.
XR_DEFINE_HANDLE(XrGeospatialTrackerANDROID)
Функция xrCreateGeospatialTrackerANDROID определена следующим образом:
XrResult xrCreateGeospatialTrackerANDROID(
XrSession session,
const XrGeospatialTrackerCreateInfoANDROID* createInfo,
XrGeospatialTrackerANDROID* geospatialTrackerOutput);
Описание параметров
-
session— это XrSession , в котором будет активен геопространственный трекер. -
createInfo— это указатель на структуру XrGeospatialTrackerCreateInfoANDROID , определяющую начальные параметры геопространственного трекера. -
geospatialTrackerOutput— это указатель на дескриптор, в котором возвращается созданный объект XrGeospatialTrackerANDROID .
Приложение может создать дескриптор XrGeospatialTrackerANDROID, вызвав функцию xrCreateGeospatialTrackerANDROID . Возвращенный дескриптор XrGeospatialTrackerANDROID может быть впоследствии использован в вызовах API. Если приложение не получило необходимые разрешения, среда выполнения должна вернуть XR_ERROR_PERMISSION_INSUFFICIENT . Для конкретной сессии XrSession может существовать только один объект XrGeospatialTrackerANDROID . Приложение должно убедиться, что все предыдущие объекты XrGeospatialTrackerANDROID были уничтожены, прежде чем снова вызывать эту функцию, в противном случае среда выполнения должна вернуть XR_ERROR_LIMIT_REACHED . Если трекер успешно создан, он изначально перейдет в состояние XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID , и приложение должно дождаться, пока состояние не изменится на XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID , прежде чем использовать трекер. См. XrEventDataGeospatialTrackerStateChangedANDROID . Если приложение передает в функцию, которая его требует, объект XrGeospatialTrackerANDROID , который не находится в состоянии XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID , среда выполнения должна вернуть XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID .
Дескриптор XrGeospatialTrackerANDROID необходимо в конечном итоге освободить с помощью функции xrDestroyGeospatialTrackerANDROID .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед вызовом функции xrCreateGeospatialTrackerANDROID. -
sessionдолжна быть действительным дескриптором XrSession. -
createInfoдолжна быть указателем на допустимую структуру XrGeospatialTrackerCreateInfoANDROID. -
geospatialTrackerOutputдолжен быть указателем на дескриптор объекта XrGeospatialTrackerANDROID.
Коды возврата
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_HANDLE_INVALID -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_LIMIT_REACHED -
XR_ERROR_OUT_OF_MEMORY -
XR_ERROR_PERMISSION_INSUFFICIENT -
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_SESSION_LOST -
XR_ERROR_VALIDATION_FAILURE
Структура XrGeospatialTrackerCreateInfoANDROID определяется следующим образом:
typedef struct XrGeospatialTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrGeospatialTrackerCreateInfoANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrGeospatialTrackerCreateInfoANDROID. -
typeдолжен бытьXR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROID -
nextдолжен бытьNULLили являться допустимым указателем на следующую структуру в цепочке структур . См. также: XrGeospatialTrackerAnchorTrackingInfoANDROID
Функция xrDestroyGeospatialTrackerANDROID определена следующим образом:
XrResult xrDestroyGeospatialTrackerANDROID(
XrGeospatialTrackerANDROID geospatialTracker);
Описание параметров
-
geospatialTracker— это XrGeospatialTrackerANDROID , который необходимо уничтожить.
Приложение может использовать функцию xrDestroyGeospatialTrackerANDROID для освобождения геопространственного трекера и связанных с ним ресурсов.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед вызовом функции xrDestroyGeospatialTrackerANDROID. -
geospatialTrackerдолжен быть допустимым дескриптором XrGeospatialTrackerANDROID.
Безопасность резьбы
- Доступ к
geospatialTrackerи любым дочерним элементам должен синхронизироваться извне.
Коды возврата
-
XR_SUCCESS
-
XR_ERROR_CALL_ORDER_INVALID -
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_HANDLE_INVALID
Состояние геопространственного трекера
Перечисление XrGeospatialTrackerStateANDROID определено следующим образом:
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;
Перечисление XrGeospatialTrackerStateANDROID определяет различные состояния геопространственного трекера.
Перечисляемые элементы имеют следующие значения:
Описание перечисления
XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID
Система отслеживания геопространственных данных не запущена.
XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID
Геопространственный трекер запущен и пригоден для использования.
XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID
Программа отслеживания геопространственных данных не смогла инициализироваться и никогда не будет готова к использованию.
Структура XrEventDataGeospatialTrackerStateChangedANDROID определяется следующим образом:
typedef struct XrEventDataGeospatialTrackerStateChangedANDROID {
XrStructureType type;
const void* next;
XrGeospatialTrackerANDROID geospatialTracker;
XrGeospatialTrackerStateANDROID state;
XrResult initializationResult;
XrTime time;
} XrEventDataGeospatialTrackerStateChangedANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
geospatialTracker— это объект XrGeospatialTrackerANDROID , состояние которого изменилось. -
state— это новый XrGeospatialTrackerStateANDROID . -
initializationResult— это результат ошибки, еслиstateравноXR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID, в противном случаеXR_SUCCESS. -
time— это значениеXrTime, в которое произошло изменение состояния.
Структура XrEventDataGeospatialTrackerStateChangedANDROID отправляется при изменении состояния геопространственного трекера. Если приложение имеет действительный объект XrGeospatialTrackerANDROID , оно должно опрашивать наличие этого события. Первое событие, полученное для трекера, будет иметь state XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID . По истечении времени, определяемого во время выполнения, состояние должно измениться либо на XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID , либо XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID . Этот переход займет произвольное количество времени. Если state изменяется на XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID , это должно быть последнее событие, полученное для этого трекера, и поле initializationResult будет содержать код ошибки. Для возникновения ошибки может потребоваться несколько секунд. В этом случае приложение должно уничтожить трекер. Если state изменяется на XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID , все ранее созданные геопространственные якоря должны навсегда прекратить отслеживание и быть уничтожены приложением. Состояние может произвольно многократно переключаться между XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID и XR_GEOSPATIAL_TRACKER_STATE_STOPPED_ANDROID .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrEventDataGeospatialTrackerStateChangedANDROID. -
typeдолжен бытьXR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур.
Геопространственная позиция
Структура XrGeospatialPoseANDROID определяется следующим образом:
typedef struct XrGeospatialPoseANDROID {
XrQuaternionf eastUpSouthOrientation;
double latitude;
double longitude;
double altitude;
} XrGeospatialPoseANDROID;
Описание участников
-
eastUpSouthOrientation— это XrQuaternionf, определяющий ориентацию относительно системы координат, где +X=восток, +Y=вверх и +Z=юг. -
latitude— это широта в градусах, в диапазоне от -90 до +90. -
longitude— это долгота в градусах, в диапазоне от -180 до +180. -
altitude— это высота в метрах над эллипсоидом WGS84.
Структура XrGeospatialPoseANDROID отображает положение и ориентацию относительно Земли с использованием эллипсоида WGS84.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrGeospatialPoseANDROID. -
latitudeдолжна быть допустимым значениемdouble -
longitudeдолжно быть допустимым значениемdouble -
altitudeдолжна быть допустимым значениемdouble
Перечисление XrGeospatialPoseFlagBitsANDROID определено следующим образом:
// 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;
Перечисление XrGeospatialPoseFlagBitsANDROID задает флаги для геопространственных поз.
Биты флага имеют следующее значение:
Описание флагов
-
XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID— указывает, что элемент ориентации содержит допустимые данные. -
XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID— указывает, что элемент позиции содержит допустимые данные.
Тип XrGeospatialPoseFlagsANDROID представляет собой битовую маску типа XrGeospatialPoseFlagBitsANDROID .
typedef XrFlags64 XrGeospatialPoseFlagsANDROID;
Преобразование XrPosef в геопространственную позу
Функция xrLocateGeospatialPoseFromPoseANDROID определена следующим образом:
XrResult xrLocateGeospatialPoseFromPoseANDROID(
XrGeospatialTrackerANDROID geospatialTracker,
const XrGeospatialPoseFromPoseLocateInfoANDROID* locateInfo,
XrGeospatialPoseResultANDROID* geospatialPoseResult);
Описание параметров
-
geospatialTracker— это XrGeospatialTrackerANDROID , который следует использовать для преобразования. -
locateInfo— это указатель на XrGeospatialPoseFromPoseLocateInfoANDROID , содержащий параметры запроса. -
geospatialPoseResult— это указатель на XrGeospatialPoseResultANDROID , который получает результат.
Функция xrLocateGeospatialPoseFromPoseANDROID преобразует позу в space XrGeospatialPoseFromPoseLocateInfoANDROID :: в геопространственную позу. Если состояние geospatialTracker не равно XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID , среда выполнения должна вернуть XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID . Если функция возвращает XR_SUCCESS , поле XrGeospatialPoseResultANDROID :: poseFlags объекта geospatialPoseResult определяет, какие выходные поля являются допустимыми. Если XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID не установлен в XrGeospatialPoseResultANDROID :: poseFlags , приложение не должно считывать поля XrGeospatialPoseANDROID :: latitude , XrGeospatialPoseANDROID :: longitude , XrGeospatialPoseANDROID :: altitude , XrGeospatialPoseResultANDROID :: horizontalAccuracy или XrGeospatialPoseResultANDROID :: verticalAccuracy в XrGeospatialPoseResultANDROID . Если в XrGeospatialPoseResultANDROID :: poseFlags не установлен параметр XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID , приложение не должно считывать данные из XrGeospatialPoseANDROID :: eastUpSouthOrientation или XrGeospatialPoseResultANDROID :: orientationYawAccuracy . Если XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID не установлен, то и XR_GEOSPATIAL_POSE_ORIENTATION_VALID_BIT_ANDROID также не должен быть установлен.
Если точность ниже ожидаемой, это может указывать на то, что устройство не использует локализацию VPS. Приложение может предложить пользователю направить устройство на вывески и здания для повышения точности определения местоположения.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед вызовом функции xrLocateGeospatialPoseFromPoseANDROID. -
geospatialTrackerдолжен быть допустимым дескриптором XrGeospatialTrackerANDROID. -
locateInfoдолжен быть указателем на допустимую структуру XrGeospatialPoseFromPoseLocateInfoANDROID. -
geospatialPoseResultдолжен быть указателем на структуру XrGeospatialPoseResultANDROID.
Коды возврата
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID -
XR_ERROR_HANDLE_INVALID -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_POSE_INVALID -
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_SESSION_LOST -
XR_ERROR_TIME_INVALID -
XR_ERROR_VALIDATION_FAILURE
Структура XrGeospatialPoseFromPoseLocateInfoANDROID определяется следующим образом:
typedef struct XrGeospatialPoseFromPoseLocateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrPosef pose;
} XrGeospatialPoseFromPoseLocateInfoANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
space— это XrSpace, в котором определяетсяpose. -
time— это значениеXrTimeв которое следует оценитьpose. -
pose— это XrPosef вspace, который необходимо преобразовать в геопространственную позу.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrGeospatialPoseFromPoseLocateInfoANDROID. -
typeдолжен бытьXR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
spaceдолжен быть допустимым дескриптором XrSpace.
Структура XrGeospatialPoseResultANDROID определяется следующим образом:
typedef struct XrGeospatialPoseResultANDROID {
XrStructureType type;
void* next;
XrGeospatialPoseFlagsANDROID poseFlags;
XrGeospatialPoseANDROID geospatialPose;
double horizontalAccuracy;
double verticalAccuracy;
double orientationYawAccuracy;
} XrGeospatialPoseResultANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
poseFlags— это битовая маска XrGeospatialPoseFlagsANDROID , указывающая на корректность компонентов позы. -
geospatialPose— это результирующий объект XrGeospatialPoseANDROID . -
horizontalAccuracy— это оценочная горизонтальная точность геопространственного положения, определяемая как радиус в метрах круга с уровнем достоверности 68% вокруг заданных широты и долготы. -
verticalAccuracy— это оценочная вертикальная точность геопространственного положения, определяемая как расстояние в метрах с уровнем достоверности 68% вокруг заданной высоты. Другими словами, существует 68% вероятность того, что истинная высота находится в диапазоне [ XrGeospatialPoseANDROID ::altitude-verticalAccuracy, XrGeospatialPoseANDROID ::altitude\+verticalAccuracy]. -
orientationYawAccuracy— это расчетная точность ориентации геопространственного положения по углу рыскания, определяемая как радиус в градусах с уровнем достоверности 68% вокруг заданной ориентации.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrGeospatialPoseResultANDROID. -
typeдолжен бытьXR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур.
Преобразование геопространственной позы в XrPosef
Функция xrLocateGeospatialPoseANDROID определена следующим образом:
XrResult xrLocateGeospatialPoseANDROID(
XrGeospatialTrackerANDROID geospatialTracker,
const XrGeospatialPoseLocateInfoANDROID* locateInfo,
XrSpaceLocation* location);
Описание параметров
-
geospatialTracker— это XrGeospatialTrackerANDROID , который следует использовать для преобразования. -
locateInfo— это указатель на XrGeospatialPoseLocateInfoANDROID , содержащий параметры запроса. -
location— это указатель на XrSpaceLocation , который получает результирующую позу.
Функция xrLocateGeospatialPoseANDROID преобразует геопространственную позу в XrSpaceLocation . Если XrGeospatialTrackerANDROID не запущен, среда выполнения должна вернуть XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID . Если функция возвращает XR_SUCCESS , поле XrSpaceLocation :: locationFlags объекта location определяет, какие выходные поля являются допустимыми.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед вызовом функции xrLocateGeospatialPoseANDROID. -
geospatialTrackerдолжен быть допустимым дескриптором XrGeospatialTrackerANDROID. -
locateInfoдолжен быть указателем на допустимую структуру XrGeospatialPoseLocateInfoANDROID. -
locationдолжен быть указателем на структуру XrSpaceLocation.
Коды возврата
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROID -
XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID -
XR_ERROR_HANDLE_INVALID -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_SESSION_LOST -
XR_ERROR_TIME_INVALID -
XR_ERROR_VALIDATION_FAILURE
Структура XrGeospatialPoseLocateInfoANDROID определяется следующим образом:
typedef struct XrGeospatialPoseLocateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrGeospatialPoseANDROID geospatialPose;
} XrGeospatialPoseLocateInfoANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
space— это XrSpace , в котором будет представлена результирующая поза. -
time— это значениеXrTimeв которое нужно определить позу. -
geospatialPose— это объект XrGeospatialPoseANDROID, который необходимо преобразовать.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrGeospatialPoseLocateInfoANDROID. -
typeдолжен бытьXR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
spaceдолжен быть допустимым дескриптором XrSpace. -
geospatialPoseдолжен быть допустимой структурой XrGeospatialPoseANDROID.
Доступность VPS
Перечисление XrVPSAvailabilityANDROID определяется следующим образом:
typedef enum XrVPSAvailabilityANDROID {
XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID = 1,
XR_VPS_AVAILABILITY_AVAILABLE_ANDROID = 2,
XR_VPSAVAILABILITY_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrVPSAvailabilityANDROID;
Перечисление XrVPSAvailabilityANDROID указывает на доступность VPS.
Перечисляемые элементы имеют следующие значения:
Описание перечисления
XR_VPS_AVAILABILITY_UNAVAILABLE_ANDROID
VPS недоступен в указанном месте.
XR_VPS_AVAILABILITY_AVAILABLE_ANDROID
VPS доступен в непосредственной близости от указанного местоположения.
Функция xrCheckVpsAvailabilityAsyncANDROID определена следующим образом:
XrResult xrCheckVpsAvailabilityAsyncANDROID(
XrSession session,
double latitude,
double longitude,
XrFutureEXT* future);
Описание параметров
-
session— это XrSession , который следует использовать для проверки. -
latitude— это широта в градусах. -
longitude— это долгота в градусах. -
future— это указатель наXrFutureEXT, который будет содержать результат асинхронной операции.
Доступность службы визуального позиционирования (VPS) указывает на то, можно ли использовать VPS для повышения точности геопространственных данных в данном месте.
Функция xrCheckVpsAvailabilityAsyncANDROID запускает асинхронную проверку доступности VPS в заданном местоположении. Приложению не требуется объект XrGeospatialTrackerANDROID для вызова этой функции, и оно может использовать результат этой операции для принятия решения о его создании. Если приложение не получило необходимые разрешения, среда выполнения должна вернуть XR_ERROR_PERMISSION_INSUFFICIENT .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед вызовом функции xrCheckVpsAvailabilityAsyncANDROID. -
sessionдолжна быть действительным дескриптором XrSession. -
latitudeдолжна быть допустимым значениемdouble -
longitudeдолжно быть допустимым значениемdouble -
futureдолжен быть указателем на значениеXrFutureEXT
Коды возврата
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROID -
XR_ERROR_HANDLE_INVALID -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_SESSION_LOST -
XR_ERROR_VALIDATION_FAILURE
Функция xrCheckVpsAvailabilityCompleteANDROID определена следующим образом:
XrResult xrCheckVpsAvailabilityCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrVPSAvailabilityCheckCompletionANDROID* completion);
Описание параметров
-
session— это XrSession, используемый для проверки. -
future— это объектXrFutureEXT, возвращаемый функцией `xrCheckVpsAvailabilityAsyncANDROID` . -
completion— это указатель на XrVPSAvailabilityCheckCompletionANDROID , который получает результат.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед вызовом функции xrCheckVpsAvailabilityCompleteANDROID. -
sessionдолжна быть действительным дескриптором XrSession. -
completionдолжна быть указателем на структуру XrVPSAvailabilityCheckCompletionANDROID.
Коды возврата
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_FUTURE_INVALID_EXT -
XR_ERROR_FUTURE_PENDING_EXT -
XR_ERROR_HANDLE_INVALID -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_SESSION_LOST -
XR_ERROR_VALIDATION_FAILURE
Структура XrVPSAvailabilityCheckCompletionANDROID определяется следующим образом:
typedef struct XrVPSAvailabilityCheckCompletionANDROID {
XrStructureType type;
void* next;
XrResult futureResult;
XrVPSAvailabilityANDROID availability;
} XrVPSAvailabilityCheckCompletionANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
futureResult— это XrResult операции проверки. ЕслиfutureResultравенXR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID, структура вnextцепочке может предоставить дополнительную информацию о сбое. -
availabilityопределяется результирующим значением XrVPSAvailabilityANDROID . Приложение не должно считывать это поле, еслиfutureResultне равенXR_SUCCESS.
Будущие коды возврата
Значения futureResult :
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_SESSION_LOST -
XR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID
Допустимое использование (неявное)
- Расширение
XR_ANDROID_geospatialнеобходимо включить перед использованием XrVPSAvailabilityCheckCompletionANDROID. -
typeдолжен бытьXR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
futureResultдолжно быть допустимым значением XrResult. -
availabilityдолжна быть допустимым значением XrVPSAvailabilityANDROID.
Пример
Настройка геопространственного трекера
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;
}
}
}
Вызов API для определения геопространственной позиции
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.
}
Новые типы объектов
Новые команды
- xrCheckVpsAvailabilityAsyncANDROID
- xrCheckVpsAvailabilityComplete ANDROID
- xrCreateGeospatialTrackerANDROID
- xrDestroyGeospatialTrackerANDROID
- xrLocateGeospatialPoseANDROID
- xrLocateGeospatialPoseFromPoseANDROID
Новые сооружения
- XrEventDataGeospatialTrackerStateChangedANDROID
- XrGeospatialPoseANDROID
- XrGeospatialPoseFromPoseLocateInfoANDROID
- XrGeospatialPoseLocateInfoANDROID
- XrGeospatialPoseResultANDROID
- XrGeospatialTrackerCreateInfoANDROID
- XrVPSAvailabilityCheckComplete ANDROID
Расширение XrSystemProperties :
Новые перечисления
Новые битовые маски
Новые константы перечислений
-
XR_ANDROID_GEOSPATIAL_EXTENSION_NAME -
XR_ANDROID_geospatial_SPEC_VERSION Расширение XrObjectType :
-
XR_OBJECT_TYPE_GEOSPATIAL_TRACKER_ANDROID
-
Расширение XrResult :
-
XR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROID -
XR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROID -
XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
-
Расширение XrStructureType :
-
XR_TYPE_EVENT_DATA_GEOSPATIAL_TRACKER_STATE_CHANGED_ANDROID -
XR_TYPE_GEOSPATIAL_POSE_FROM_POSE_LOCATE_INFO_ANDROID -
XR_TYPE_GEOSPATIAL_POSE_LOCATE_INFO_ANDROID -
XR_TYPE_GEOSPATIAL_POSE_RESULT_ANDROID -
XR_TYPE_GEOSPATIAL_TRACKER_CREATE_INFO_ANDROID -
XR_TYPE_SYSTEM_GEOSPATIAL_PROPERTIES_ANDROID -
XR_TYPE_VPS_AVAILABILITY_CHECK_COMPLETION_ANDROID
-
Проблемы
История версий
Редакция 1, 18.12.2025 (Бен Кинг)
- Первоначальное описание расширения.