XR_ANDROID_trackables OpenXR 拡張機能

名前の文字列

XR_ANDROID_trackables

拡張機能の種類

インスタンスの拡張

登録されている電話番号

456

リビジョン

1

拡張機能とバージョンの依存関係

OpenXR 1.0

最終更新日

2024-09-30

IP ステータス

既知の IP に関する申し立てはありません。

寄与者

Spencer Quin、Google

Nihav Jain、Google

John Pursey、Google

Jared Finder、Google

Levana Chen、Google

Kenny Vercaemer、Google

概要

この拡張機能により、アプリケーションは物理環境からトラッキング可能アイテムにアクセスし、トラッキング可能アイテムに接続されたアンカーを作成できます。

この拡張機能は、平面トラッケーブルを定義します。他の拡張機能によって、トラッキング可能なタイプが追加される可能性があります。たとえば、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 関数は、トラッキング可能なトラッカーを破棄します。

同じ XrTrackableTypeANDROID で作成された有効な XrTrackableTrackerANDROID が他にない場合、システムはシステム リソースを節約するために、そのトラッキング タイプに必要なトラッキング サービスを無効にする可能性があります

有効な使用方法(暗黙的)

スレッドセーフ

  • 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 が不十分な場合に必要な容量へのポインタです。

  • trackablesXrTrackableANDROID の配列へのポインタです。trackableCapacityInput が 0 の場合、NULL にできます。

  • 必要な trackables サイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。

xrGetAllTrackablesANDROID は、環境で検出されたトラッケーブルを表す XrTrackableANDROID の配列を入力します。返された trackablesXrTrackableTypeANDROID は、trackableTrackerXrTrackableTypeANDROID と一致している必要があります。

追跡可能な飛行機を取得する

xrGetTrackablePlaneANDROID 関数は次のように定義されます。

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

パラメータの説明

xrGetTrackablePlaneANDROID 関数は、トラッキング可能なプレーンの詳細(ジオメトリ、向き、トラッキング状態など)を返します。

プレーン情報は、XrTrackableGetInfoANDROID::time、XrTrackableGetInfoANDROID::baseSpace を使用して xrGetTrackablePlaneANDROID の呼び出し時に解決され、ベース空間を基準とします。

有効な使用方法(暗黙的)

戻りコード

成功

  • 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 です。
  • centerPose は、対応する XrTrackableGetInfoANDROID::baseSpace の基準フレーム内の平面の位置と向きを定義する XrPosef です。ここでの同一方向は、+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 サイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。

有効な使用方法(暗黙的)

  • XrTrackablePlaneANDROID を使用する前に、XR_ANDROID_trackables 拡張機能を有効にする必要があります。
  • typeXR_TYPE_TRACKABLE_PLANE_ANDROID にする必要があります
  • nextNULL であるか、構造体チェーンの次の構造体への有効なポインタである必要があります。
  • trackingState は有効な XrTrackingStateANDROID 値である必要があります。
  • planeType は有効な XrPlaneTypeANDROID 値である必要があります。
  • planeLabel は有効な XrPlaneLabelANDROID 値にする必要があります。
  • vertexCountOutputuint32_t 値へのポインタである必要があります。
  • vertices は、vertexCapacityInput XrVector2f 構造の配列へのポインタである必要があります。
  • vertexCapacityInput パラメータは 0 より大きい値にする必要があります。

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 です。
  • createInfo は、アンカー空間の作成に使用されるパラメータを含む XrAnchorSpaceCreateInfoANDROID 構造体へのポインタです。
  • anchorOutput は、作成された XrSpace が返されるハンドルへのポインタです。

アンカーの位置と方向の両方が、常にトラッキングまたはトラッキング解除されます。つまり、アプリが anchorOutput に対して xrLocateSpace または xrLocateSpaces を呼び出すときに、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 です。
  • trackable は、アンカーが接続される XrTrackableANDROID です。空間アンカーを作成する場合、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_raycast または xrGetTrackablesANDROID から取得した既存の 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 年 9 月 27 日(Kenny Vercaemer)
    • 最初の拡張機能の説明。