XR_ANDROID_depth_texture

Name String

XR_ANDROID_depth_texture

拡張機能のタイプ

インスタンス拡張機能

Registered Extension Number

703

リビジョン

1

Ratification Status(批准ステータス)

未批准

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

OpenXR 1.0

最終更新日

2024-09-11

IP ステータス

既知の IP 申し立てはありません。

寄与者

Sushant Kulkarni、Google
Cairn Overturf、Google
Spencer Quin、Google
Levana Chen、Google

概要

この拡張機能により、アプリケーションはヘッドセット周辺の現実世界の環境の深度マップをリクエストし、作成時にサポートされている深度解像度をクエリできます。

この拡張機能は、オクルージョン、ヒットテスト、正確なシーン ジオメトリを活用するその他の特定のタスク(偽造顔検出など)のために、未加工の深度と平滑化された深度を公開することを目的としています。

深度マップはランタイムによって生成され、XrDepthSwapchainANDROID を使用してアプリと共有されます。ランタイムは、アプリケーションの全期間にわたって、xrEnumerateDepthResolutionsANDROID を介して返される深度画像の解像度を変更してはなりません。

権限

この拡張機能は、個人情報(PII)に関する懸念を軽減するために、ダウンサンプリングされた深度テクスチャを公開します。この拡張機能は環境のジオメトリを公開するため、Android アプリはマニフェストに android.permission.SCENE_UNDERSTANDING_FINE 権限を記載する必要があります。android.permission.SCENE_UNDERSTANDING_FINE 権限は危険な権限とみなされます。これらの関数を使用するには、実行時に権限をリクエストする必要があります

(保護レベル: 危険)

システムの性能を検査する

XrSystemDepthTrackingPropertiesANDROID 構造体は次のように定義されます。

typedef struct XrSystemDepthTrackingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsDepthTracking;
} XrSystemDepthTrackingPropertiesANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。
  • supportsDepthTracking は、現在のシステムが深度トラッキングをサポートしているかどうかを示す XrBool32 です。

アプリケーションは、xrGetSystemProperties を呼び出すときに XrSystemPropertiesXrSystemDepthTrackingPropertiesANDROID 構造体で拡張することで、システムが深度トラッキングに対応しているかどうかを検査できます

ランタイムが supportsDepthTracking に対して XR_FALSE を返す場合に限り、ランタイムは xrCreateDepthSwapchainANDROID から XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。

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

クエリの深さの解像度

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

XrResult xrEnumerateDepthResolutionsANDROID(
    XrSession                                   session,
    uint32_t                                    resolutionCapacityInput,
    uint32_t*                                   resolutionCountOutput,
    XrDepthCameraResolutionANDROID*             resolutions);

パラメータの説明

  • session は、サポートされている深度解像度を列挙する XrSession です。
  • resolutionCapacityInputresolutions の容量です。必要な容量を取得する場合は 0 にします。
  • resolutionCountOutput は、書き込まれた uint64_t resolutions の数のポインタ、または resolutionCapacityInput が不十分な場合に必要な容量のポインタです。
  • resolutionsXrDepthCameraResolutionANDROID の配列へのポインタですが、resolutionCapacityInput0 の場合、 NULL になります。
  • 必要な resolutions サイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。

xrEnumerateDepthResolutionsANDROID は、現在のセッションでサポートされている深度解像度を列挙します。深度分解能は、実行時の優先順位の高い順に並べる必要があります。アプリケーションは、最適なパフォーマンスと品質を実現するために、サポートする最も高い優先度を使用すべきです

ランタイムは、セッションの存続期間中、この列挙から常に同じバッファ コンテンツを返さなければなりません。

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

  • xrEnumerateDepthResolutionsANDROID を呼び出す前に、XR_ANDROID_depth_texture 拡張機能を有効にする必要があります
  • session は、有効な XrSession ハンドルでなければなりません。
  • resolutionCountOutputuint32_t 値へのポインタでなければなりません。
  • resolutionCapacityInput0 でない場合、resolutionsresolutionCapacityInput XrDepthCameraResolutionANDROID 値の配列へのポインタでなければなりません。

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_VALIDATION_FAILURE

