名稱字串
XR_ANDROID_raycast
擴充功能類型
執行個體擴充功能
已註冊的擴充號碼
464
修訂版本
1
擴充功能和版本依附元件
上次修改日期
2024-10-02
IP 狀態
未發現任何 IP 版權聲明。
著作人
Spencer Quin,Google
Nihav Jain,Google
Google 的 John Pursey
Jared Finder,Google
Levana Chen,Google
Google 的 Kenny Vercaemer
總覽
這項擴充功能可讓應用程式針對環境中的可追蹤項目執行光線投射。如要偵測光線會與其交會的環境中的物體,可使用光線投射。例如:
- 使用垂直的光線投射,判斷浮動物體掉落時會落在哪裡。
- 使用前向光線投射,判斷使用者正在看哪裡。
查詢支援的光線投射功能
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::trajectory 向量從 XrRaycastInfoANDROID::origin 開始。
- 如果 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陣列的指標,該陣列包含 XrRaycastHitResult 以 ANDROID 為基礎的結構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-02 (Kenny Vercaemer)
- 初始擴充功能說明
OpenXR™ 和 OpenXR 標誌是 The Khronos Group Inc. 擁有的商標,並已在中國、歐盟、日本和英國註冊為商標。