XR_EXT_spatial_anchor

Name String

XR_EXT_spatial_anchor

ประเภทส่วนขยาย

ส่วนขยายอินสแตนซ์

หมายเลขต่อที่ลงทะเบียนไว้

763

การแก้ไข

1

สถานะการให้สัตยาบัน

ให้สัตยาบัน

ทรัพยากร Dependency ของส่วนขยายและเวอร์ชัน

XR_EXT_spatial_entity

ผู้เขียน

Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance

ภาพรวม

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

Anchor ที่ติดตามตำแหน่งและการวางแนวที่ระบุภายใน XrSpatialContextEXT จะแสดงเป็นเอนทิตีเชิงพื้นที่ที่มี (หรือ "ที่มี") คอมโพเนนต์ XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT

ประโยชน์ของการใช้ Anchor

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

การรองรับรันไทม์

หากรันไทม์รองรับ Anchor เชิงพื้นที่ รันไทม์ต้องระบุการรองรับนี้โดยแจกแจง XR_SPATIAL_CAPABILITY_ANCHOR_EXT ใน xrEnumerateSpatialCapabilitiesEXT

การกำหนดค่า

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

typedef struct XrSpatialCapabilityConfigurationAnchorEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
} XrSpatialCapabilityConfigurationAnchorEXT;

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

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • capability คือ XrSpatialCapabilityEXT
  • enabledComponentCount คือ uint32_t ที่อธิบายจำนวนองค์ประกอบในอาร์เรย์ enabledComponents
  • enabledComponents เป็นตัวชี้ไปยังอาร์เรย์ของ XrSpatialComponentTypeEXT

แอปพลิเคชันสามารถเปิดใช้ความสามารถเชิงพื้นที่ XR_SPATIAL_CAPABILITY_ANCHOR_EXT โดยใส่พอยเตอร์ไปยังโครงสร้าง XrSpatialCapabilityConfigurationAnchorEXT ใน XrSpatialContextCreateInfoEXT :: capabilityConfigs

รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE หาก capability ไม่ใช่ XR_SPATIAL_CAPABILITY_ANCHOR_EXT

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

องค์ประกอบที่รับประกัน

รันไทม์ที่รองรับ XR_SPATIAL_CAPABILITY_ANCHOR_EXT ต้องมีคอมโพเนนต์เชิงพื้นที่ต่อไปนี้เป็นคอมโพเนนต์ที่รับประกันของเอนทิตีทั้งหมดที่สร้างหรือค้นพบโดยความสามารถนี้ และต้องแจกแจงคอมโพเนนต์เหล่านั้นใน xrEnumerateSpatialCapabilityComponentTypesEXT ดังนี้

  • XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT

องค์ประกอบ Anchor

ข้อมูลคอมโพเนนต์

XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT ใช้ XrPosef สำหรับข้อมูลซึ่งระบุตำแหน่งและการวางแนวของ Anchor

โครงสร้างรายการคอมโพเนนต์เพื่อค้นหาข้อมูล

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

typedef struct XrSpatialComponentAnchorListEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           locationCount;
    XrPosef*           locations;
} XrSpatialComponentAnchorListEXT;

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

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • locationCount คือ uint32_t ที่อธิบายจำนวนองค์ประกอบในอาร์เรย์ locations
  • locations คืออาร์เรย์ของ XrPosef

รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE จาก xrQuerySpatialComponentDataEXT หาก XrSpatialComponentAnchorListEXT อยู่ในเชน XrSpatialComponentDataQueryResultEXT :: next แต่ XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT ไม่ได้รวมอยู่ใน XrSpatialComponentDataQueryConditionEXT :: componentTypes

รันไทม์ต้องแสดงผล XR_ERROR_SIZE_INSUFFICIENT จาก xrQuerySpatialComponentDataEXT หาก locationCount น้อยกว่า XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_anchor ก่อนใช้ XrSpatialComponentAnchorListEXT
  • type ต้องเป็น XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT
  • next ต้องเป็น NULL หรือพอยน์เตอร์ที่ถูกต้องไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • locations ต้องเป็นตัวชี้ไปยังอาร์เรย์ของโครงสร้าง locationCount XrPosef
  • พารามิเตอร์ locationCount ต้องมากกว่า 0
การกำหนดค่า

