ส่วนขยาย XR_ANDROID_depth_texture ของ OpenXR

สตริงชื่อ

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

ภาพรวม

ส่วนขยายนี้ช่วยให้แอปพลิเคชันขอแผนที่ความลึกของสภาพแวดล้อมจริงรอบๆ เฮดเซตและค้นหาความละเอียดความลึกที่รองรับเมื่อสร้าง

ส่วนขยายนี้มีไว้เพื่อแสดงข้อมูลเชิงลึกแบบดิบและแบบเรียบสำหรับส่วนที่บดบัง การทดสอบการชน และงานอื่นๆ ที่เจาะจงซึ่งใช้ประโยชน์จากเรขาคณิตของฉากที่แม่นยำ เช่น การตรวจจับใบหน้าปลอม

ตรวจสอบความสามารถของระบบ

โครงสร้าง XrSystemDepthTrackingPropertiesANDROID มีคำจำกัดความดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือพอยน์เตอร์ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • supportsDepthTracking คือ XrBool32 ซึ่งระบุว่าระบบปัจจุบันรองรับการติดตามแบบใช้ระยะชัดลึกหรือไม่

แอปพลิเคชันสามารถตรวจสอบว่าระบบสามารถติดตามแบบใช้ข้อมูลเชิงลึกหรือไม่โดยขยายโครงสร้าง XrSystemProperties ด้วยโครงสร้าง XrSystemDepthTrackingPropertiesANDROID เมื่อเรียกใช้ xrGetSystemProperties

การใช้งานที่ถูกต้อง (โดยนัย)

การแก้ไขความลึกของคำค้นหา

ฟังก์ชัน 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 แต่สามารถเป็น NULL ได้หาก resolutionCapacityInput เป็น 0
  • ดูรายละเอียดเกี่ยวกับการดึงข้อมูลresolutionsขนาดที่ต้องการได้ที่ส่วนพารามิเตอร์ขนาดบัฟเฟอร์

xrEnumerateDepthResolutionsANDROID จะแสดงความละเอียดของภาพแบบ 3 มิติที่เซสชันปัจจุบันรองรับ ความละเอียดของภาพ 3 มิติควรเรียงตามลำดับจากค่ากำหนดรันไทม์ที่สูงที่สุดไปจนถึงต่ำที่สุด แอปพลิเคชันควรใช้ค่ากําหนดสูงสุดที่รองรับเพื่อให้ได้ประสิทธิภาพและคุณภาพที่ดีที่สุด

การใช้งานที่ถูกต้อง (โดยนัย)

  • ต้องเปิดใช้ส่วนขยาย 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_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT

อาร์เรย์ 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
    } XrDepthCameraResolutionANDROID;

คำอธิบายรายการ

  • XR_DEPTH_CAMERA_RESOLUTION_80x80_ANDROID — ความละเอียดของรูปภาพความลึกและความเชื่อมั่นคือ 80x80
  • XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID — ความละเอียดของรูปภาพความลึกและรูปภาพความเชื่อมั่นคือ 160x160
  • XR_DEPTH_CAMERA_RESOLUTION_320x320_ANDROID — ความละเอียดของรูปภาพความลึกและความเชื่อมั่นคือ 320x320

สร้าง Swapchain สำหรับความลึก

XR_DEFINE_HANDLE(XrDepthSwapchainANDROID)

XrDepthSwapchainANDROID คือแฮนเดิลสำหรับ Swapchain ของภาพ 3 มิติ

ฟังก์ชัน xrCreateDepthSwapchainANDROID มีคำจำกัดความดังนี้

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

คําอธิบายพารามิเตอร์

  • session คือ XrSession ที่สร้าง Swapchain ของภาพระดับความลึก

  • createInfo เป็นพอยน์เตอร์ไปยังโครงสร้าง XrDepthSwapchainCreateInfoANDROID ที่มีพารามิเตอร์ที่จะใช้สร้าง Swapchain

  • swapchain คือพอยน์เตอร์ไปยังแฮนเดิลที่แสดงผล XrDepthSwapchainANDROID ที่สร้างขึ้น