XrDepthCameraResolutionANDROID 列挙型は、XrDepthSwapchainANDROID の作成時にサポートされる深度解像度を表します。

typedef enum XrDepthCameraResolutionANDROID {
    XR_DEPTH_CAMERA_RESOLUTION_80x80_ANDROID = 0,
    XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID = 1,
    XR_DEPTH_CAMERA_RESOLUTION_320x320_ANDROID = 2,
    XR_DEPTH_CAMERA_RESOLUTION_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrDepthCameraResolutionANDROID;

列挙体の説明

  • XR_DEPTH_CAMERA_RESOLUTION_80x80_ANDROID - 深度画像と信頼度画像の解像度は 80x80 です。
  • XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID - 深度画像と信頼度画像の解像度は 160x160 です。
  • XR_DEPTH_CAMERA_RESOLUTION_320x320_ANDROID - 深度画像と信頼度画像の解像度は 320x320 です。

深度スワップチェーンを作成する

XR_DEFINE_HANDLE(XrDepthSwapchainANDROID)

XrDepthSwapchainANDROID は、深度スワップチェーン ハンドルです。

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

XrResult xrCreateDepthSwapchainANDROID(
    XrSession                                   session,
    const XrDepthSwapchainCreateInfoANDROID*    createInfo,
    XrDepthSwapchainANDROID*                    swapchain);

パラメータの説明

  • session は、深度スワップチェーンを作成する XrSession です。
  • createInfo は、スワップチェーンの作成に使用するパラメータを含む XrDepthSwapchainCreateInfoANDROID 構造体へのポインタです。
  • swapchain は、作成された XrDepthSwapchainANDROID が返されるハンドルのポインタです。

アプリケーションは、xrCreateDepthSwapchainANDROID 関数を使用して、深度画像と信頼度画像の両方を管理する深度スワップチェーンを作成できます

  • システムがデプストラッキングをサポートしていない場合、ランタイムは XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。
  • 呼び出し元アプリに必要な権限が付与されていない場合、ランタイムは XR_ERROR_PERMISSION_INSUFFICIENT を返さなければなりません。
  • ランタイムは、XrDepthSwapchainCreateInfoANDROID で指定された深度解像度がサポートされていない場合、XR_ERROR_VALIDATION_FAILURE を返さなければなりません。
  • ランタイムは、スワップチェーンの作成時に createInfo に対応するビットが設定されている場合にのみ、深度信頼度イメージを作成すべきです。

返された深度スワップチェーン ハンドルは、後続の API 呼び出しで使用される可能性があります。XrDepthSwapchainANDROID ハンドルは、最終的に xrDestroyDepthSwapchainANDROID 関数を介して解放されなければなりません。

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

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_PERMISSION_INSUFFICIENT
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST

XrDepthSwapchainCreateInfoANDROID 構造体は次のように定義されます。

typedef struct XrDepthSwapchainCreateInfoANDROID {
    XrStructureType                       type;
    const void*                           next;
    XrDepthCameraResolutionANDROID        resolution;
    XrDepthSwapchainCreateFlagsANDROID    createFlags;
} XrDepthSwapchainCreateInfoANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。
  • resolution は、深度と信頼度のテクスチャの作成に使用される XrDepthCameraResolutionANDROID です。
  • createFlags は 1 つ以上の XrDepthSwapchainCreateFlagsANDROID です。

XrDepthSwapchainCreateInfoANDROID 構造体は、xrCreateDepthSwapchainANDROID に渡されるときに XrDepthSwapchainANDROID の作成オプションを提供します。

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

XrDepthSwapchainCreateFlagsANDROID は、XrDepthSwapchainANDROID の作成オプションを指定します。

typedef XrFlags64 XrDepthSwapchainCreateFlagsANDROID;

XrDepthSwapchainCreateFlagsANDROID の有効なビットは XrDepthSwapchainCreateFlagBitsANDROID で定義され、次のように指定されます。

// Flag bits for XrDepthSwapchainCreateFlagsANDROID
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID = 0x00000001;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID = 0x00000002;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID = 0x00000004;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID = 0x00000008;

フラグの説明

  • XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID - スワップチェーンがスムーズな深度画像を提供することを示します。
  • XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID - スワップチェーンがスムーズな深度信頼度画像を提供することを示します。
  • XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID - スワップチェーンが未加工の深度画像を提供することを示します。
  • XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID - スワップチェーンが未加工の深度信頼度画像を提供することを示します。

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

XrResult xrDestroyDepthSwapchainANDROID(
    XrDepthSwapchainANDROID                     swapchain);

パラメータの説明

xrDestroyDepthSwapchainANDROID 関数は、深度スワップチェーンを破棄します。この呼び出しの後、ランタイムは関連するすべてのメモリとリソースを解放する可能性があります。

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

スレッドセーフ

  • swapchain とその子ハンドルのアクセスは、外部で同期しなければなりません

戻りコード

成功

  • XR_SUCCESS

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

深度テクスチャにアクセスする

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

XrResult xrEnumerateDepthSwapchainImagesANDROID(
    XrDepthSwapchainANDROID                     depthSwapchain,
    uint32_t                                    depthImageCapacityInput,
    uint32_t*                                   depthImageCountOutput,
    XrDepthSwapchainImageANDROID*               depthImages);

パラメータの説明

  • depthSwapchain は、画像の取得元となる XrDepthSwapchainANDROID です。
  • depthImageCapacityInputdepthImages 配列の容量です。必要な容量を取得するリクエストを示す場合は 0 です。
  • depthImageCountOutput は、書き込まれた depthImages のカウントへのポインタ、または depthImageCapacityInput が不十分な場合は必要な容量へのポインタです。
  • depthImages は、XrDepthSwapchainImageANDROID 構造体の配列へのポインタです。depthImageCapacityInput が 0 の場合、NULL になることがあります。
  • 必要な depthImages サイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。

xrEnumerateDepthSwapchainImagesANDROID は、XrDepthSwapchainImageANDROID 構造体の配列を埋めます。リソースは、XrDepthSwapchainANDROID の有効期間中、一定で有効でなければなりません。この関数は、xrEnumerateSwapchainImages と同様に動作します。

ランタイムは、スワップチェーンの有効期間中、この列挙から常に同一のバッファ コンテンツを返さなければなりません。

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

  • xrEnumerateDepthSwapchainImagesANDROID を呼び出す前に、XR_ANDROID_depth_texture 拡張機能を有効にする必要があります
  • depthSwapchain は、有効な XrDepthSwapchainANDROID ハンドルでなければなりません。
  • depthImageCountOutputuint32_t 値へのポインタでなければなりません。
  • depthImageCapacityInput0 でない場合、depthImagesdepthImageCapacityInput XrDepthSwapchainImageANDROID 構造体の配列へのポインタでなければなりません。

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_VALIDATION_FAILURE

XrDepthSwapchainImageANDROID 構造体は次のように定義されます。

typedef struct XrDepthSwapchainImageANDROID {
    XrStructureType    type;
    void*              next;
    const float*       rawDepthImage;
    const uint8_t*     rawDepthConfidenceImage;
    const float*       smoothDepthImage;
    const uint8_t*     smoothDepthConfidenceImage;
} XrDepthSwapchainImageANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。
  • rawDepthImage は、NULL またはランタイムによって割り当てられた左右両方のビューの未加工の深度画像へのポインタです。値の単位はメートルです。特殊な値: 0.0 は、未加工の深度の無効な深度ピクセルまたは空の深度ピクセルを示します。Inf は、事実上無限に遠い既知の深度を示します。
  • rawDepthConfidenceImage は、ランタイムによって割り当てられた左右両方のビューの未加工の深度信頼度画像への NULL またはポインタです。
  • smoothDepthImage は、ランタイムによって割り当てられた左右両方のビューの平滑化された深度画像への NULL またはポインタです。値の単位はメートルです。特殊な値: 0.0 は、スムーズな深度の無効な深度ピクセルまたは空の深度ピクセルを示します。Inf は、事実上無限に遠い既知の深度を示します。
  • smoothDepthConfidenceImage は、ランタイムによって割り当てられた左右両方のビューの平滑化された深度信頼度画像の NULL またはポインタです。

画像バッファ ポインタは、スワップチェーンの存続期間中のみ有効です。スワップチェーンが破棄されると、ポインタはダングリングと見なされます。

XrDepthSwapchainImageANDROID は、読み取り可能な XrDepthSwapchainANDROID からの深度画像を表します。これは、xrCreateDepthSwapchainANDROID の呼び出し時に XrDepthSwapchainCreateInfoANDROID :: resolution および XrDepthSwapchainCreateInfoANDROID :: createFlags で説明されているように割り当てられます。各深度画像について:

  • 画像の値は、行優先の順序でメモリにレイアウトされ、行間にパディングはありません。
  • 最初の値は左上、最後の値は右下です。
  • ポインタが指すメモリのサイズは xrEnumerateDepthSwapchainImagesANDROID の値によって決まり、xrCreateDepthSwapchainANDROID の呼び出し時に XrDepthSwapchainCreateInfoANDROID :: resolution によって設定されます。たとえば、XrDepthSwapchainCreateInfoANDROID :: resolutionXR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID の場合、デプス画像はサイズ 2*160*160*sizeof(float) になります。
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID が含まれていない場合、rawDepthImage の値は NULL でなければなりません。
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID が含まれていない場合、rawDepthConfidenceImage の値は NULL でなければなりません。
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID が含まれていない場合、smoothDepthImage の値は NULL でなければなりません。
  • XrDepthSwapchainCreateInfoANDROID :: createFlagsXR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID が含まれていない場合、smoothDepthImage の値は NULL でなければなりません。

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

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

XrResult xrAcquireDepthSwapchainImagesANDROID(
    XrDepthSwapchainANDROID                     depthSwapchain,
    const XrDepthAcquireInfoANDROID*            acquireInfo,
    XrDepthAcquireResultANDROID*                acquireResult);

パラメータの説明

アプリは、xrAcquireDepthSwapchainImagesANDROID 関数を使用して、xrEnumerateDepthSwapchainImagesANDROID によって列挙された XrDepthSwapchainImageANDROID 配列に、利用可能な最新のスワップチェーン画像インデックス(XrDepthAcquireResultANDROID :: acquiredIndex)を取得できます。返される XrDepthAcquireResultANDROID には、深度データを解釈するために必要な画角やポーズなどの情報も含まれます。xrAcquireDepthSwapchainImagesANDROID の次の呼び出しまで、画像配列で取得したスロットから安全に読み取ることができます。

セッション内の対応する xrBeginFrame 呼び出しと xrEndFrame 呼び出しのペアの間で、xrAcquireDepthSwapchainImagesANDROID の呼び出しは 1 回以下でなければなりません。

  • 以前に取得したスワップ チェーン イメージがランタイムによってまだ使用されている場合、ランタイムはブロックされる可能性があります。
  • xrAcquireDepthSwapchainImagesANDROIDxrBeginFrame の前または xrEndFrame の後に呼び出された場合、ランタイムは XR_ERROR_CALL_ORDER_INVALID を返さなければなりません。
  • フレームごとに xrAcquireDepthSwapchainImagesANDROID が複数回呼び出された場合(つまり、実行中のセッションで、関連付けられた xrEndFrame がない xrBeginFrame の呼び出しの後)、ランタイムは XR_ERROR_LIMIT_REACHED を返さなければなりません。
  • 環境深度データがまだ利用できない場合、ランタイムは XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID を返すことがあります。この場合、アプリケーションは後続のフレームで xrAcquireDepthSwapchainImagesANDROID を再度呼び出すべきです。

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

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

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

XrDepthAcquireInfoANDROID 構造体は次のように定義されます。

typedef struct XrDepthAcquireInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             displayTime;
} XrDepthAcquireInfoANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。
  • space は、XrDepthAcquireResultANDROID :: views で返されるポーズの参照フレームを定義する XrSpace です。
  • displayTime は、XrDepthAcquireResultANDROID :: views で返されるポーズの計算に使用される時間を指定する XrTime です。アプリは、現在のフレームの予測表示時間を渡す必要があります

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

