XR_EXT_spatial_anchor

Name String

XR_EXT_spatial_anchor

Extension Type

Instance extension

Registered Extension Number

763

Revision

1

Ratification Status

Ratified

Extension and Version Dependencies

XR_EXT_spatial_entity

Contributors

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 และอนุญาตให้แอปพลิเคชันสร้าง 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 หรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • 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

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

The 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 หรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • 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 น้อยกว่า entityIdCountOutput ของ XrSpatialComponentDataQueryResultEXT

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

การกำหนดค่า

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

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

การสร้าง Anchor เชิงพื้นที่

ฟังก์ชัน xrCreateSpatialAnchorEXT มีการกำหนดไว้ดังนี้

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

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

  • spatialContext คือ XrSpatialContextEXT ที่สร้างขึ้นก่อนหน้านี้โดยใช้ xrCreateSpatialContextAsyncEXT
  • createInfo คือ Pointer ไปยัง 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 นี้ข้ามขอบเขตของกระบวนการกับแอปพลิเคชันอื่นๆ

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 ต้อง เป็น Pointer ไปยังค่า 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 หรือ Pointer ไปยังโครงสร้างถัดไปในเชนโครงสร้าง
  • baseSpace คือ XrSpace ที่ใช้ pose
  • time คือ XrTime ที่ baseSpace อยู่ (และใช้ pose)
  • pose คือตำแหน่งของเอนทิตี Anchor

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

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

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

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

ตัวอย่างต่อไปนี้แสดงวิธีสร้าง 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 ทุกเฟรม ทำให้ Anchor เป็นตัวเลือกที่ดีที่จะใช้ใน "การอัปเดตสแนปชอต" ซึ่งต้องใช้แฮนเดิลเอนทิตีเป็นอินพุต xrCreateSpatialAnchorEXT คาดการณ์ถึงกรณีการใช้งานทั่วไปนี้ จึงดำเนินการ xrCreateSpatialEntityFromIdEXT ในนามของแอปพลิเคชันและจัดหาแฮนเดิลเอนทิตีให้แอปพลิเคชันใช้กับ xrCreateSpatialUpdateSnapshotEXT

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

  • Revision 1, 10-07-2024 (Nihav Jain, Google)

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