名称字符串
XR_ANDROID_raycast
扩展程序类型
实例扩展
已注册的扩展号码
464
修订版本
1
扩展程序和版本依赖项
上次修改日期
2024-10-02
IP 状态
没有已知的 IP 版权主张。
创作贡献者
Spencer Quin,Google
Nihav Jain,Google
John Pursey,Google
Jared Finder,Google
Levana Chen,Google
Kenny Vercaemer,Google
概览
借助此扩展程序,应用可以对环境中的可跟踪对象执行光线投射。光线投射对于检测环境中与光线相交的物体非常有用。例如:
- 使用垂直射线投射来确定悬浮物体在掉落时会落在何处。
- 使用正向光线投射来确定用户正在看向何处。
查询支持的光线投射功能
xrEnumerateRaycastSupportedTrackableTypesANDROID 函数的定义如下:
XrResult xrEnumerateRaycastSupportedTrackableTypesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t trackableTypeCapacityInput,
uint32_t* trackableTypeCountOutput,
XrTrackableTypeANDROID* trackableTypes);
参数说明
instance是检索systemId的 XrInstance。systemId是XrSystemId,其支持的光线追踪可跟踪类型正在枚举。trackableTypeCapacityInput是trackableTypes的容量,或 0(用于检索所需的容量)。trackableTypeCountOutput是指向数组计数的指针,如果trackableTypeCapacityInput不足,则是指向所需容量的指针。trackableTypes是指向 XrTrackableTypeANDROID 数组的指针,但如果trackableTypeCapacityInput为0,则可以为NULL。
- 如需详细了解如何检索所需的
trackableTypes大小,请参阅缓冲区大小参数部分。
xrEnumerateRaycastSupportedTrackableTypesANDROID 会枚举当前会话支持射线投射的可跟踪类型。
有效用法(隐式)
- 必须先启用
XR_ANDROID_raycast扩展程序,然后才能调用 xrEnumerateRaycastSupportedTrackableTypesANDROID instance必须是有效的 XrInstance 句柄trackableTypeCountOutput必须是指向uint32_t值的指针- 如果
trackableTypeCapacityInput不为0,则trackableTypes必须是指向trackableTypeCapacityInputXrTrackableTypeANDROID 值数组的指针
返回代码
XR_SUCCESS
XR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_FUNCTION_UNSUPPORTED
执行光线投射
xrRaycastANDROID 函数的定义如下:
XrResult xrRaycastANDROID(
XrSession session,
const XrRaycastInfoANDROID* rayInfo,
XrRaycastHitResultsANDROID* results);
参数说明
session是执行光线投射的 XrSession。rayInfo是用于描述要投射的光线的 XrRaycastInfoANDROID。results是指向接收射线检测结果的 XrRaycastHitResultsANDROID 的指针。
应用可以通过调用 xrRaycastANDROID 执行光线投射。
- 如果光线与的跟踪器数量超过 XrRaycastHitResultsANDROID::maxResults,运行时必须返回与光线的 XrRaycastHitResultsANDROID::origin 最接近的命中结果。
- 如果光线投射与类型为
XR_TRACKABLE_TYPE_ANDROID_PLANE且被另一个平面包含的可跟踪对象相交,则运行时必须仅返回包含该平面的平面的命中结果。 - 运行时必须按从 XrRaycastInfoANDROID::origin 沿 XrRaycastInfoANDROID::trajectory 矢量从最近到最远的顺序返回命中结果。
- 如果 xrEnumerateRaycastSupportedTrackableTypesANDROID 未枚举 XrRaycastInfoANDROID::trackers 中与 XrTrackableTrackerANDROID 句柄对应的可跟踪类型,则运行时必须返回
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID。
有效用法(隐式)
- 必须先启用
XR_ANDROID_raycast扩展程序,然后才能调用 xrRaycastANDROID session必须是有效的 XrSession 句柄rayInfo必须是指向有效 XrRaycastInfoANDROID 结构的指针results必须是指向 XrRaycastHitResultsANDROID 结构的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROIDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_POSE_INVALIDXR_ERROR_TIME_INVALIDXR_ERROR_FEATURE_UNSUPPORTED
XrRaycastInfoANDROID 结构的定义如下:
typedef struct XrRaycastInfoANDROID {
XrStructureType type;
void* next;
uint32_t maxResults;
uint32_t trackerCount;
const XrTrackableTrackerANDROID* trackers;
XrVector3f origin;
XrVector3f trajectory;
XrSpace space;
XrTime time;
} XrRaycastInfoANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展中未定义任何此类结构。maxResults是uint32_t返回的结果数上限。trackerCount是trackers数组的uint32_t计数。trackers是投射的光线应针对其进行测试的 XrTrackableTrackerANDROID 数组。origin是发射光线的 XrVector3f。trajectory是光线的目标 XrVector3f。space是发射光线的 XrSpace。time是发射光线的XrTime。
XrRaycastInfoANDROID 结构描述了要投射的光线。
- XrRaycastInfoANDROID::trackers 数组可以包含不同类型的追踪器。
- XrRaycastInfoANDROID::trackers 数组不得包含多个同类型的追踪器,否则运行时必须返回
XR_ERROR_VALIDATION_FAILURE。
有效用法(隐式)
- 必须先启用
XR_ANDROID_raycast扩展程序,然后才能使用 XrRaycastInfoANDROID type必须为XR_TYPE_RAYCAST_INFO_ANDROIDnext必须为NULL,或指向结构链中的下一个结构的有效指针trackers必须是指向trackerCount有效 XrTrackableTrackerANDROID 句柄数组的指针space必须是有效的 XrSpace 句柄trackerCount参数必须大于0space和trackers的元素都必须从同一 XrSession 创建、分配或检索
XrRaycastHitResultsANDROID 结构的定义如下:
typedef struct XrRaycastHitResultsANDROID {
XrStructureType type;
void* next;
uint32_t resultsCapacityInput;
uint32_t resultsCountOutput;
XrRaycastHitResultANDROID* results;
} XrRaycastHitResultsANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。核心 OpenXR 或此扩展中未定义任何此类结构。resultsCapacityInput是results数组的容量,或 0,表示请求检索所需的容量。resultsCountOutput是指向已写入results的计数的指针,或者指向所需容量的指针(如果resultsCapacityInput不足)。results是指向 XrRaycastHitResultANDROID 结构数组的指针。如果resultsCapacityInput为 0,则 可以为NULL。- 如需详细了解如何检索所需的
results大小,请参阅缓冲区大小参数部分。
XrRaycastHitResultsANDROID 包含射线的命中数组。
运行时必须将 resultsCountOutput 设置为小于或等于 XrRaycastInfoANDROID::maxResults。
有效用法(隐式)
- 必须先启用
XR_ANDROID_raycast扩展程序,然后才能使用 XrRaycastHitResultsANDROID type必须为XR_TYPE_RAYCAST_HIT_RESULTS_ANDROIDnext必须为NULL,或指向结构链中的下一个结构的有效指针results必须是指向resultsCapacityInput基于 XrRaycastHitResultANDROID 结构的数组的指针resultsCapacityInput参数必须大于0
XrRaycastHitResultANDROID 结构的定义如下:
typedef struct XrRaycastHitResultANDROID {
XrTrackableTypeANDROID type;
XrTrackableANDROID trackable;
XrPosef pose;
} XrRaycastHitResultANDROID;
成员说明
type是光线投射命中的可跟踪对象的 XrTrackableTypeANDROID。trackable是光线投射命中的XrTrackableANDROID,如果可跟踪的type为XR_TRACKABLE_TYPE_DEPTH_ANDROID,则为XR_NULL_TRACKABLE_ANDROID。pose是光线投射命中的 XrPosef。
XrRaycastHitResultANDROID 包含光线射击命中的详细信息。
平面命中的 XrRaycastHitResultANDROID::pose 必须满足以下条件:X 轴和 Z 轴与平面平行,Y 轴与平面垂直。
可跟踪命中的类型 |
说明 |
|
检测水平和/或垂直表面,以确定点的正确深度和方向。 |
|
使用整个场景的深度信息来确定某个点的正确深度和方向。 |
有效用法(隐式)
- 必须先启用
XR_ANDROID_raycast扩展程序,然后才能使用 XrRaycastHitResultANDROID type必须是有效的 XrTrackableTypeANDROID 值
光线投射的示例代码
以下示例代码演示了如何执行光线投射。
XrSession session; // previously initialized
XrTime updateTime; // previously initialized
XrSpace appSpace; // space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
XrPosef headPose; // latest pose of the HMD.
XrTrackableTrackerANDROID planeTracker; // tracker for plane trackables.
XrTrackableTrackerANDROID depthTracker; // tracker for depth trackables.
// Perform a raycast against multiple trackers.
XrTrackableTrackerANDROID trackers[] = {
&planeTracker,
&depthTracker,
};
XrRaycastInfoANDROID rayInfo = {XR_TYPE_RAYCAST_INFO_ANDROID};
rayInfo.trackerCount = sizeof(trackers) / sizeof(XrTrackableTrackerANDROID);
rayInfo.trackers = trackers;
rayInfo.origin = headPose.position;
rayInfo.trajectory = CalculateForwardDirectionFromHeadPose(headPose);
rayInfo.space = appSpace;
rayInfo.time = updateTime;
uint32_t totalHitResults = 0;
constexpr uint32 NUM_DESIRED_RESULTS = 2;
XrRaycastHitResultANDROID hitResult[NUM_DESIRED_RESULTS];
XrRaycastHitResultsANDROID hitResults = {XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID};
hitResults.maxResults = NUM_DESIRED_RESULTS;
hitResults.resultsCapacityInput = NUM_DESIRED_RESULTS;
hitResults.results = hitResult;
XrResult result = xrRaycastANDROID(session, &rayInfo, &hitResults);
if (result == XR_SUCCESS && hitResults.resultsCountOutput >= 1) {
// Hit results are returned in closest-to-farthest order in
// hitResults.results[0] .. hitResults.results[hitResults.resultsCountOutput - 1]
}
新的枚举常量
XrStructureType 枚举已扩展为:
XR_TYPE_RAYCAST_INFO_ANDROIDXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
新结构
新函数
问题
版本历史记录
- 修订版 1,2024 年 10 月 2 日 (Kenny Vercaemer)
- 初始扩展程序说明
OpenXR™ 和 OpenXR 徽标是 Khronos Group Inc. 拥有的商标,已在中国、欧盟、日本和英国注册为商标。