XrDepthAcquireResultANDROID 構造体は次のように定義されます。

typedef struct XrDepthAcquireResultANDROID {
    XrStructureType       type;
    const void*           next;
    uint32_t              acquiredIndex;
    XrTime                exposureTimestamp;
    XrDepthViewANDROID    views[2];
} XrDepthAcquireResultANDROID;

メンバーの説明

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

XrDepthViewANDROID 構造体は次のように定義されます。

typedef struct XrDepthViewANDROID {
    XrStructureType    type;
    const void*        next;
    XrFovf             fov;
    XrPosef            pose;
} XrDepthViewANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。
  • fov は、このビューの生成に使用される画角を指定する XrFovf です。ビューが水平方向または垂直方向に反転することはありません。
  • pose は、デプスマップがレンダリングされたポーズを指定する XrPosef です。参照フレームは XrDepthAcquireInfoANDROID で指定されます。

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

奥行きトラッキングのサンプルコード

次のサンプルコードは、深度画像を取得し、深度値を使用して深度画像の座標をステージ空間にマッピングする方法を示しています。

XrInstance instance;  // previously initialized
XrSystemId systemId;  // previously initialized
XrSession session; // previously initialized
XrSpace stageSpace; // space created for XR_REFERENCE_SPACE_TYPE_STAGE.

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateDepthSwapchainANDROID xrCreateDepthSwapchainANDROID; // previously initialized
PFN_xrDestroyDepthSwapchainANDROID xrDestroyDepthSwapchainANDROID; // previously initialized
PFN_xrEnumerateDepthSwapchainImagesANDROID xrEnumerateDepthSwapchainImagesANDROID; // previously initialized
PFN_xrEnumerateDepthResolutionsANDROID xrEnumerateDepthResolutionsANDROID; // previously initialized
PFN_xrAcquireDepthSwapchainImagesANDROID xrAcquireDepthSwapchainImagesANDROID; // previously initialized