แอปพลิเคชันสามารถใช้ฟังก์ชัน xrCreateDepthSwapchainANDROID เพื่อสร้าง Swapchain ของภาพความลึกซึ่งจัดการทั้งภาพความลึกและภาพความเชื่อมั่น

ระบบอาจใช้แฮนเดิล Swapchain ของภาพระดับความลึกที่แสดงผลในการเรียก API ในภายหลัง ต้องยกเลิกการจองตัวแฮนเดิล XrDepthSwapchainANDROID ในที่สุดโดยใช้ฟังก์ชัน xrDestroyDepthSwapchainANDROID

การใช้งานที่ถูกต้อง (โดยนัย)

รหัสการคืนสินค้า

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ไม่สำเร็จ

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

โครงสร้าง XrDepthSwapchainCreateInfoANDROID ได้รับการกําหนดดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือพอยน์เตอร์ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • resolution คือ XrDepthCameraResolutionANDROID ที่ควรสร้างพื้นผิวความลึกและความเชื่อมั่น
  • createFlags คือ XrDepthSwapchainCreateFlagsANDROID อย่างน้อย 1 รายการ

โครงสร้าง XrDepthSwapchainCreateInfoANDROID มีตัวเลือกการสร้างสำหรับ XrDepthSwapchainANDROID เมื่อส่งไปยัง xrCreateDepthSwapchainANDROID

การใช้งานที่ถูกต้อง (โดยนัย)

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;

ฟังก์ชัน xrDestroyDepthSwapchainANDROID มีคำจำกัดความดังนี้

XrResult xrDestroyDepthSwapchainANDROID(
    XrDepthSwapchainANDROID                     swapchain);

คําอธิบายพารามิเตอร์

  • swapchain เป็นตัวแฮนเดิล XrDepthSwapchainANDROID ที่ xrCreateDepthSwapchainANDROID สร้างขึ้นก่อนหน้านี้

ฟังก์ชัน xrDestroyDepthSwapchainANDROID จะทำลาย DepthSwapchain

การใช้งานที่ถูกต้อง (โดยนัย)

ความปลอดภัยของชุดข้อความ

  • การเข้าถึง 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 ที่จะรับรูปภาพจาก
  • depthImageCapacityInput คือความจุของอาร์เรย์ depthImages หรือ 0 เพื่อบ่งบอกคําขอดึงข้อมูลความจุที่จําเป็น
  • depthImageCountOutput คือพอยน์เตอร์ไปยังจํานวน depthImages ที่เขียน หรือพอยน์เตอร์ไปยังความจุที่จําเป็นในกรณีที่ depthImageCapacityInput ไม่เพียงพอ
  • depthImages เป็นพอยน์เตอร์ไปยังอาร์เรย์ของโครงสร้าง XrDepthSwapchainImageANDROID สามารถเป็น NULL ได้หาก depthImageCapacityInput เป็น 0
  • ดูรายละเอียดเกี่ยวกับการดึงข้อมูล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_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT

โครงสร้าง 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 หรือเคอร์เซอร์ไปยังรูปภาพความลึกแบบ RAW สำหรับทั้งมุมมองซ้ายและขวา ค่ามีหน่วยเป็นเมตร ค่าพิเศษ: 0.0บ่งชี้ว่าพิกเซลความลึกไม่ถูกต้องหรือว่างเปล่าในความลึกดิบ Inf บ่งชี้ว่าความลึกที่ทราบอยู่ไกลออกไปอย่างไม่มีที่สิ้นสุด
  • rawDepthConfidenceImage คือ NULL หรือเคอร์เซอร์ไปยังภาพความเชื่อมั่นเกี่ยวกับความลึกแบบ RAW สำหรับทั้งมุมมองซ้ายและขวา
  • smoothDepthImage คือ NULL หรือเคอร์เซอร์สำหรับปรับภาพความลึกให้เรียบเนียนสำหรับทั้งมุมมองซ้ายและขวา ค่ามีหน่วยเป็นเมตร ค่าพิเศษ: 0.0 ระบุพิกเซลความลึกที่ไม่ถูกต้องหรือว่างเปล่าในความลึกแบบเรียบ Inf ระบุความลึกที่ทราบซึ่งอยู่ไกลออกไปอย่างไม่มีที่สิ้นสุด
  • smoothDepthConfidenceImage คือ NULL หรือเคอร์เซอร์เพื่อปรับความลึกของภาพอย่างราบรื่นทั้งสำหรับมุมมองซ้ายและขวา

