XR_EXT_spatial_anchor
नाम वाली स्ट्रिंग
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 के लाइफ़टाइम के दौरान , रनटाइम को उपयोगकर्ता के असल माहौल के बारे में जानकारी मिलती रहती है. इस वजह से, वर्चुअल ऑब्जेक्ट शायद अपनी जगह से हट जाएं. इससे ऐप्लिकेशन की असलियत और उपयोगकर्ता के अनुभव की क्वालिटी पर असर पड़ता है. वर्चुअल ऑब्जेक्ट को जहां रखा गया है उसके आस-पास ऐंकर बनाकर और फिर उस वर्चुअल ऑब्जेक्ट को हमेशा उसके ऐंकर के हिसाब से रेंडर करके, कोई ऐप्लिकेशन यह पक्का कर सकता है कि हर वर्चुअल ऑब्जेक्ट, असल माहौल में एक ही पोज़िशन और ओरिएंटेशन में दिखे. साथ ही, कुछ रेफ़रंस स्पेस के उलट, ऐंकर पर सिस्टम-लेवल के रीसेंटरिंग का कोई असर नहीं पड़ता.
रंटाइम की सुविधा
अगर रनटाइम, स्पेस में मौजूद ऐंकर की सुविधा देता है, तो उसे ज़रूर यह जानकारी 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 है.nextNULLहै या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है.capabilityएक XrSpatialCapabilityEXT है .enabledComponentCountएकuint32_tहै, जोenabledComponentsकलेक्शन में मौजूद एलिमेंट की संख्या के बारे में बताती है.enabledComponents, XrSpatialComponentTypeEXT के कलेक्शन का पॉइंटर है .
ऐप्लिकेशन चालू कर सकते हैं, XR_SPATIAL_CAPABILITY_ANCHOR_EXT स्पेस में मौजूद केपबिलिटी को, XrSpatialCapabilityConfigurationAnchorEXT स्ट्रक्चर का पॉइंटर शामिल करके, XrSpatialContextCreateInfoEXT :: capabilityConfigs में .
अगर capability , XR_SPATIAL_CAPABILITY_ANCHOR_EXT नहीं है, तो रनटाइम को xrEnumerateSpatialCapabilitiesEXT से XR_ERROR_VALIDATION_FAILURE ज़रूर लौटाना चाहिए .
मान्य इस्तेमाल (सीधे तौर पर न दिखाना)
- XrSpatialCapabilityConfigurationAnchorEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_anchorएक्सटेंशन को चालू करना ज़रूरी है -
type**होना चाहिए**XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT -
next,NULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
capability, XrSpatialCapabilityEXT की मान्य वैल्यू होनी चाहिए -
enabledComponentsenabledComponentCountमान्य 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 है.nextNULLहै या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है.locationCountएकuint32_tहै, जोlocationsकलेक्शन में मौजूद एलिमेंट की संख्या के बारे में बताती है.locations, XrPosef का कलेक्शन है .
अगर XrSpatialComponentAnchorListEXT, XrSpatialComponentDataQueryResultEXT :: next चेन में है, लेकिन XrSpatialComponentDataQueryConditionEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT शामिल नहीं है, तो रनटाइम को 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 -
next,NULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए - ,
locationCountXrPosef स्ट्रक्चर के कलेक्शन का पॉइंटरlocationsहोना चाहिए -
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 का इस्तेमाल करते समय, ऐप्लिकेशन इस ऐंकर की खास पहचान करने के लिए, XrSpatialComponentDataQueryResultEXT :: entityIds कलेक्शन में anchorEntityId का इस्तेमाल कर सकता है.
अगर spatialContext के लिए XR_SPATIAL_CAPABILITY_ANCHOR_EXT कॉन्फ़िगर नहीं किया गया था, तो रनटाइम को xrCreateSpatialAnchorEXT से XR_ERROR_VALIDATION_FAILURE ज़रूर लौटाना चाहिए . सुविधा के लिए, XrSpatialContextEXT को कॉन्फ़िगर करने का तरीका जानने के लिए, XR_SPATIAL_CAPABILITY_ANCHOR_EXT देखें.
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वैल्यू का पॉइंटर -
anchorEntityXrSpatialEntityEXT हैंडल का पॉइंटर होना चाहिए
लौटाए गए कोड
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 है.nextNULLहै या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है.baseSpaceवह XrSpace है जिसमेंposeलागू किया जाता है.timeवहXrTimeहै जिस परbaseSpaceमौजूद है (औरposeलागू किया गया है).pose, ऐंकर इकाई की जगह है.
मान्य इस्तेमाल (सीधे तौर पर न दिखाना)
- XrSpatialAnchorCreateInfoEXT का इस्तेमाल करने से पहले,
XR_EXT_spatial_anchorएक्सटेंशन को चालू करना ज़रूरी है -
type**होना चाहिए**XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT -
next,NULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर **होना चाहिए** . यह भी देखें: XrSpatialAnchorParentANDROID -
baseSpace, XrSpace का मान्य हैंडल **होना चाहिए**
ऐंकर पोज़ के लिए क्वेरी करना
ऐंकर बनने के बाद, रनटाइम को समय-समय पर उसकी पोज़िशन और ओरिएंटेशन को अन्य स्पेस के हिसाब से अडजस्ट करना चाहिए. ऐसा इसलिए किया जाना चाहिए, ताकि असल दुनिया में उसकी ऑरिजिनल जगह के साथ बेहतर तरीके से अलाइनमेंट बनाए रखा जा सके. भले ही, इससे उसे शुरू करने के लिए इस्तेमाल किए गए ऑरिजिनल XrSpatialAnchorCreateInfoEXT :: baseSpace के साथ ऐंकर का संबंध बदल जाए.
ऐप्लिकेशन, नया XrSpatialSnapshotEXT बनाने के लिए, ऐंकर के XrSpatialEntityEXT के साथ xrCreateSpatialUpdateSnapshotEXT का इस्तेमाल कर सकता है. इसके बाद, xrQuerySpatialComponentDataEXT का इस्तेमाल करके, उस स्नैपशॉट से XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT कॉम्पोनेंट के लिए क्वेरी की जा सकती है. ऐप्लिकेशन, ऐंकर के लिए जगह की जानकारी का नया डेटा पाने के लिए, XrSpatialComponentAnchorListEXT को XrSpatialComponentDataQueryResultEXT :: next में जोड़ सकता है.
रंटाइम, नए ऐंकर की ट्रैकिंग स्थिति को XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT पर सेट कर सकता है . अगर ट्रैकिंग की स्थिति XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT है, तो ऐप्लिकेशन को सिर्फ़ XrSpatialComponentDataQueryResultEXT :: entityStates में दिए गए ऐंकर इकाई की स्थिति और इकाई के ऐंकर कॉम्पोनेंट का डेटा पढ़ना चाहिए .
ऐंकर इस्तेमाल करने के दिशा-निर्देश
- हर ऐंकर का पोज़, किसी अन्य ऐंकर या स्पेस से अलग तरीके से अडजस्ट होता है. अलग-अलग ऐंकर वाले वर्चुअल ऑब्जेक्ट, एक-दूसरे के हिसाब से शिफ़्ट या रोटेट हो सकते हैं. इससे स्पेस में मौजूद क्रम टूट जाता है. ऐसा तब होता है, जब इन वर्चुअल ऑब्जेक्ट को एक-दूसरे के हिसाब से अपनी जगह पर बने रहना चाहिए. ऐसे मामलों में, ऐप्लिकेशन को उन सभी वर्चुअल ऑब्जेक्ट के लिए एक ही ऐंकर का दोबारा इस्तेमाल करना चाहिए जो एक-दूसरे के हिसाब से नहीं हिलते.
- ऐप्लिकेशन को उन ऐंकर के लिए 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 को बढ़ाना :
नए एनम कॉन्स्टैंट
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)
- एक्सटेंशन की शुरुआती जानकारी