float tanf(float);

// Inspect system capability
XrSystemProperties properties{XR_TYPE_SYSTEM_PROPERTIES};
XrSystemDepthTrackingPropertiesANDROID depthTrackingProperties{XR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID};
properties.next = &depthTrackingProperties;
CHK_XR(xrGetSystemProperties(instance, systemId, &properties));
if (!depthTrackingProperties.supportsDepthTracking) {
  // depth tracking is not supported.
  return;
}

// Query the supported depth resolution.
XrDepthCameraResolutionANDROID supportedDepthResolution;
uint32_t supportedResolutionCount = 0;
CHK_XR(xrEnumerateDepthResolutionsANDROID(
    session, 1, &supportedResolutionCount, &supportedDepthResolution));

// Define metadata to access the raw and smooth depth along with confidences.
XrDepthSwapchainCreateInfoANDROID swapchainCreateInfo = {
  .type = XR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROID,
  .next = nullptr,
  // Use the resolution supported by the runtime.
  .resolution = supportedDepthResolution,
  .createFlags =
    XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID |
    XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID |
    XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID |
    XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID,
};

XrDepthSwapchainANDROID depthSwapchain;
CHK_XR(xrCreateDepthSwapchainANDROID(
    session, &swapchainCreateInfo, &depthSwapchain));

