名称字符串
XR_ANDROID_raycast
扩展类型
实例扩展
已注册扩展编号
464
修订版
1
扩展和版本依赖项
上次修改日期
2024-10-02
知识产权状态
无已知知识产权主张。
贡献者
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 枚举当前会话支持射线投射的可跟踪类型。
有效用法(隐式)
- 在调用
xrEnumerateRaycastSupportedTrackableTypesANDROID之前,**必须**启用XR_ANDROID_raycast扩展。 instance**必须**是有效的XrInstance句柄。trackableTypeCountOutput**必须**是指向uint32_t值的指针。- 如果
trackableTypeCapacityInput不为0,则trackableTypes**必须**是指向trackableTypeCapacityInput个XrTrackableTypeANDROID值数组的指针。
返回代码
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向量从近到远的顺序返回命中结果。 - 如果
XrRaycastInfoANDROID::trackers中的XrTrackableTrackerANDROID句柄对应的可跟踪类型未被xrEnumerateRaycastSupportedTrackableTypesANDROID枚举,则运行时**必须**返回XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID。
有效用法(隐式)
- 在调用
xrRaycastANDROID之前,**必须**启用XR_ANDROID_raycast扩展。 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。
有效用法(隐式)
- 在使用
XrRaycastInfoANDROID之前,**必须**启用XR_ANDROID_raycast扩展。 type**必须**是XR_TYPE_RAYCAST_INFO_ANDROID。next**必须**是NULL或指向结构链中下一个结构的有效指针。trackers**必须**是指向trackerCount个有效XrTrackableTrackerANDROID句柄数组的指针。space**必须**是有效的XrSpace句柄。trackerCount参数**必须**大于0。space和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。
有效用法(隐式)
- 在使用
XrRaycastHitResultsANDROID之前,**必须**启用XR_ANDROID_raycast扩展。 type**必须**是XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID。next**必须**是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 轴垂直于平面。
命中的可跟踪对象类型 |
说明 |
|
命中水平和/或垂直表面,以确定点的正确深度和方向。 |
|
使用整个场景的深度信息来确定点的正确深度和方向。 |
有效用法(隐式)
- 在使用
XrRaycastHitResultANDROID之前,**必须**启用XR_ANDROID_raycast扩展。 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-02 (Kenny Vercaemer)
- 初始扩展描述
OpenXR™ 和 OpenXR 徽标是 The Khronos Group Inc. 拥有的商标,并在中国、欧盟、日本和英国注册为商标。