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คือ XrSpatialCapabilityEXTenabledComponentCountคือuint32_tที่อธิบายจำนวนองค์ประกอบในอาร์เรย์enabledComponentsenabledComponentsคือตัวชี้ไปยังอาร์เรย์ของ XrSpatialComponentTypeEXT
แอปพลิเคชัน สามารถ เปิดใช้ความสามารถเชิงพื้นที่ XR_SPATIAL_CAPABILITY_ANCHOR_EXT ได้โดยใส่ตัวชี้ไปยังโครงสร้าง XrSpatialCapabilityConfigurationAnchorEXT ใน XrSpatialContextCreateInfoEXT :: capabilityConfigs
รันไทม์ ต้อง แสดงผล XR_ERROR_VALIDATION_FAILURE หาก capability ไม่ใช่ XR_SPATIAL_CAPABILITY_ANCHOR_EXT
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_anchorก่อน ใช้ XrSpatialCapabilityConfigurationAnchorEXT -
typeต้อง เป็นXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT -
nextต้อง เป็นNULLหรือตัวชี้ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
capabilityต้อง เป็นค่า XrSpatialCapabilityEXT ที่ถูกต้อง -
enabledComponentsต้อง เป็น Pointer ไปยัง อาร์เรย์ ของค่าenabledComponentCountXrSpatialComponentTypeEXT ที่ถูกต้อง - พารามิเตอร์
enabledComponentCountต้อง มากกว่า0
คอมโพเนนต์ที่รับประกัน
รันไทม์ที่รองรับ 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ที่อธิบายจำนวนองค์ประกอบในอาร์เรย์locationslocationsคืออาร์เรย์ของ 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_EXT_spatial_anchorก่อน ใช้ XrSpatialComponentAnchorListEXT -
typeต้อง เป็นXR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT -
nextต้อง เป็นNULLหรือตัวชี้ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง -
locationsต้อง เป็นตัวชี้ไปยังอาร์เรย์ของlocationCountXrPosef โครงสร้าง - พารามิเตอร์
locationCountต้อง มากกว่า0
การกำหนดค่า
หากมีการแจกแจง 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 ที่สร้างขึ้นก่อนหน้านี้โดยใช้ xrCreateSpatialContextAsyncEXTcreateInfoคือ Pointer ไปยัง XrSpatialAnchorCreateInfoEXTanchorEntityIdคือตัวชี้ไปยังXrSpatialEntityIdEXTที่จะแสดงผลรหัสของเอนทิตี AnchoranchorEntityคือตัวชี้ไปยัง 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_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILUREXR_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 ที่ใช้posetimeคือXrTimeที่baseSpaceอยู่ (และใช้pose)poseคือตำแหน่งของเอนทิตี Anchor
การใช้งานที่ถูกต้อง (โดยนัย)
- ต้องเปิดใช้ส่วนขยาย
XR_EXT_spatial_anchorก่อน ใช้ XrSpatialAnchorCreateInfoEXT -
typeต้อง เป็นXR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT -
nextต้อง เป็นNULLหรือตัวชี้ที่ถูกต้องไปยังโครงสร้างถัดไปในห่วงโซ่โครงสร้าง ดูเพิ่มเติมที่ XrSpatialAnchorParentANDROID -
baseSpaceต้อง เป็นแฮนเดิล XrSpace ที่ถูกต้อง
ค้นหาท่าทางของ 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));
คำสั่งใหม่
โครงสร้างใหม่
- XrSpatialAnchorCreateInfoEXT
- XrSpatialCapabilityConfigurationAnchorEXT
การขยาย XrSpatialComponentDataQueryResultEXT :
ค่าคงที่ Enum ใหม่
XR_EXT_SPATIAL_ANCHOR_EXTENSION_NAMEXR_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_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXTXR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT
ปัญหา
เหตุใด xrCreateSpatialAnchorEXT จึงแสดงผลรหัสเอนทิตีและแฮนเดิลเอนทิตี
- แก้ไขแล้ว
- คำตอบ: ฟังก์ชัน xrCreateSpatialAnchorEXT สามารถแสดงผลเฉพาะรหัสเอนทิตี และแอปพลิเคชันสามารถสร้างแฮนเดิลเอนทิตีสำหรับรหัสนั้นโดยใช้ xrCreateSpatialEntityFromIdEXT อย่างไรก็ตาม การใช้งาน Anchor โดยทั่วไปที่แอปพลิเคชันจะค้นหาท่าทางของ Anchor ทุกเฟรม ทำให้ Anchor เป็นตัวเลือกที่ดีที่จะใช้ใน "การอัปเดตสแนปชอต" ซึ่งต้องใช้แฮนเดิลเอนทิตีเป็นอินพุต xrCreateSpatialAnchorEXT คาดการณ์ถึงกรณีการใช้งานทั่วไปนี้ จึงดำเนินการ xrCreateSpatialEntityFromIdEXT ในนามของแอปพลิเคชันและจัดหาแฮนเดิลเอนทิตีให้แอปพลิเคชันใช้กับ xrCreateSpatialUpdateSnapshotEXT
ประวัติเวอร์ชัน
Revision 1, 10-07-2024 (Nihav Jain, Google)
- คำอธิบายส่วนขยายเริ่มต้น