หาก XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT มีการแจกแจงใน XrSpatialCapabilityComponentTypesEXT :: componentTypes สำหรับความสามารถบางอย่าง แอปพลิเคชันสามารถเปิดใช้ได้โดยรวมค่าแจกแจงไว้ในรายการ XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents ของโครงสร้างที่ได้มาจาก XrSpatialCapabilityConfigurationBaseHeaderEXT ของความสามารถที่รองรับคอมโพเนนต์นี้

คอมโพเนนต์นี้ไม่จำเป็นต้องมีการกำหนดค่าพิเศษใดๆ เพื่อรวมไว้ในเชน XrSpatialCapabilityConfigurationBaseHeaderEXT :: next

การสร้าง Spatial Anchor

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

XrResult xrCreateSpatialAnchorEXT(
    XrSpatialContextEXT                         spatialContext,
    const XrSpatialAnchorCreateInfoEXT*         createInfo,
    XrSpatialEntityIdEXT*                       anchorEntityId,
    XrSpatialEntityEXT*                         anchorEntity);

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

  • spatialContext คือ XrSpatialContextEXT ที่สร้างขึ้นก่อนหน้านี้โดยใช้ xrCreateSpatialContextAsyncEXT
  • createInfo คือตัวชี้ไปยัง XrSpatialAnchorCreateInfoEXT
  • anchorEntityId คือตัวชี้ไปยัง XrSpatialEntityIdEXT ซึ่งจะแสดงรหัสของเอนทิตี Anchor
  • anchorEntity คือตัวชี้ไปยัง XrSpatialEntityEXT ซึ่งจะแสดงผลแฮนเดิลของเอนทิตี Anchor

แอปพลิเคชันสามารถสร้าง Anchor เชิงพื้นที่ได้โดยใช้ xrCreateSpatialAnchorEXT

หากต้องการรับข้อมูลคอมโพเนนต์ที่อัปเดตสำหรับ Anchor ให้ส่งค่าที่ป้อนใน anchorEntity ไปยัง XrSpatialUpdateSnapshotCreateInfoEXT :: entities เมื่อสร้างสแนปชอต แอปพลิเคชันสามารถใช้ anchorEntityId เพื่อระบุ Anchor นี้โดยไม่ซ้ำกันในอาร์เรย์ XrSpatialComponentDataQueryResultEXT :: entityIds เมื่อใช้ xrQuerySpatialComponentDataEXT

รันไทม์ต้องแสดงผล XR_ERROR_VALIDATION_FAILURE จาก xrCreateSpatialAnchorEXT หากไม่ได้กำหนดค่า XR_SPATIAL_CAPABILITY_ANCHOR_EXT สำหรับ spatialContext ดูการกำหนดค่าเพื่อดูวิธีกำหนดค่า XrSpatialContextEXT สำหรับความสามารถ XR_SPATIAL_CAPABILITY_ANCHOR_EXT

Anchor ที่แสดงโดย anchorEntity จะใช้ได้ตลอดอายุการใช้งานของ spatialContext หรือจนกว่าแอปพลิเคชันจะเรียกใช้ xrDestroySpatialEntityEXT กับ Anchor ดังกล่าว ขึ้นอยู่กับว่ากรณีใดจะเกิดขึ้นก่อน ส่วนขยายอื่นๆ อาจมีฟังก์ชันเพื่อคง Anchor ที่สร้างขึ้นใหม่นี้ไว้ใน XrSession หลายรายการ หรือเพื่อแชร์ข้ามขอบเขตกระบวนการกับแอปพลิเคชันอื่นๆ

Anchor ที่สร้างขึ้นใหม่ต้องค้นพบได้ในบริบทเชิงพื้นที่หลักจนกว่าจะถูกทำลาย ซึ่งหมายความว่ารันไทม์ต้องรวม anchorEntityId ไว้ในสแนปชอตที่สร้างขึ้นโดยใช้ xrCreateSpatialDiscoverySnapshotAsyncEXT สำหรับ spatialContext หาก Anchor ตรงกับเกณฑ์การค้นพบที่ตั้งไว้ใน XrSpatialDiscoverySnapshotCreateInfoEXT Anchor ที่สร้างขึ้นใหม่อาจค้นพบได้ในบริบทเชิงพื้นที่อื่นๆ ที่กำหนดค่าด้วย XR_SPATIAL_CAPABILITY_ANCHOR_EXT แม้ว่าจะมี XrSpatialEntityIdEXT ที่แตกต่างกัน เนื่องจาก XrSpatialEntityIdEXT หนึ่งๆ จะไม่ซ้ำกันสำหรับ XrSpatialContextEXT ของตัวเอง

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

  • ต้องเปิดใช้ส่วนขยาย XR_EXT_spatial_anchor ก่อนเรียกใช้ xrCreateSpatialAnchorEXT
  • spatialContext ต้องเป็นแฮนเดิล XrSpatialContextEXT ที่ถูกต้อง
  • createInfo ต้องเป็นตัวชี้ไปยังโครงสร้าง XrSpatialAnchorCreateInfoEXT ที่ถูกต้อง
  • anchorEntityId ต้องเป็นตัวชี้ไปยังค่า XrSpatialEntityIdEXT
  • anchorEntity ต้องเป็นตัวชี้ไปยังแฮนเดิล XrSpatialEntityEXT

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

