XR_ANDROID_depth_texture

Name String

XR_ANDROID_depth_texture

拡張機能の種類

インスタンス拡張

登録済みの内線番号

703

リビジョン

1

承認ステータス

未批准

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

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 権限は危険な権限と見なされます。アプリは、これらの関数を使用するために、実行時に権限をリクエストしなければなりません。

(保護レベル: dangerous)

システム機能を検査する

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

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

メンバーの説明

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

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

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

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

クエリの深さの解決

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

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

パラメータの説明

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

xrEnumerateDepthResolutionsANDROID は、現在のセッションでサポートされている深度解像度を列挙します。深度解像度は、ランタイム設定の高いものから低いものの順に並べるべきです。アプリは、最適なパフォーマンスと品質を実現するために、サポートされている最も高い優先度を使用すべきです。

ランタイムは、セッションの存続期間中、この列挙から常に同じバッファ コンテンツを返す必要があります。

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

  • XR_ANDROID_depth_texture 拡張機能は、xrEnumerateDepthResolutionsANDROID を呼び出す前に有効にする必要があります。
  • session は、有効な XrSession ハンドルでなければなりません。
  • resolutionCountOutput は uint32_t 値へのポインタでなければなりません
  • resolutionCapacityInput が 0 でない場合、resolutions は resolutionCapacityInput 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
  • XR_ERROR_RUNTIME_FAILURE

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

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

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

パラメータの説明

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

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

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

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

  • XR_ANDROID_depth_texture 拡張機能は、xrEnumerateDepthSwapchainImagesANDROID を呼び出す前に有効にする必要があります。
  • depthSwapchain は、有効な XrDepthSwapchainANDROID ハンドルでなければなりません。
  • depthImageCountOutput は uint32_t 値へのポインタでなければなりません
  • depthImageCapacityInput が 0 でない場合、depthImages は depthImageCapacityInput 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 :: resolution が XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID の場合、深度画像のサイズは 2*160*160*sizeof(float) になります。
  • XrDepthSwapchainCreateInfoANDROID :: createFlags に XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID が含まれていない場合、rawDepthImage の値は NULL でなければなりません。
  • XrDepthSwapchainCreateInfoANDROID :: createFlags に XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID が含まれていない場合、rawDepthConfidenceImage の値は NULL でなければなりません。
  • XrDepthSwapchainCreateInfoANDROID :: createFlags に XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID が含まれていない場合、smoothDepthImage の値は NULL でなければなりません。
  • XrDepthSwapchainCreateInfoANDROID :: createFlags に XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID が含まれていない場合、smoothDepthImage の値は NULL でなければなりません。

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

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

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

パラメータの説明

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

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

  • 以前に取得したスワップチェーン イメージがランタイムによってまだ使用されている場合、ランタイムはブロックされる可能性があります。
  • xrBeginFrame の前または xrEndFrame の後に xrAcquireDepthSwapchainImagesANDROID が呼び出された場合、ランタイムは 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 です。アプリは、現在のフレームの予測表示時間を渡す必要があります。

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

  • XrDepthAcquireInfoANDROID を使用する前に、XR_ANDROID_depth_texture 拡張機能を有効にする必要があります。
  • type は XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • space は有効な XrSpace ハンドルでなければなりません

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

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

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。このような構造体は、コア OpenXR またはこの拡張機能では定義されていません。
  • acquiredIndex は、xrEnumerateDepthSwapchainImagesANDROID によって列挙された XrDepthSwapchainImageANDROID 配列内の取得されたテクスチャのインデックスです。
  • exposureTimestamp は、深度マップがキャプチャされた時刻を指定する XrTime です。
  • views は 2 つの XrDepthViewANDROID の配列です。1 つは左目用(インデックス 0)、もう 1 つは右目用(インデックス 1)です。

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

  • XrDepthAcquireResultANDROID を使用する前に、XR_ANDROID_depth_texture 拡張機能を有効にする必要があります。
  • type は XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • views の任意の要素は、有効な XrDepthViewANDROID 構造体でなければなりません。

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

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

メンバーの説明

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

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

  • XrDepthViewANDROID を使用する前に、XR_ANDROID_depth_texture 拡張機能を有効にする必要があります。
  • type は XR_TYPE_DEPTH_VIEW_ANDROID にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。

深度トラッキングのサンプルコード

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

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)

    • 拡張機能の初期説明