XrDepthSwapchainImageANDROID แสดงภาพความลึกจาก XrDepthSwapchainANDROID ที่อ่านได้ ซึ่งจัดสรรตามที่อธิบายไว้ใน XrDepthSwapchainCreateInfoANDROID::resolution และ XrDepthSwapchainCreateInfoANDROID::createFlags ขณะเรียกใช้ xrCreateDepthSwapchainANDROID สำหรับภาพความลึกแต่ละภาพ ให้ทำดังนี้

  • ค่ารูปภาพจะวางไว้ในหน่วยความจำตามลําดับแถว โดยไม่มีการเว้นวรรคระหว่างแถว
  • ค่าแรกคือด้านซ้ายบน และค่าสุดท้ายคือด้านขวาล่าง
  • ขนาดของหน่วยความจําที่ชี้ถึงจะกําหนดโดยค่าของ xrEnumerateDepthSwapchainImagesANDROID และตั้งค่าโดย XrDepthSwapchainCreateInfoANDROID::resolution ขณะเรียกใช้ xrCreateDepthSwapchainANDROID ตัวอย่างเช่น หาก resolution มีค่าเป็น XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID รูปภาพความลึกจะมีขนาด 2*160*160*sizeof(float)
  • ค่าของ rawDepthImage ต้องเป็น NULL หากไม่ได้ตั้งค่า XrDepthSwapchainCreateInfoANDROID::createFlags XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID
  • ค่าของ rawDepthConfidenceImage ต้องเป็น NULL หากไม่ได้ตั้งค่า XrDepthSwapchainCreateInfoANDROID::createFlags XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID
  • ค่าของ smoothDepthImage ต้องเป็น NULL หากไม่ได้ตั้งค่า XrDepthSwapchainCreateInfoANDROID::createFlags XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID
  • ค่าของ smoothDepthConfidenceImage ต้องเป็น NULL หากไม่ได้ตั้งค่า XrDepthSwapchainCreateInfoANDROID::createFlags XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID

การใช้งานที่ถูกต้อง (โดยนัย)

ฟังก์ชัน xrAcquireDepthSwapchainImagesANDROID มีคำจำกัดความดังนี้

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

คําอธิบายพารามิเตอร์

  • depthSwapchain เป็นแฮนเดิล XrDepthSwapchainANDROID สำหรับภาพความลึก
  • acquireInfo คือ XrDepthAcquireInfoANDROID ที่มีข้อมูลเกี่ยวกับวิธีรับภาพความลึก
  • acquireResult คือ XrDepthAcquireResultANDROID ที่แสดงผลซึ่งมีข้อมูลเกี่ยวกับรูปภาพความลึกที่ได้มา

แอปพลิเคชันสามารถใช้ฟังก์ชัน xrAcquireDepthSwapchainImagesANDROID เพื่อรับดัชนีรูปภาพ Swapchain ล่าสุดที่ใช้ได้ เช่น XrDepthAcquireResultANDROID::acquiredIndex ลงในอาร์เรย์ XrDepthSwapchainImageANDROID ที่ระบุโดย xrEnumerateDepthSwapchainImagesANDROID XrDepthAcquireResultANDROID ที่แสดงผลยังมีข้อมูลอื่นๆ ด้วย เช่น มุมมองและท่าทางที่จำเป็นในการตีความข้อมูลความลึก คุณสามารถอ่านจากช่องที่ได้มาในแอตทริบิวต์รูปภาพได้จนกว่าจะเรียกใช้ xrAcquireDepthSwapchainImagesANDROID ครั้งถัดไป

