XR_ANDROID_trackables OpenXR 擴充功能

名稱字串

XR_ANDROID_trackables

擴充功能類型

執行個體擴充功能

已註冊的擴充號碼

456

修訂版本

1

擴充功能和版本依附元件

OpenXR 1.0

上次修改日期

2024-09-30

IP 狀態

沒有已知的 IP 版權聲明。

著作人

Spencer Quin,Google

Nihav Jain,Google

Google 的 John Pursey

Jared Finder,Google

Levana Chen,Google

Google 的 Kenny Vercaemer

總覽

這項擴充功能可讓應用程式從實體環境存取可追蹤物,並建立附加至可追蹤物的錨點。

這個擴充功能會定義平面追蹤物。其他擴充功能可能會新增其他可追蹤的類型。例如,XR_ANDROID_trackables_object 會新增可追蹤的物件,而 XR_ANDROID_depth_texture 會新增深度緩衝區,可將光線投射到環境中的任意點。

可追蹤項目是在實體環境中追蹤的項目 (請參閱 XrTrackableTypeANDROID):

  • 平面 (例如牆壁、地板、天花板、桌子)
  • 物品 (例如鍵盤、滑鼠、筆電)

建立可追蹤的追蹤器

XrTrackableTrackerANDROID 是代表在環境中,針對特定 XrTrackableTypeANDROID 探索及更新可追蹤項目所需的資源的句柄。

XR_DEFINE_HANDLE(XrTrackableTrackerANDROID)

xrCreateTrackableTrackerANDROID 函式的定義如下:

XrResult xrCreateTrackableTrackerANDROID(
    XrSession                                   session,
    const XrTrackableTrackerCreateInfoANDROID*  createInfo,
    XrTrackableTrackerANDROID*                  trackableTracker);

參數說明

應用程式可以使用 xrCreateTrackableTrackerANDROID 函式建立可追蹤的追蹤器。

  • 如果系統不支援指定類型的可追蹤項目,就會傳回 XR_ERROR_FEATURE_UNSUPPORTED
  • 如果未將必要權限授予呼叫應用程式,系統會傳回 XR_ERROR_PERMISSION_INSUFFICIENT

應用程式「可以」在後續 API 呼叫中使用傳回的追蹤器句柄。XrTrackableTrackerANDROID 句柄必須最終使用 xrDestroyTrackableTrackerANDROID 函式釋放。

有效用法 (隱含)

傳回代碼

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • 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_FEATURE_UNSUPPORTED

XrTrackableTrackerCreateInfoANDROID 結構定義如下:

typedef struct XrTrackableTrackerCreateInfoANDROID {
    XrStructureType           type;
    void*                     next;
    XrTrackableTypeANDROID    trackableType;
} XrTrackableTrackerCreateInfoANDROID;

成員說明

  • type 是這個結構的 XrStructureType
  • nextNULL 或結構鏈結中下一個結構的指標。核心 OpenXR 或這個擴充功能中並未定義這類結構。
  • trackableType 是追蹤器要追蹤的 XrTrackableTypeANDROID

XrTrackableTrackerCreateInfoANDROID 結構體傳遞至 xrCreateTrackableTrackerANDROID 時,會為 XrTrackableTrackerANDROID 提供建立選項。

擴充功能「可以」定義可附加至 next 的結構,以便為可追蹤的追蹤器提供其他設定。

有效用法 (隱含)

XrTrackableTypeANDROID 列舉的定義如下:

typedef enum XrTrackableTypeANDROID {
    XR_TRACKABLE_TYPE_NOT_VALID_ANDROID = 0,
    XR_TRACKABLE_TYPE_PLANE_ANDROID = 1,
    XR_TRACKABLE_TYPE_DEPTH_ANDROID = 1000463000,
    XR_TRACKABLE_TYPE_OBJECT_ANDROID = 1000466000
} XrTrackableTypeANDROID;

xrDestroyTrackableTrackerANDROID 函式定義如下:

XrResult xrDestroyTrackableTrackerANDROID(
    XrTrackableTrackerANDROID                   trackableTracker);

參數說明