สำเร็จ

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ความล้มเหลว

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_POSE_INVALID
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_SPATIAL_ANCHOR_ATTACHABLE_COMPONENT_NOT_FOUND_ANDROID (หากเปิดใช้ XR_ANDROID_spatial_entity_bound_anchor)
  • XR_ERROR_SPATIAL_ENTITY_ID_INVALID_EXT (หากเปิดใช้ XR_ANDROID_spatial_entity_bound_anchor)

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

typedef struct XrSpatialAnchorCreateInfoEXT {
    XrStructureType    type;
    const void*        next;
    XrSpace            baseSpace;
    XrTime             time;
    XrPosef            pose;
} XrSpatialAnchorCreateInfoEXT;

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

  • type คือ XrStructureType ของโครงสร้างนี้
  • next คือ NULL หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • baseSpace คือ XrSpace ที่ใช้ pose
  • time คือXrTimeที่ baseSpace ตั้งอยู่ (และมีการใช้ pose)
  • pose คือตำแหน่งของเอนทิตี Anchor

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

ค้นหาท่าทางของ Anchor

หลังจากสร้าง Anchor แล้ว รันไทม์ควรปรับตำแหน่งและการวางแนวเมื่อเวลาผ่านไปโดยสัมพันธ์กับพื้นที่อื่นๆ เพื่อรักษาการจัดแนวที่ดีที่สุดกับตำแหน่งจริงเดิม แม้ว่าการดำเนินการดังกล่าวจะเปลี่ยนความสัมพันธ์ของ Anchor กับ XrSpatialAnchorCreateInfoEXT :: baseSpace เดิมที่ใช้ในการเริ่มต้นก็ตาม

แอปพลิเคชันสามารถใช้ xrCreateSpatialUpdateSnapshotEXT กับ XrSpatialEntityEXT ของ Anchor เพื่อสร้าง XrSpatialSnapshotEXT ใหม่ แล้วค้นหาคอมโพเนนต์ XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT จากสแนปชอตนั้นโดยใช้ xrQuerySpatialComponentDataEXT แอปพลิเคชันสามารถเพิ่ม XrSpatialComponentAnchorListEXT ลงใน XrSpatialComponentDataQueryResultEXT :: next เพื่อดึงข้อมูลตำแหน่งล่าสุดของ Anchor

รันไทม์อาจตั้งค่าสถานะการติดตามของ Anchor ที่สร้างใหม่เป็น XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT แอปพลิเคชันต้องอ่านเฉพาะสถานะของเอนทิตี Anchor ที่ระบุใน XrSpatialComponentDataQueryResultEXT :: entityStates และข้อมูลคอมโพเนนต์ Anchor ของเอนทิตีหากสถานะการติดตามคือ XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT

หลักเกณฑ์การใช้ Anchor

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

โค้ดตัวอย่าง

กำหนดค่าความสามารถของ Anchor

ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าความสามารถของ Anchor เมื่อสร้างบริบทเชิงพื้นที่

// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{

  std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
    XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
  };

  XrSpatialCapabilityConfigurationAnchorEXT anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
  anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
  anchorConfig.enabledComponentCount = enabledComponents.size();
  anchorConfig.enabledComponents = enabledComponents.data();

  std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
    reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
  };

  XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
  spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
  spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
  XrFutureEXT createContextFuture;
  CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

  waitUntilReady(createContextFuture);

  XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
  if (completion.futureResult != XR_SUCCESS) {
    return;
  }

  spatialContext = completion.spatialContext;
}

// ...
// Create spatial anchors and get their latest pose in the frame loop.
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

สร้างหมุดเชิงพื้นที่และรับตำแหน่งของหมุด

