XR_ANDROID_depth_texture
Name String
XR_ANDROID_depth_texture
拡張機能のタイプ
インスタンス拡張機能
Registered Extension Number
703
リビジョン
1
Ratification Status(批准ステータス)
未批准
拡張機能とバージョンの依存関係
最終更新日
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 を呼び出すときに XrSystemProperties を XrSystemDepthTrackingPropertiesANDROID 構造体で拡張することで、システムが深度トラッキングに対応しているかどうかを検査できます。
ランタイムが supportsDepthTracking に対して XR_FALSE を返す場合に限り、ランタイムは xrCreateDepthSwapchainANDROID から XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。
有効な使用方法(暗黙的)
- XrSystemDepthTrackingPropertiesANDROID を使用する前に、
XR_ANDROID_depth_texture拡張機能を有効にする必要があります -
typeはXR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
クエリの深さの解像度
xrEnumerateDepthResolutionsANDROID 関数は次のように定義されます。
XrResult xrEnumerateDepthResolutionsANDROID(
XrSession session,
uint32_t resolutionCapacityInput,
uint32_t* resolutionCountOutput,
XrDepthCameraResolutionANDROID* resolutions);
パラメータの説明
sessionは、サポートされている深度解像度を列挙する XrSession です。resolutionCapacityInputはresolutionsの容量です。必要な容量を取得する場合は 0 にします。resolutionCountOutputは、書き込まれたuint64_tresolutionsの数のポインタ、またはresolutionCapacityInputが不十分な場合に必要な容量のポインタです。resolutionsは XrDepthCameraResolutionANDROID の配列へのポインタですが、resolutionCapacityInputが0の場合、NULLになります。- 必要な
resolutionsサイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。
xrEnumerateDepthResolutionsANDROID は、現在のセッションでサポートされている深度解像度を列挙します。深度分解能は、実行時の優先順位の高い順に並べる必要があります。アプリケーションは、最適なパフォーマンスと品質を実現するために、サポートする最も高い優先度を使用すべきです。
ランタイムは、セッションの存続期間中、この列挙から常に同じバッファ コンテンツを返さなければなりません。
有効な使用方法(暗黙的)
- xrEnumerateDepthResolutionsANDROID を呼び出す前に、
XR_ANDROID_depth_texture拡張機能を有効にする必要があります。 -
sessionは、有効な XrSession ハンドルでなければなりません。 -
resolutionCountOutputはuint32_t値へのポインタでなければなりません。 -
resolutionCapacityInputが0でない場合、resolutionsはresolutionCapacityInputXrDepthCameraResolutionANDROID 値の配列へのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_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 関数を介して解放されなければなりません。
有効な使用方法(暗黙的)
- xrCreateDepthSwapchainANDROID を呼び出す前に、
XR_ANDROID_depth_texture拡張機能を有効にしなければなりません。 -
sessionは、有効な XrSession ハンドルでなければなりません。 -
createInfoは、有効な XrDepthSwapchainCreateInfoANDROID 構造体へのポインタでなければなりません。 -
swapchainは、XrDepthSwapchainANDROID ハンドルへのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_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 の作成オプションを提供します。
有効な使用方法(暗黙的)
- XrDepthSwapchainCreateInfoANDROID を使用する前に、
XR_ANDROID_depth_texture拡張機能を有効にする必要があります。 -
typeはXR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。 -
resolutionは、有効な XrDepthCameraResolutionANDROID 値でなければなりません。 -
createFlagsは、XrDepthSwapchainCreateFlagBitsANDROID 値の有効な組み合わせでなければなりません。 -
createFlagsは0にすることはできません
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);
パラメータの説明
swapchainは、以前に xrCreateDepthSwapchainANDROID で作成された XrDepthSwapchainANDROID ハンドルです。
xrDestroyDepthSwapchainANDROID 関数は、深度スワップチェーンを破棄します。この呼び出しの後、ランタイムは関連するすべてのメモリとリソースを解放する可能性があります。
有効な使用方法(暗黙的)
- xrDestroyDepthSwapchainANDROID を呼び出す前に、
XR_ANDROID_depth_texture拡張機能を有効にしなければなりません。 -
swapchainは、有効な XrDepthSwapchainANDROID ハンドルでなければなりません。
スレッドセーフ
swapchainとその子ハンドルのアクセスは、外部で同期しなければなりません
戻りコード
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
深度テクスチャにアクセスする
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 と同様に動作します。
ランタイムは、スワップチェーンの有効期間中、この列挙から常に同一のバッファ コンテンツを返さなければなりません。
有効な使用方法(暗黙的)
- xrEnumerateDepthSwapchainImagesANDROID を呼び出す前に、
XR_ANDROID_depth_texture拡張機能を有効にする必要があります。 -
depthSwapchainは、有効な XrDepthSwapchainANDROID ハンドルでなければなりません。 -
depthImageCountOutputはuint32_t値へのポインタでなければなりません。 -
depthImageCapacityInputが0でない場合、depthImagesはdepthImageCapacityInputXrDepthSwapchainImageANDROID 構造体の配列へのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_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でなければなりません。
有効な使用方法(暗黙的)
- XrDepthSwapchainImageANDROID を使用する前に、
XR_ANDROID_depth_texture拡張機能を有効にする必要があります。 -
typeはXR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROIDでなければなりません。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
xrAcquireDepthSwapchainImagesANDROID 関数は次のように定義されます。
XrResult xrAcquireDepthSwapchainImagesANDROID(
XrDepthSwapchainANDROID depthSwapchain,
const XrDepthAcquireInfoANDROID* acquireInfo,
XrDepthAcquireResultANDROID* acquireResult);
パラメータの説明
depthSwapchainは、深度画像の XrDepthSwapchainANDROID ハンドルです。acquireInfoは、深度画像を取得する方法に関する情報を含む XrDepthAcquireInfoANDROID です。acquireResultは、取得した深度画像に関する情報を含む XrDepthAcquireResultANDROID を返します。
アプリは、xrAcquireDepthSwapchainImagesANDROID 関数を使用して、xrEnumerateDepthSwapchainImagesANDROID によって列挙された XrDepthSwapchainImageANDROID 配列に、利用可能な最新のスワップチェーン画像インデックス(XrDepthAcquireResultANDROID :: acquiredIndex)を取得できます。返される XrDepthAcquireResultANDROID には、深度データを解釈するために必要な画角やポーズなどの情報も含まれます。xrAcquireDepthSwapchainImagesANDROID の次の呼び出しまで、画像配列で取得したスロットから安全に読み取ることができます。
セッション内の対応する xrBeginFrame 呼び出しと xrEndFrame 呼び出しのペアの間で、xrAcquireDepthSwapchainImagesANDROID の呼び出しは 1 回以下でなければなりません。
- 以前に取得したスワップ チェーン イメージがランタイムによってまだ使用されている場合、ランタイムはブロックされる可能性があります。
- xrAcquireDepthSwapchainImagesANDROID が xrBeginFrame の前または xrEndFrame の後に呼び出された場合、ランタイムは
XR_ERROR_CALL_ORDER_INVALIDを返さなければなりません。 - フレームごとに xrAcquireDepthSwapchainImagesANDROID が複数回呼び出された場合(つまり、実行中のセッションで、関連付けられた xrEndFrame がない xrBeginFrame の呼び出しの後)、ランタイムは
XR_ERROR_LIMIT_REACHEDを返さなければなりません。 - 環境深度データがまだ利用できない場合、ランタイムは
XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROIDを返すことがあります。この場合、アプリケーションは後続のフレームで xrAcquireDepthSwapchainImagesANDROID を再度呼び出すべきです。
有効な使用方法(暗黙的)
- xrAcquireDepthSwapchainImagesANDROID を呼び出す前に、
XR_ANDROID_depth_texture拡張機能を有効にする必要があります。 -
depthSwapchainは、有効な XrDepthSwapchainANDROID ハンドルでなければなりません。 -
acquireInfo有効な XrDepthAcquireInfoANDROID 構造体へのポインタでなければなりません -
acquireResultは、XrDepthAcquireResultANDROID 構造体へのポインタでなければなりません。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_CALL_ORDER_INVALIDXR_ERROR_DEPTH_NOT_AVAILABLE_ANDROIDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_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 つの XrDepthViewANDROID を持ち、インデックス 0 は左目、インデックス 1 は右目です。
有効な使用方法(暗黙的)
-
XR_ANDROID_depth_texture拡張機能を有効にする必要があります。XrDepthAcquireResultANDROID を使用する前に。 -
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
// ...
}
新しいオブジェクト タイプ
新しいコマンド
- xrAcquireDepthSwapchainImagesANDROID
- xrCreateDepthSwapchainANDROID
- xrDestroyDepthSwapchainANDROID
- xrEnumerateDepthResolutionsANDROID
- xrEnumerateDepthSwapchainImagesANDROID
新しい構造体
- XrDepthAcquireInfoANDROID
- XrDepthAcquireResultANDROID
- XrDepthSwapchainCreateInfoANDROID
- XrDepthSwapchainImageANDROID
- XrDepthViewANDROID
XrSystemProperties の拡張 :
新しい列挙型
新しいビットマスク
新しい列挙型定数
XR_ANDROID_DEPTH_TEXTURE_EXTENSION_NAMEXR_ANDROID_depth_texture_SPEC_VERSIONXrObjectType の拡張 :
XR_OBJECT_TYPE_DEPTH_SWAPCHAIN_ANDROID
XrResult の拡張 :
XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID
XrStructureType を拡張する :
XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROIDXR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROIDXR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROIDXR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROIDXR_TYPE_DEPTH_VIEW_ANDROIDXR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID
問題
バージョン履歴
リビジョン 1、2024-09-09(Levana Chen)
- 拡張機能の最初の説明