xrDestroyTrackableTrackerANDROID 函式會刪除可追蹤的追蹤器。

如果沒有其他有效的 XrTrackableTrackerANDROID 是使用相同的 XrTrackableTypeANDROID 建立,系統可能會停用該可追蹤類型所需的追蹤服務,以節省系統資源。

有效用法 (隱含)

執行緒安全性

  • trackableTracker 和任何子系句柄的存取權必須在外部同步

傳回代碼

成功

  • XR_SUCCESS

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

取得所有可追蹤項目

XrTrackableANDROID 原子的定義如下:

XR_DEFINE_ATOM(XrTrackableANDROID)

XrTrackableANDROID 用於代表單一可追蹤項目,且僅在其相關聯 XrTrackableTrackerANDROID 的生命週期內有效。

xrGetAllTrackablesANDROID 函式定義如下:

XrResult xrGetAllTrackablesANDROID(
    XrTrackableTrackerANDROID                   trackableTracker,
    uint32_t                                    trackableCapacityInput,
    uint32_t*                                   trackableCountOutput,
    XrTrackableANDROID*                         trackables);

參數說明

  • trackableTracker 是您要查詢的 XrTrackableTrackerANDROID

  • trackableCapacityInputtrackables 陣列的容量,或 0 表示要求擷取所需容量。

  • trackableCountOutput 是指向已寫入的 trackables 計數的指標,或指向 trackables 不足時所需容量的指標。

  • trackables 是指向 XrTrackableANDROID 陣列的指標。如果 trackableCapacityInput 為 0,則設為 NULL

  • 如要進一步瞭解如何擷取所需的 trackables 大小,請參閱「緩衝區大小參數」一節。

xrGetAllTrackablesANDROID 會填入 XrTrackableANDROID 陣列,代表環境中找到的追蹤物。傳回的 trackablesXrTrackableTypeANDROID 必須trackableTrackerXrTrackableTypeANDROID 相符。

取得可追蹤的飛機

xrGetTrackablePlaneANDROID 函式定義如下:

XrResult xrGetTrackablePlaneANDROID(
    XrTrackableTrackerANDROID                   trackableTracker,
    const XrTrackableGetInfoANDROID*            getInfo,
    XrTrackablePlaneANDROID*                    planeOutput);

參數說明

xrGetTrackablePlaneANDROID 函式會傳回可追蹤平面的詳細資料,例如幾何圖形、方向和追蹤狀態。

使用 XrTrackableGetInfoANDROID::time, XrTrackableGetInfoANDROID::baseSpace 時,系統會解析平面資訊,並與基礎空間相關。

有效用法 (隱含)

傳回代碼

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_TIME_INVALID

XrTrackableGetInfoANDROID 結構的定義如下:

typedef struct XrTrackableGetInfoANDROID {
    XrStructureType       type;
    void*                 next;
    XrTrackableANDROID    trackable;
    XrSpace               baseSpace;
    XrTime                time;
} XrTrackableGetInfoANDROID;

成員說明

  • type 是這個結構的 XrStructureType
  • nextNULL 或結構鏈結中下一個結構的指標。核心 OpenXR 或這個擴充功能中並未定義這類結構。
  • trackable 是您要查詢的 XrTrackableANDROID 平面。
  • baseSpace 平面姿勢會相對於 time 中的這個 XrSpace
  • time 是用來評估相對於 baseSpace 的座標的 XrTime

XrTrackableGetInfoANDROID 結構傳遞至 xrGetTrackablePlaneANDROID 時,會提供查詢選項。trackable 必須對應至 xrGetTrackablePlaneANDROID 中使用的 trackableTracker

如果 trackable 的可追蹤類型不是 XR_TRACKABLE_TYPE_PLANE_ANDROID,系統會傳回 XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID

有效用法 (隱含)

XrTrackablePlaneANDROID 結構的定義如下:

typedef struct XrTrackablePlaneANDROID {
    XrStructureType           type;
    void*                     next;
    XrTrackingStateANDROID    trackingState;
    XrPosef                   centerPose;
    XrExtent2Df               extents;
    XrPlaneTypeANDROID        planeType;
    XrPlaneLabelANDROID       planeLabel;
    XrTrackableANDROID        subsumedByPlane;
    XrTime                    lastUpdatedTime;
    uint32_t                  vertexCapacityInput;
    uint32_t*                 vertexCountOutput;
    XrVector2f*               vertices;
} XrTrackablePlaneANDROID;

成員說明

  • type 是這個結構的 XrStructureType
  • nextNULL 或結構鏈結中下一個結構的指標。核心 OpenXR 或這個擴充功能中並未定義這類結構。
  • trackingState 是平面的 XrTrackingStateANDROID
  • centerPoseXrPosef,可在對應 XrTrackableGetInfoANDROID::baseSpace 的參考座標系內定義平面的方向和位置。此處的 ID 方向代表座標軸,其中 +Y 與平面的法線平行。
  • extents 是平面的 XrExtent2Df 維度。
  • planeType 是執行階段為此平面決定的 XrPlaneTypeANDROID
  • planeLabel 是這個平面在執行階段所決定的 XrPlaneLabelANDROID
  • subsumedByPlane 是包含此平面的平面的 XrTrackableANDROID (如果不存在,則為 XR_NULL_TRACKABLE_ANDROID)。
  • lastUpdatedTime 是平面上次更新的 XrTime
  • vertexCapacityInputvertices 陣列的容量,或 0 表示要求擷取所需容量。
  • vertexCountOutput 是指向已寫入的 vertices 計數的指標,或指向 vertices 不足時所需容量的指標。
  • verticesXrVector2f 陣列的指標。如果 vertexCapacityInput 為 0,則設為 NULL。頂點會以逆時針方向排列。多邊形「可以」是凹形,但「必須」不得與自身相交。
  • 如要進一步瞭解如何擷取所需的 vertices 大小,請參閱「緩衝區大小參數」一節。

有效用法 (隱含)

XrTrackingStateANDROID 列舉會說明 XrTrackableANDROID 的追蹤狀態。

typedef enum XrTrackingStateANDROID {
    XR_TRACKING_STATE_PAUSED_ANDROID = 0,
    XR_TRACKING_STATE_STOPPED_ANDROID = 1,
    XR_TRACKING_STATE_TRACKING_ANDROID = 2
} XrTrackingStateANDROID;

XrTrackingStateANDROID

說明

XR_TRACKING_STATE_PAUSED_ANDROID

表示可追蹤或錨點追蹤已暫停,但日後可能會恢復。

XR_TRACKING_STATE_STOPPED_ANDROID

追蹤已停止,且永遠不會恢復。

XR_TRACKING_STATE_TRACKING_ANDROID

系統會追蹤物件,並顯示物件的目前姿勢。

XrPlaneTypeANDROID 列舉是 XrTrackableANDROID 平面類型。

typedef enum XrPlaneTypeANDROID {
    XR_PLANE_TYPE_HORIZONTAL_DOWNWARD_FACING_ANDROID = 0,
    XR_PLANE_TYPE_HORIZONTAL_UPWARD_FACING_ANDROID = 1,
    XR_PLANE_TYPE_VERTICAL_ANDROID = 2,
    XR_PLANE_TYPE_ARBITRARY_ANDROID = 3
} XrPlaneTypeANDROID;

XrPlaneLabelANDROID 列舉是 XrTrackableANDROID 平面標籤。

typedef enum XrPlaneLabelANDROID {
    XR_PLANE_LABEL_UNKNOWN_ANDROID = 0,
    XR_PLANE_LABEL_WALL_ANDROID = 1,
    XR_PLANE_LABEL_FLOOR_ANDROID = 2,
    XR_PLANE_LABEL_CEILING_ANDROID = 3,
    XR_PLANE_LABEL_TABLE_ANDROID = 4
} XrPlaneLabelANDROID;

建立錨點空間

XrResult xrCreateAnchorSpaceANDROID(
    XrSession                                   session,
    const XrAnchorSpaceCreateInfoANDROID*       createInfo,
    XrSpace*                                    anchorOutput);

