XR_ANDROID_geospatial
名称字符串
XR_ANDROID_geospatial
扩展类型
实例扩展程序
已注册的扩展程序编号
790
修订版本
1
批准状态
未批准
扩展程序和版本依赖项
XR_EXT_future
上次修改日期
2025-12-18
IP 状态
没有已知的 IP 权利主张。
创作贡献者
John Ullman,Google
Ben King,Google
Nihav Jain,Google
Jared Finder,Google
概览
此扩展程序为 Google 的 Geospatial API 提供地理空间跟踪功能,该 API 可提供精确的地理位置和方向,并允许应用根据地球放置内容。它会结合使用动作跟踪、GPS 和其他传感器以及 Google 的视觉定位系统 (VPS) 来实现此目的。VPS 会将设备摄像头拍摄的图像与街景图像进行比较,以确定精确位置和方向。Geospatial API 通常可提供亚米级的位置精确度(比 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,用于指示当前系统是否支持地理空间功能。
应用可以通过在调用 xrGetSystemProperties 时将 XrSystemGeospatialPropertiesANDROID 结构链接到 XrSystemProperties 来检查系统是否支持地理空间功能。
如果运行时针对 supportsGeospatial 返回 XR_FALSE,则表示系统不支持地理空间功能,因此必须从 xrCreateGeospatialTrackerANDROID 返回 XR_ERROR_FEATURE_UNSUPPORTED。当 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 将通过该句柄返回。
应用可以通过调用 xrCreateGeospatialTrackerANDROID 来创建 XrGeospatialTrackerANDROID 句柄。返回的 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。如果应用将未处于 XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID 状态的 XrGeospatialTrackerANDROID 传递给需要它的函数,运行时必须返回 XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID。
XrGeospatialTrackerANDROID 句柄最终必须通过 xrDestroyGeospatialTrackerANDROID 函数释放。
有效使用情况(隐式)
-
XR_ANDROID_geospatial扩展程序必须先启用,然后才能调用 xrCreateGeospatialTrackerANDROID -
session必须是有效的 XrSession 句柄 -
createInfo必须是指向有效 XrGeospatialTrackerCreateInfoANDROID 结构的指针 -
geospatialTrackerOutput必须是指向 XrGeospatialTrackerANDROID 句柄的指针
返回代码
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
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_INVALIDXR_ERROR_FUNCTION_UNSUPPORTEDXR_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。- 如果
state为XR_GEOSPATIAL_TRACKER_STATE_INITIALIZATION_FAILED_ANDROID,则initializationResult为错误结果;否则为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 函数将 XrGeospatialPoseFromPoseLocateInfoANDROID :: space 中的姿态转换为地理空间姿态。如果 geospatialTracker 的状态不是 XR_GEOSPATIAL_TRACKER_STATE_RUNNING_ANDROID,则运行时必须返回 XR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID。如果函数返回 XR_SUCCESS,则 geospatialPoseResult 的 XrGeospatialPoseResultANDROID :: poseFlags 字段会确定哪些输出字段有效。如果 XrGeospatialPoseResultANDROID 的 poseFlags 中未设置 XR_GEOSPATIAL_POSE_POSITION_VALID_BIT_ANDROID,应用不得读取 XrGeospatialPoseResultANDROID 中 XrGeospatialPoseANDROID 的 latitude、XrGeospatialPoseANDROID 的 longitude、XrGeospatialPoseANDROID 的 altitude、XrGeospatialPoseResultANDROID 的 horizontalAccuracy 或 XrGeospatialPoseResultANDROID 的 verticalAccuracy 字段。如果未在 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_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
XrGeospatialPoseFromPoseLocateInfoANDROID 结构的定义如下:
typedef struct XrGeospatialPoseFromPoseLocateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrPosef pose;
} XrGeospatialPoseFromPoseLocateInfoANDROID;
成员说明
type是相应结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。space是定义pose的 XrSpace。time是要评估pose的XrTime。pose是space中要转换为地理空间姿态的 XrPosef。
有效使用情况(隐式)
-
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,则 location 的 XrSpaceLocation :: locationFlags 字段会确定哪些输出字段有效。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_geospatial扩展程序,然后才能调用 xrLocateGeospatialPoseANDROID -
geospatialTracker必须是有效的 XrGeospatialTrackerANDROID 句柄 -
locateInfo必须是指向有效 XrGeospatialPoseLocateInfoANDROID 结构的指针 -
location必须是指向 XrSpaceLocation 结构的指针
返回代码
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
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 即可调用此函数,并且可以使用此操作的结果来决定是否创建 XrGeospatialTrackerANDROID。如果应用未获得所需权限,运行时必须返回 XR_ERROR_PERMISSION_INSUFFICIENT。
有效使用情况(隐式)
-
XR_ANDROID_geospatial扩展程序必须先启用,然后才能调用 xrCheckVpsAvailabilityAsyncANDROID -
session必须是有效的 XrSession 句柄 -
latitude必须是有效的double值 -
longitude必须是有效的double值 -
future必须是指向XrFutureEXT值的指针
返回代码
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
xrCheckVpsAvailabilityCompleteANDROID 函数的定义如下:
XrResult xrCheckVpsAvailabilityCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrVPSAvailabilityCheckCompletionANDROID* completion);
参数说明
session是用于检查的 XrSession。future是由 xrCheckVpsAvailabilityAsyncANDROID 返回的XrFutureEXT。completion是指向 XrVPSAvailabilityCheckCompletionANDROID 的指针,用于接收结果。
有效使用情况(隐式)
- 必须先启用
XR_ANDROID_geospatial扩展程序,然后才能调用 xrCheckVpsAvailabilityCompleteANDROID -
session必须是有效的 XrSession 句柄 -
completion必须是指向 XrVPSAvailabilityCheckCompletionANDROID 结构的指针
返回代码
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
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_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_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;
}
}
}
调用 Geospatial Pose 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
- xrCheckVpsAvailabilityCompleteANDROID
- xrCreateGeospatialTrackerANDROID
- xrDestroyGeospatialTrackerANDROID
- xrLocateGeospatialPoseANDROID
- xrLocateGeospatialPoseFromPoseANDROID
新结构
- XrEventDataGeospatialTrackerStateChangedANDROID
- XrGeospatialPoseANDROID
- XrGeospatialPoseFromPoseLocateInfoANDROID
- XrGeospatialPoseLocateInfoANDROID
- XrGeospatialPoseResultANDROID
- XrGeospatialTrackerCreateInfoANDROID
- XrVPSAvailabilityCheckCompletionANDROID
新枚举
新位掩码
新的枚举常量
XR_ANDROID_GEOSPATIAL_EXTENSION_NAMEXR_ANDROID_geospatial_SPEC_VERSION扩展 XrObjectType:
XR_OBJECT_TYPE_GEOSPATIAL_TRACKER_ANDROID
扩展 XrResult:
XR_ERROR_GEOSPATIAL_CLOUD_AUTH_FAILED_ANDROIDXR_ERROR_GEOSPATIAL_COORDINATES_INVALID_ANDROIDXR_ERROR_GEOSPATIAL_TRACKER_NOT_RUNNING_ANDROID
扩展 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
问题
版本历史记录
修订版 1,2025-12-18(Ben King)
- 初始扩展程序说明。