XR_ANDROID_raycast OpenXR 擴充功能

名稱字串

XR_ANDROID_raycast

擴充功能類型

執行個體擴充功能

已註冊的擴充號碼

464

修訂版本

1

擴充功能和版本依附元件

XR_ANDROID_trackables

上次修改日期

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);

參數說明

  • instancesystemId 擷取的 XrInstance
  • systemIdXrSystemId,其支援的追蹤類型會列舉以進行光線投射。
  • trackableTypeCapacityInputtrackableTypes 的容量,或 0 表示要擷取所需容量。
  • trackableTypeCountOutput 是陣列計數的指標,如果 trackableTypeCapacityInput 不足,則為所需容量的指標。
    • trackableTypesXrTrackableTypeANDROID 陣列的指標,但如果 trackableTypeCapacityInput0,則可以NULL
  • 如要進一步瞭解如何擷取所需的 trackableTypes 大小,請參閱「緩衝區大小參數」一節。

xrEnumerateRaycastSupportedTrackableTypesANDROID 會列舉可追蹤類型,這些類型支援以目前工作階段進行的光線投射。

有效用法 (隱含)

傳回代碼

成功

  • XR_SUCCESS

失敗

  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_FUNCTION_UNSUPPORTED

執行光線投射

xrRaycastANDROID 函式的定義如下:

XrResult xrRaycastANDROID(
    XrSession                                   session,
    const XrRaycastInfoANDROID*                 rayInfo,
    XrRaycastHitResultsANDROID*                 results);

參數說明

應用程式可以透過呼叫 xrRaycastANDROID 執行光線投射。

有效用法 (隱含)

傳回代碼

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_POSE_INVALID
  • XR_ERROR_TIME_INVALID
  • XR_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
  • nextNULL 或結構鏈結中下一個結構的指標。核心 OpenXR 或這個擴充功能中並未定義這類結構。
  • maxResultsuint32_t 要傳回的結果數上限。
  • trackerCounttrackers 陣列的 uint32_t 計數。
  • trackersXrTrackableTrackerANDROID 陣列,系統會針對經過轉換的 ray 測試這個陣列。
  • origin 是光線投射的 XrVector3f
  • trajectory 是光線鎖定的 XrVector3f
  • space 是光線投射的 XrSpace
  • time 是光線投射的 XrTime

XrRaycastInfoANDROID 結構體會說明要投射的光線。

有效用法 (隱含)

XrRaycastHitResultsANDROID 結構的定義如下:

typedef struct XrRaycastHitResultsANDROID {
    XrStructureType               type;
    void*                         next;
    uint32_t                      resultsCapacityInput;
    uint32_t                      resultsCountOutput;
    XrRaycastHitResultANDROID*    results;
} XrRaycastHitResultsANDROID;

成員說明

  • type 是這個結構的 XrStructureType
  • nextNULL 或結構鏈結中下一個結構的指標。核心 OpenXR 或這個擴充功能中並未定義這類結構。
  • resultsCapacityInputresults 陣列的容量,或 0 表示要求擷取所需容量。
  • resultsCountOutput 是指向已寫入的 results 計數的指標,或指向 resultsCapacityInput 不足時所需容量的指標。
  • results 是指向 XrRaycastHitResultANDROID 結構體陣列的指標。如果 resultsCapacityInput 為 0,則設為 NULL
  • 如要進一步瞭解如何擷取所需的 results 大小,請參閱「緩衝區大小參數」一節。

XrRaycastHitResultsANDROID 包含光線投射命中項目的陣列。

執行階段必須resultsCountOutput 設為小於或等於 XrRaycastInfoANDROID::maxResults

有效用法 (隱含)

XrRaycastHitResultANDROID 結構的定義如下:

typedef struct XrRaycastHitResultANDROID {
    XrTrackableTypeANDROID    type;
    XrTrackableANDROID        trackable;
    XrPosef                   pose;
} XrRaycastHitResultANDROID;

成員說明

  • type 是光線投射命中可追蹤項目的 XrTrackableTypeANDROID
  • trackable 是光線投射命中的 XrTrackableANDROID,如果可追蹤的 typeXR_TRACKABLE_TYPE_DEPTH_ANDROID,則為 XR_NULL_TRACKABLE_ANDROID
  • pose 是光線投射命中的 XrPosef

XrRaycastHitResultANDROID 包含光線投射命中的詳細資料。

平面命中事件的 XrRaycastHitResultANDROID::pose 必須是 X 和 Z 與平面平行,且 Y 軸與平面垂直。

可追蹤命中類型

說明

XR_TRACKABLE_TYPE_PLANE_ANDROID

撞上水平和/或垂直表面,以判斷點的正確深度和方向。

XR_TRACKABLE_TYPE_DEPTH_ANDROID

使用整個場景的深度資訊,判斷點的正確深度和方向。

有效用法 (隱含)

光線投射程式碼範例

以下程式碼範例說明如何執行光線投射。

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_ANDROID
  • XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID

新結構體

新函式

問題

版本記錄

  • 修訂版本 1,2024-10-02 (Kenny Vercaemer)
    • 初始擴充功能說明