參數說明

  • session 是建立錨點空間的 XrSession
  • createInfoXrAnchorSpaceCreateInfoANDROID 結構體的指標,其中包含用於建立錨點空間的參數。
  • anchorOutput 是指向句柄的指標,其中會傳回已建立的 XrSpace

在任何時間點,錨點的位置和方向都會追蹤或取消追蹤。也就是說,應用程式為 anchorOutput 呼叫 xrLocateSpacexrLocateSpaces 時,必須同時設定 XR_SPACE_LOCATION_POSITION_TRACKED_BITXR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT,或同時清除這兩者。

應用程式必須最終使用 xrDestroySpace 釋放傳回的 XrSpace

  • 如果系統不支援錨點,則必須傳回 XR_ERROR_FEATURE_UNSUPPORTED
  • 如果不支援特定錨點附件,就必須傳回 XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID

有效用法 (隱含)

傳回代碼

成功

  • 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_LIMIT_REACHED
  • XR_ERROR_POSE_INVALID
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_OUT_OF_MEMORY

XrAnchorSpaceCreateInfoANDROID 結構定義如下:

typedef struct XrAnchorSpaceCreateInfoANDROID {
    XrStructureType       type;
    void*                 next;
    XrSpace               space;
    XrTime                time;
    XrPosef               pose;
    XrTrackableANDROID    trackable;
} XrAnchorSpaceCreateInfoANDROID;

成員說明

  • type 是這個結構的 XrStructureType
  • nextNULL 或結構鏈結中下一個結構的指標。核心 OpenXR 或這個擴充功能中並未定義這類結構。
  • space 是用來建立錨點的 XrSpace
  • time 是錨點建立作業的 XrTime
  • pose 是錨點的 XrPosef
  • trackableXrTrackableANDROID,錨點會附加在該處。可能會是 XR_NULL_TRACKABLE_ANDROID,用於建立空間錨點。

有效用法 (隱含)

取得所有可追蹤項目的程式碼範例

以下程式碼範例說明如何取得指定類型的所有可追蹤項目。

XrSession session; // previously initialized

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateTrackableTrackerANDROID xrCreateTrackableTrackerANDROID; // previously initialized
PFN_xrGetAllTrackablesANDROID xrGetAllTrackablesANDROID; // previously initialized
PFN_xrDestroyTrackableTrackerANDROID xrDestroyTrackableTrackerANDROID; // previously initialized

XrTrackableTrackerCreateInfoANDROID createInfo{XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID};
createInfo.trackableType = XR_TRACKABLE_TYPE_PLANE_ANDROID;
XrTrackableTrackerANDROID planeTrackableTracker;
XrResult result = xrCreateTrackableTrackerANDROID(
  session,
  &createInfo,
  &planeTrackableTracker);
if (result != XR_SUCCESS) { /* Handle failures. */ }

uint32_t trackableCountOutput = 0;
std::vector<XrTrackableANDROID> allPlaneTrackables;

// Query the number of trackables available.
result = xrGetAllTrackablesANDROID(
  planeTrackableTracker,
  0,
  &trackableCountOutput,
  nullptr
);

if (result == XR_SUCCESS) {
  allPlaneTrackables.resize(trackableCountOutput, XR_NULL_HANDLE);

  // Fetch the actual trackable handles in the appropriately resized array.
  result = xrGetAllTrackablesANDROID(
    planeTrackableTracker,
    trackableCountOutput,
    &trackableCountOutput,
    allPlaneTrackables.data());

  if (result == XR_SUCCESS) {
    for (XrTrackableANDROID trackable : allPlaneTrackables) {
      // You now have all trackables of the specified type.
    }
  }
}

// Release trackable tracker.
result = xrDestroyTrackableTrackerANDROID(planeTrackableTracker);

取得可追蹤平面的程式碼範例

以下程式碼範例說明如何從觸發結果 XR_ANDROID_raycastxrGetTrackablesANDROID 取得現有的 XrTrackableANDROID,並從中取得可追蹤平面。

XrTrackableTrackerANDROID planeTracker; // previously created

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrGetTrackablePlaneANDROID xrGetTrackablePlaneANDROID; // previously initialized