ตัวอย่างต่อไปนี้แสดงวิธีสร้าง Anchor เชิงพื้นที่และรับท่าทางของ Anchor ในทุกเฟรม

XrSpatialAnchorCreateInfoEXT createInfo{XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT};
createInfo.baseSpace = localSpace;
createInfo.time = predictedDisplayTime;
createInfo.pose = {{0, 0, 0, 1}, {1, 1, 1}};

XrSpatialEntityIdEXT spatialAnchorEntityId;
XrSpatialEntityEXT spatialAnchorEntity;
CHK_XR(xrCreateSpatialAnchorEXT(spatialContext, &createInfo, &spatialAnchorEntityId, &spatialAnchorEntity));

auto updateAnchorLocation = [&](XrTime time) {
  // We want to get updated data for all components of the entities, so skip specifying componentTypes.
  XrSpatialUpdateSnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_UPDATE_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.entityCount = 1;
  snapshotCreateInfo.entities = &spatialAnchorEntity;
  snapshotCreateInfo.baseSpace = localSpace;
  snapshotCreateInfo.time = time;

  XrSpatialSnapshotEXT snapshot;
  CHK_XR(xrCreateSpatialUpdateSnapshotEXT(spatialContext, &snapshotCreateInfo, &snapshot));

  // Query for the entities that have the anchor component on them.
  std::array<XrSpatialComponentTypeEXT, 1> componentsToQuery {XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT};
  XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
  queryCond.componentTypeCount = componentsToQuery.size();
  queryCond.componentTypes = componentsToQuery.data();

  XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
  CHK_XR(xrQuerySpatialComponentDataEXT(snapshot, &queryCond, &queryResult));

  std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
  std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
  queryResult.entityIdCapacityInput = entityIds.size();
  queryResult.entityIds = entityIds.data();
  queryResult.entityStateCapacityInput = entityStates.size();
  queryResult.entityStates = entityStates.data();

  // query for the pose data
  std::vector<XrPosef> locations(queryResult.entityIdCountOutput);
  XrSpatialComponentAnchorListEXT locationList{XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT};
  locationList.locationCount = locations.size();
  locationList.locations = locations.data();
  queryResult.next = &locationList;

  CHK_XR(xrQuerySpatialComponentDataEXT(snapshot, &queryCond, &queryResult));

  for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
    if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
      // Pose for entity entityIds[i] is locations[i].
    }
  }

  CHK_XR(xrDestroySpatialSnapshotEXT(snapshot));
};


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

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

  updateAnchorLocation(time);

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

CHK_XR(xrDestroySpatialEntityEXT(spatialAnchorEntity));

คำสั่งใหม่

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

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

  • XR_EXT_SPATIAL_ANCHOR_EXTENSION_NAME
  • XR_EXT_spatial_anchor_SPEC_VERSION
  • การขยาย XrSpatialCapabilityEXT :

    • XR_SPATIAL_CAPABILITY_ANCHOR_EXT
  • การขยาย XrSpatialComponentTypeEXT :

    • XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT
  • การขยาย XrStructureType :

    • XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT
    • XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT

ปัญหา

  • เหตุใด xrCreateSpatialAnchorEXT จึงแสดงผลรหัสเอนทิตีและแฮนเดิลเอนทิตี

    • แก้ไขแล้ว
    • คำตอบ: ฟังก์ชัน xrCreateSpatialAnchorEXT อาจให้เพียงรหัสเอนทิตีเป็นเอาต์พุต และแอปพลิเคชันสามารถสร้างแฮนเดิลเอนทิตีสำหรับรหัสนั้นได้โดยใช้ xrCreateSpatialEntityFromIdEXT อย่างไรก็ตาม เมื่อพิจารณาจากการใช้งานทั่วไปของ Anchor ที่แอปพลิเคชันค้นหาท่าทางของ Anchor ทุกเฟรม จึงเหมาะที่จะใช้ใน "ภาพรวมการอัปเดต" ซึ่งต้องใช้แฮนเดิลเอนทิตีเป็นอินพุต เมื่อคาดการณ์กรณีการใช้งานทั่วไปนี้ xrCreateSpatialAnchorEXT จะดำเนินการ xrCreateSpatialEntityFromIdEXT ในนามของแอปพลิเคชันและให้แฮนเดิลเอนทิตีเพื่อใช้กับ xrCreateSpatialUpdateSnapshotEXT

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

  • ฉบับแก้ไข 1, 10-07-2024 (Nihav Jain, Google)

    • คำอธิบายส่วนขยายเริ่มต้น