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คือ 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ต้องเป็นตัวชี้ไปยังอาร์เรย์ของค่า XrSpatialComponentTypeEXT ที่ถูกต้องenabledComponentCountค่า - พารามิเตอร์
enabledComponentCountต้องมากกว่า0
องค์ประกอบที่รับประกัน
รันไทม์ที่รองรับ 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ที่อธิบายจำนวนองค์ประกอบในอาร์เรย์locationslocationsคืออาร์เรย์ของ 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ต้องเป็นตัวชี้ไปยังอาร์เรย์ของโครงสร้างlocationCountXrPosef - พารามิเตอร์
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 ที่สร้างขึ้นก่อนหน้านี้โดยใช้ xrCreateSpatialContextAsyncEXTcreateInfoคือตัวชี้ไปยัง 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 ที่สร้างขึ้นใหม่ต้องค้นพบได้ในบริบทเชิงพื้นที่หลักจนกว่าจะถูกทำลาย ซึ่งหมายความว่ารันไทม์ต้องรวม 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_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หรือตัวชี้ไปยังโครงสร้างถัดไปในเชนโครงสร้าง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 กับ 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));
คำสั่งใหม่
โครงสร้างใหม่
- 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 ทุกเฟรม จึงเหมาะที่จะใช้ใน "ภาพรวมการอัปเดต" ซึ่งต้องใช้แฮนเดิลเอนทิตีเป็นอินพุต เมื่อคาดการณ์กรณีการใช้งานทั่วไปนี้ xrCreateSpatialAnchorEXT จะดำเนินการ xrCreateSpatialEntityFromIdEXT ในนามของแอปพลิเคชันและให้แฮนเดิลเอนทิตีเพื่อใช้กับ xrCreateSpatialUpdateSnapshotEXT
ประวัติเวอร์ชัน
ฉบับแก้ไข 1, 10-07-2024 (Nihav Jain, Google)
- คำอธิบายส่วนขยายเริ่มต้น