XrTime updateTime; // Time used for the current frame's simulation update.
XrSpace appSpace; // Space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
XrTrackableANDROID planeTrackable; // Acquired from a hit result or getTrackables().

XrTrackableGetInfoANDROID planeGetInfo;
planeGetInfo.type = XR_TYPE_TRACKABLE_GET_INFO_ANDROID;
planeGetInfo.next = nullptr;
planeGetInfo.trackable = planeTrackable;
planeGetInfo.space = appSpace;
planeGetInfo.time = updateTime;

XrTrackablePlaneANDROID plane = { XR_TYPE_TRACKABLE_PLANE_ANDROID };
result = xrGetTrackablePlaneANDROID(
  planeTracker,
  &planeGetInfo,
  &plane
);

if (result == XR_SUCCESS) {
  // Plane tracking state, center pose, extents, type now available in plane.
}

建立錨點空間的程式碼範例

以下程式碼範例說明如何建立附加至可追蹤項目的錨點空間。

XrSession session; // Created at app startup.
XrTime updateTime; // Time used for the current frame's simulation update.
XrSpace appSpace; // Space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
XrTrackableANDROID planeTrackable; // Acquired from a hit result or getTrackables().

// Create an anchor at (2, 2, 2) world-coordinates.
XrAnchorSpaceCreateInfoANDROID spatialAnchorCreateInfo;
spatialAnchorCreateInfo.type = XR_TYPE_ANCHOR_SPACE_CREATE_INFO_ANDROID;
spatialAnchorCreateInfo.next = nullptr;
spatialAnchorCreateInfo.space = appSpace;
spatialAnchorCreateInfo.time = updateTime;
spatialAnchorCreateInfo.pose = { { 0, 0, 0, 1 }, { 2, 2, 2 } };

XrSpace spatialAnchor = XR_NULL_HANDLE;
XrResult result = xrCreateAnchorSpaceANDROID(
  session,
  &spatialAnchorCreateInfo,
  &spatialAnchor
);

// Create an anchor attached to a trackable.
XrTrackablePlane plane = ...;
XrAnchorSpaceCreateInfoANDROID trackableAnchorCreateInfo;
trackableAnchorCreateInfo.type = XR_TYPE_ANCHOR_SPACE_CREATE_INFO_ANDROID;
trackableAnchorCreateInfo.next = nullptr;
trackableAnchorCreateInfo.space = appState;
trackableAnchorCreateInfo.pose = plane.centerPose;
trackableAnchorCreateInfo.trackable = planeTrackable;

XrSpace trackableAnchor = XR_NULL_HANDLE;
XrResult result = xrCreateAnchorSpaceANDROID(
  session,
  &trackableAnchorCreateInfo,
  &trackableAnchor
);
while (true) {
  // app update loop
  // ...

  // Get the current location of the anchor's space w.r.t the world.
  XrSpaceLocation anchorLocation = { XR_TYPE_SPACE_LOCATION };
  result = xrLocateSpace(trackableAnchor, appSpace, updateTime, &anchorLocation);

  if (anchor.trackingState == XR_TRACKING_STATE_TRACKING_ANDROID) {
    // Update anchor pose.
    doDrawingForAnchor(anchorLocation.pose);
  } else {
    // ...
  }
}

// Cleanup - destroy the space, detatch the anchor so its no longer tracked by the
// runtime and then release all resources held by it.
xrDestroySpace(spatialAnchor);
xrDestroySpace(trackableAnchor);

新的基本類型

新物件類型

新列舉常數

XrStructureType 列舉已擴充以下項目:

  • XR_TYPE_TRACKABLE_GET_INFO_ANDROID
  • XR_TYPE_ANCHOR_SPACE_CREATE_INFO_ANDROID
  • XR_TYPE_TRACKABLE_PLANE_ANDROID
  • XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID

XrObjectType 列舉已擴充以下項目:

  • XR_OBJECT_TYPE_TRACKABLE_TRACKER_ANDROID

XrResult 列舉已擴充以下項目:

  • XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID
  • XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID

新列舉項目

新結構體

新函式

問題

版本記錄

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