ต้องมีการเรียกใช้ xrAcquireDepthSwapchainImagesANDROID ไม่เกิน 1 ครั้งระหว่างการเรียกใช้ xrBeginFrame และ xrEndFrame ที่สอดคล้องกันคู่ใดคู่หนึ่งในแต่ละเซสชัน

การใช้งานที่ถูกต้อง (โดยนัย)

รหัสการคืนสินค้า

สำเร็จ

  • 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_DEPTH_NOT_AVAILABLE_ANDROID
  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_TIME_INVALID

โครงสร้าง XrDepthAcquireInfoANDROID มีคำจำกัดความดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือพอยน์เตอร์ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • space คือ XrSpace ที่กําหนดเฟรมอ้างอิงของการโพสท่าที่แสดงผลใน XrDepthAcquireResultANDROID::views
  • displayTime คือ XrTime ที่ระบุเวลาที่ใช้ในการประมวลผลท่าทางสำหรับท่าทางที่แสดงผลใน XrDepthAcquireResultANDROID::views แอปพลิเคชันควรแสดงนานกว่าเวลาแสดงผลที่คาดการณ์ไว้สำหรับเฟรมปัจจุบัน

การใช้งานที่ถูกต้อง (โดยนัย)

โครงสร้าง XrDepthAcquireResultANDROID มีคำจำกัดความดังนี้

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

คำอธิบายสมาชิก

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือพอยน์เตอร์ไปยังโครงสร้างถัดไปในเชนโครงสร้าง ไม่มีการกำหนดโครงสร้างดังกล่าวใน OpenXR หลักหรือส่วนขยายนี้
  • acquiredIndex คือดัชนีของพื้นผิวที่รับไว้ในอาร์เรย์ XrDepthSwapchainImageANDROID ที่ระบุโดย xrEnumerateDepthSwapchainImagesANDROID
  • exposureTimestamp คือ XrTime ที่ระบุเวลาที่บันทึกแผนที่ความลึก
  • views คืออาร์เรย์ของ XrDepthViewANDROID 2 รายการ โดย 1 รายการสำหรับตาแต่ละข้าง โดยที่ดัชนี 0 คือตาซ้ายและดัชนี 1 คือตาขวา

การใช้งานที่ถูกต้อง (โดยนัย)

โครงสร้าง 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

// 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,
  .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,

  // Use the resolution supported by the runtime.
  .resolution = supportedDepthResolution,
};

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,
        .time = time};
    XrDepthAcquireResultANDROID acquireResult = {
        .type = XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID,
    };
    CHK_XR(xrAcquireDepthImagesANDROID(
        depthSwapchain, &acquireInfo, &acquireResult));

    // Each value in a depth image corresponds to a point in the real world.
    // The sample code in this section 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.acquireIndex];

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

    // Get depth value from left eye.
    // A right depth value would be 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 = (tanB + (tanU - tanB)*t)*depthL;

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

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

ประเภทออบเจ็กต์ใหม่

ค่าคงที่ Enum ใหม่

เพิ่มรายการต่อไปนี้ในคําจํากัดความของ XrObjectType

  • XR_OBJECT_TYPE_DEPTH_SWAPCHAIN_ANDROID

การแจกแจงค่า XrResult ขยายให้มีรายการต่อไปนี้

  • XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID

เพิ่มรายการต่อไปนี้ในอนุกรม XrStructureType

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

Enumeration ใหม่

โครงสร้างใหม่

ฟังก์ชันใหม่

ปัญหา

ประวัติเวอร์ชัน

  • การแก้ไข 1, 09-09-2024 (Levana Chen)
    • คำอธิบายส่วนขยายเริ่มต้น