XR_EXT_spatial_anchor
Name String
XR_EXT_spatial_anchor
एक्सटेंशन का टाइप
इंस्टेंस एक्सटेंशन
रजिस्टर किया गया एक्सटेंशन नंबर
763
बदलाव
1
पुष्टि की स्थिति
मंज़ूरी दी गई
एक्सटेंशन और वर्शन डिपेंडेंसी
XR_EXT_spatial_entity
योगदान देने वाले
निहाव जैन, Google
नताली फ़्लूरी, Meta
यूइची तागुची, Meta
रॉन बेसेम्स, Meta
यिन ली, Microsoft
जिमी आलमपरमबिल, ByteDance
ज़ीपेंग लियू, ByteDance
जून यान, ByteDance
खास जानकारी
यह एक्सटेंशन XR_EXT_spatial_entity पर आधारित है. इसकी मदद से, ऐप्लिकेशन स्पेशल ऐंकर बना सकते हैं. ये ऐंकर, उपयोगकर्ता के आस-पास के माहौल में मौजूद आर्बिट्रेरी पॉइंट होते हैं. इन्हें रनटाइम के दौरान ट्रैक किया जाता है. इसके बाद, रनटाइम को ज़रूरत के हिसाब से, समय के साथ ऐंकर के ऑरिजिन की पोज़िशन और ओरिएंटेशन में बदलाव करना चाहिए. यह बदलाव, अन्य सभी स्पेस और ऐंकर से अलग होना चाहिए, ताकि यह पक्का किया जा सके कि यह असल दुनिया में अपनी ओरिजनल मैपिंग को बनाए रखे.
XrSpatialContextEXT में किसी पोज़िशन और ओरिएंटेशन को ट्रैक करने वाले ऐंकर को, XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT कॉम्पोनेंट वाली (या "जिसमें कॉम्पोनेंट है") स्पेशल एंटिटी के तौर पर दिखाया जाता है.
ऐंकर इस्तेमाल करने के फ़ायदे
XrSpatialContextEXT के लाइफ़टाइम के दौरान, उपयोगकर्ता के आस-पास के माहौल के बारे में रनटाइम की जानकारी अपडेट होती रहती है. इस वजह से, ऐसा हो सकता है कि वर्चुअल ऑब्जेक्ट, ऐप्लिकेशन की ओर से तय की गई जगह से दूर चले जाएं. इससे ऐप्लिकेशन की असलियत और उपयोगकर्ता के अनुभव की क्वालिटी पर असर पड़ता है. वर्चुअल ऑब्जेक्ट को जहां रखा गया है उसके पास एक ऐंकर बनाकर और फिर उस वर्चुअल ऑब्जेक्ट को हमेशा उसके ऐंकर के हिसाब से रेंडर करके, कोई ऐप्लिकेशन यह पक्का कर सकता है कि हर वर्चुअल ऑब्जेक्ट, असल दुनिया में एक ही जगह और ओरिएंटेशन में दिखे. साथ ही, कुछ रेफ़रंस स्पेस के उलट, सिस्टम-लेवल पर रीसेंटर करने से ऐंकर पर कोई असर नहीं पड़ता.
रनटाइम से जुड़ी सहायता
अगर रनटाइम, स्पेशल ऐंकर के साथ काम करता है, तो उसे ज़रूरी तौर पर xrEnumerateSpatialCapabilitiesEXT में XR_SPATIAL_CAPABILITY_ANCHOR_EXT को शामिल करके, यह जानकारी देनी होगी.
कॉन्फ़िगरेशन
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कलेक्शन में मौजूद एलिमेंट की संख्या बताता है.enabledComponentsXrSpatialComponentTypeEXT के कलेक्शन का पॉइंटर है.
ऐप्लिकेशन, XR_SPATIAL_CAPABILITY_ANCHOR_EXT की स्पेशल कैपेबिलिटी को चालू कर सकते हैं. इसके लिए, उन्हें XrSpatialContextCreateInfoEXT :: capabilityConfigs में XrSpatialCapabilityConfigurationAnchorEXT स्ट्रक्चर का पॉइंटर शामिल करना होगा.
अगर capability, XR_SPATIAL_CAPABILITY_ANCHOR_EXT नहीं है, तो रनटाइम को XR_ERROR_VALIDATION_FAILURE दिखाना ज़रूरी है.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialCapabilityConfigurationAnchorEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_anchorएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
capabilityकी वैल्यू, XrSpatialCapabilityEXT की मान्य वैल्यू होनी चाहिए -
enabledComponentsकोenabledComponentCountमान्य XrSpatialComponentTypeEXT वैल्यू के कलेक्शन का पॉइंटर होना चाहिए -
enabledComponentCountपैरामीटर की वैल्यू,0से ज़्यादा होनी चाहिए
गारंटी वाले कॉम्पोनेंट
XR_SPATIAL_CAPABILITY_ANCHOR_EXT के साथ काम करने वाले रनटाइम को, इस सुविधा से बनाई गई या खोजी गई सभी इकाइयों के लिए, स्पेस से जुड़े कॉम्पोनेंट उपलब्ध कराने होंगे. साथ ही, उन्हें xrEnumerateSpatialCapabilityComponentTypesEXT में शामिल करना होगा:
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT
ऐंकर कॉम्पोनेंट
कॉम्पोनेंट डेटा
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT अपने डेटा के लिए XrPosef का इस्तेमाल करता है. इससे ऐंकर की पोज़िशन और ओरिएंटेशन की जानकारी मिलती है.
डेटा के बारे में क्वेरी करने के लिए कॉम्पोनेंट की सूची का स्ट्रक्चर
XrSpatialComponentAnchorListEXT स्ट्रक्चर को इस तरह से तय किया गया है:
typedef struct XrSpatialComponentAnchorListEXT {
XrStructureType type;
void* next;
uint32_t locationCount;
XrPosef* locations;
} XrSpatialComponentAnchorListEXT;
सदस्यों की जानकारी
type, इस स्ट्रक्चर का XrStructureType है.next,NULLहै या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है.locationCountएकuint32_tहै, जोlocationsकलेक्शन में मौजूद एलिमेंट की संख्या बताता है.locations, XrPosef का एक कलेक्शन है.
अगर XrSpatialComponentAnchorListEXT, XrSpatialComponentDataQueryResultEXT :: next चेन में है, लेकिन XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes में शामिल नहीं है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_VALIDATION_FAILURE ज़रूर दिखाना चाहिए.
अगर locationCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput से कम है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_SIZE_INSUFFICIENT को ज़रूर दिखाना चाहिए.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialComponentAnchorListEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_anchorएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXTहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
locationsकोlocationCountXrPosef स्ट्रक्चर के कलेक्शन का पॉइंटर होना ज़रूरी है -
locationCountपैरामीटर की वैल्यू,0से ज़्यादा होनी चाहिए
कॉन्फ़िगरेशन
अगर किसी क्षमता के लिए, XrSpatialCapabilityComponentTypesEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT को शामिल किया गया है, तो कोई ऐप्लिकेशन उसे चालू कर सकता है. इसके लिए, उसे XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents सूची में शामिल करना होगा. यह सूची, इस कॉम्पोनेंट के साथ काम करने वाली क्षमता के XrSpatialCapabilityConfigurationBaseHeaderEXT से बनाए गए स्ट्रक्चर की होती है.
इस कॉम्पोनेंट को XrSpatialCapabilityConfigurationBaseHeaderEXT :: next चेन में शामिल करने के लिए, किसी खास कॉन्फ़िगरेशन की ज़रूरत नहीं होती.
स्पेशल ऐंकर बनाना
xrCreateSpatialAnchorEXT फ़ंक्शन को इस तरह से तय किया गया है:
XrResult xrCreateSpatialAnchorEXT(
XrSpatialContextEXT spatialContext,
const XrSpatialAnchorCreateInfoEXT* createInfo,
XrSpatialEntityIdEXT* anchorEntityId,
XrSpatialEntityEXT* anchorEntity);
पैरामीटर की जानकारी
spatialContextएक XrSpatialContextEXT है, जिसे पहले xrCreateSpatialContextAsyncEXT का इस्तेमाल करके बनाया गया था.createInfo, XrSpatialAnchorCreateInfoEXT का पॉइंटर है .anchorEntityId,XrSpatialEntityIdEXTका पॉइंटर है. इसमें ऐंकर इकाई का आईडी दिखता है.anchorEntity, XrSpatialEntityEXT का पॉइंटर है. इसमें ऐंकर इकाई का हैंडल दिखता है.
ऐप्लिकेशन, xrCreateSpatialAnchorEXT का इस्तेमाल करके, स्पेशल ऐंकर बना सकता है .
किसी ऐंकर के लिए कॉम्पोनेंट का अपडेट किया गया डेटा पाने के लिए, स्नैपशॉट बनाते समय anchorEntity में भरी गई वैल्यू को XrSpatialUpdateSnapshotCreateInfoEXT :: entities में पास करें. xrQuerySpatialComponentDataEXT का इस्तेमाल करते समय, ऐप्लिकेशन anchorEntityId का इस्तेमाल करके, XrSpatialComponentDataQueryResultEXT :: entityIds कलेक्शन में इस ऐंकर की खास तौर पर पहचान कर सकता है.
अगर XR_SPATIAL_CAPABILITY_ANCHOR_EXT को spatialContext के लिए कॉन्फ़िगर नहीं किया गया है, तो रनटाइम को xrCreateSpatialAnchorEXT से XR_ERROR_VALIDATION_FAILURE को ज़रूर रिटर्न करना चाहिए. XR_SPATIAL_CAPABILITY_ANCHOR_EXT सुविधा के लिए, XrSpatialContextEXT को कॉन्फ़िगर करने का तरीका जानने के लिए, कॉन्फ़िगरेशन देखें.
anchorEntity से दिखाया गया ऐंकर, सिर्फ़ spatialContext के लाइफ़टाइम के लिए मान्य है. इसके अलावा, यह तब तक मान्य है, जब तक ऐप्लिकेशन उस पर xrDestroySpatialEntityEXT को कॉल नहीं करता. इनमें से जो भी पहले हो. अन्य एक्सटेंशन, इस नए ऐंकर को कई XrSession में बनाए रखने या प्रोसेस की सीमाओं के पार अन्य ऐप्लिकेशन के साथ शेयर करने के लिए फ़ंक्शन ऑफ़र कर सकते हैं.
नया ऐंकर बनाए जाने के बाद, जब तक उसे मिटाया नहीं जाता, तब तक वह अपने पैरंट स्पेस के कॉन्टेक्स्ट में खोजे जाने लायक होना चाहिए. इसका मतलब है कि अगर ऐंकर, XrSpatialDiscoverySnapshotCreateInfoEXT में सेट की गई खोज की शर्तों से मैच करता है, तो रनटाइम को spatialContext के लिए xrCreateSpatialDiscoverySnapshotAsyncEXT का इस्तेमाल करके बनाए गए स्नैपशॉट में anchorEntityId को शामिल करना चाहिए. नया ऐंकर, XR_SPATIAL_CAPABILITY_ANCHOR_EXT के साथ कॉन्फ़िगर किए गए अन्य स्पेशल कॉन्टेक्स्ट में भी खोजा जा सकता है. हालांकि, इसके लिए अलग XrSpatialEntityIdEXT का इस्तेमाल करना होगा, क्योंकि कोई खास XrSpatialEntityIdEXT अपने XrSpatialContextEXT के लिए यूनीक होता है.
सही इस्तेमाल (इंप्लिसिट)
- xrCreateSpatialAnchorEXT को कॉल करने से पहले,
XR_EXT_spatial_anchorएक्सटेंशन को चालू करना ज़रूरी है -
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 है, जिसमेंposeलागू किया गया है.timeवहXrTimeहै जहांbaseSpaceमौजूद है. साथ ही,poseलागू है.pose, ऐंकर इकाई की जगह है.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialAnchorCreateInfoEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_anchorएक्सटेंशन चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXTहोनी चाहिए -
nextकोNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए. यह भी देखें: XrSpatialAnchorParentANDROID -
baseSpaceXrSpace हैंडल मान्य होना चाहिए
क्वेरी ऐंकर पोज़
ऐंकर बनाने के बाद, रनटाइम को समय के साथ अन्य स्पेस के हिसाब से अपनी पोज़िशन और ओरिएंटेशन में बदलाव करना चाहिए, ताकि असल दुनिया में मौजूद अपनी ओरिजनल जगह के साथ बेहतर तरीके से अलाइनमेंट बनाए रखा जा सके. भले ही, इससे ऐंकर का ओरिजनल XrSpatialAnchorCreateInfoEXT :: baseSpace के साथ संबंध बदल जाए, जिसका इस्तेमाल इसे शुरू करने के लिए किया गया था.
ऐप्लिकेशन, xrCreateSpatialUpdateSnapshotEXT का इस्तेमाल, ऐंकर के XrSpatialEntityEXT के साथ कर सकता है. इससे नया XrSpatialSnapshotEXT बनाया जा सकता है. इसके बाद, xrQuerySpatialComponentDataEXT का इस्तेमाल करके, उस स्नैपशॉट से XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT कॉम्पोनेंट के बारे में क्वेरी की जा सकती है. ऐप्लिकेशन, XrSpatialComponentDataQueryResultEXT :: next में XrSpatialComponentAnchorListEXT जोड़ सकता है, ताकि ऐंकर के लिए जगह की जानकारी का डेटा वापस पाया जा सके.
रनटाइम, नए बनाए गए ऐंकर की ट्रैकिंग स्थिति को XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT पर सेट कर सकता है . ऐप्लिकेशन को XrSpatialComponentDataQueryResultEXT :: entityStates में दी गई ऐंकर इकाई की स्थिति और इकाई के ऐंकर कॉम्पोनेंट का डेटा सिर्फ़ तब पढ़ना चाहिए, जब ट्रैकिंग की स्थिति XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT हो.
ऐंकर इस्तेमाल करने के लिए दिशा-निर्देश
- हर ऐंकर का पोज़, किसी दूसरे ऐंकर या स्पेस से अलग होता है. अलग-अलग ऐंकर किए गए वर्चुअल ऑब्जेक्ट, एक-दूसरे के हिसाब से शिफ़्ट या रोटेट हो सकते हैं. इससे स्पेसियल हैरारकी टूट जाती है. ऐसा तब होता है, जब इन वर्चुअल ऑब्जेक्ट को एक-दूसरे के हिसाब से अपनी जगह पर बने रहना होता है. ऐसे मामलों में, ऐप्लिकेशन को उन सभी वर्चुअल ऑब्जेक्ट के लिए एक ही ऐंकर का फिर से इस्तेमाल करना चाहिए जो एक-दूसरे के हिसाब से नहीं हिलते.
- ऐप्लिकेशन को उन ऐंकर के लिए XrSpatialEntityEXT हैंडल को खत्म कर देना चाहिए जिनका अब इस्तेमाल नहीं किया जा रहा है. इससे उन संसाधनों को खाली किया जा सकेगा जिनका इस्तेमाल रनटाइम, उन ऐंकर को ट्रैक करने के लिए कर सकता है.
कोड का उदाहरण
ऐंकर कैपेबिलिटी कॉन्फ़िगर करना
यहां दिए गए उदाहरण में, स्पैशल कॉन्टेक्स्ट बनाते समय ऐंकर की सुविधा को कॉन्फ़िगर करने का तरीका बताया गया है.
// 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));
स्पेशल ऐंकर बनाना और उसकी जगह की जानकारी पाना
यहां दिए गए उदाहरण में, स्पेशल ऐंकर बनाने और हर फ़्रेम में उसका पोज़ पाने का तरीका बताया गया है.
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_VERSIONXrSpatialCapabilityEXT को एक्सटेंड करना :
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 का इस्तेमाल करके, उस आईडी के लिए इकाई हैंडल बना सकते थे. हालांकि, ऐंकर के सामान्य इस्तेमाल को देखते हुए, जहां ऐप्लिकेशन हर फ़्रेम में ऐंकर पोज़ के बारे में क्वेरी करते हैं, वहां इसे "अपडेट स्नैपशॉट" में इस्तेमाल किया जा सकता है. इसके लिए, इनपुट के तौर पर इकाई हैंडल की ज़रूरत होती है. इस सामान्य इस्तेमाल के उदाहरण को ध्यान में रखते हुए, xrCreateSpatialAnchorEXT, ऐप्लिकेशन की ओर से xrCreateSpatialEntityFromIdEXT को लागू करता है. साथ ही, xrCreateSpatialUpdateSnapshotEXT के साथ इस्तेमाल करने के लिए, ऐप्लिकेशन को इकाई का हैंडल उपलब्ध कराता है.
वर्शन हिस्ट्री
वर्शन 1, 10-07-2024 (निहाव जैन, Google)
- एक्सटेंशन का शुरुआती ब्यौरा