// Enumerate depth images.
uint32_t imageCountOutput = 0;
CHK_XR(xrEnumerateDepthSwapchainImagesANDROID(
    depthSwapchain, 0, &imageCountOutput, nullptr));
std::vector<XrDepthSwapchainImageANDROID> depthImages(imageCountOutput);
for (int i = 0; i < imageCountOutput; i++) {
  depthImages[i].type = XR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID;
}
CHK_XR(xrEnumerateDepthSwapchainImagesANDROID(
  depthSwapchain, imageCountOutput, &imageCountOutput, depthImages.data()));

while (1) {
    // ...
    // For every frame in frame loop
    // ...

    XrFrameState frameState;  // previously returned from xrWaitFrame
    const XrTime time = frameState.predictedDisplayTime;

    XrDepthAcquireInfoANDROID acquireInfo = {
        .type = XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID,
        .space = stageSpace,
        .displayTime = time
    };
    XrDepthAcquireResultANDROID acquireResult = {
        .type = XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID,
    };
    CHK_XR(xrAcquireDepthSwapchainImagesANDROID(
        depthSwapchain, &acquireInfo, &acquireResult));

    // Each value in a depth image corresponds to a point in the real world.
    // The sample code below shows how to find the stageSpace position of
    // the point corresponding to a particular value in the depth image.

    // For this sample code, assume we are using a right handed coordinate system
    // with +X to the right, +Y up and -Z forward.

    XrDepthSwapchainImageANDROID *image =
        &depthImages[acquireResult.acquiredIndex];

    // Assume supported resolution is XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID.
    const int imageResolution = 160;
    int imageY = 80; // value in [0, imageResolution)
    int imageX = 80; // value in [0, imageResolution)

    // Get depth value from left eye.
    // A right depth value is obtained with the following expression:
    // depthR = image->rawDepthImage[imageResolution*imageResolution+i*imageResolution+j]
    float depthL = image->rawDepthImage[imageY*imageResolution + imageX];
    XrDepthViewANDROID viewL = acquireResult.views[0];

    float tanL = tanf(viewL.fov.angleLeft);
    float tanR = tanf(viewL.fov.angleRight);
    float tanU = tanf(viewL.fov.angleUp);
    float tanD = tanf(viewL.fov.angleDown);

    float s = (imageX + 0.5f) / (float)imageResolution;
    float t = (imageY + 0.5f) / (float)imageResolution;

    // Calculate the depth camera space position of the point
    // corresponding to this depth value.
    XrVector3f posInCameraSpace;
    posInCameraSpace.z = -depthL;
    posInCameraSpace.x = (tanL + (tanR - tanL)*s)*depthL;
    posInCameraSpace.y = (tanD + (tanU - tanD)*t)*depthL;

    XrPosef depthCameraPoseL = viewL.pose;
    // Transform posInCameraSpace by depthCameraPoseL

    // ...
    // Finish frame loop
    // ...
}

新しいオブジェクト タイプ

新しいコマンド

新しい構造体

新しい列挙型

新しいビットマスク

新しい列挙型定数

  • XR_ANDROID_DEPTH_TEXTURE_EXTENSION_NAME
  • XR_ANDROID_depth_texture_SPEC_VERSION
  • XrObjectType の拡張 :

    • XR_OBJECT_TYPE_DEPTH_SWAPCHAIN_ANDROID
  • XrResult の拡張 :

    • XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID
  • XrStructureType を拡張する :

    • XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID
    • XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID
    • XR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROID
    • XR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID
    • XR_TYPE_DEPTH_VIEW_ANDROID
    • XR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID

問題

バージョン履歴

  • リビジョン 1、2024-09-09(Levana Chen)

    • 拡張機能の最初の説明