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 है.
  • next NULL है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है.
  • 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 की मान्य वैल्यू होनी चाहिए
  • 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 चेन में है, लेकिन 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 या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए
  • , locationCount XrPosef स्ट्रक्चर के कलेक्शन का पॉइंटर 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 वैल्यू का पॉइंटर
  • 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 है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर है.
  • baseSpace वह XrSpace है जिसमें pose लागू किया जाता है.
  • time वह XrTime है जिस पर baseSpace मौजूद है (और pose लागू किया गया है).
  • pose , ऐंकर इकाई की जगह है.

मान्य इस्तेमाल (सीधे तौर पर न दिखाना)

ऐंकर पोज़ के लिए क्वेरी करना

ऐंकर बनने के बाद, रनटाइम को समय-समय पर उसकी पोज़िशन और ओरिएंटेशन को अन्य स्पेस के हिसाब से अडजस्ट करना चाहिए. ऐसा इसलिए किया जाना चाहिए, ताकि असल दुनिया में उसकी ऑरिजिनल जगह के साथ बेहतर तरीके से अलाइनमेंट बनाए रखा जा सके. भले ही, इससे उसे शुरू करने के लिए इस्तेमाल किए गए ऑरिजिनल 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));

नए निर्देश

नए स्ट्रक्चर

नए एनम कॉन्स्टैंट

  • 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 का इस्तेमाल करके, उस आईडी के लिए इकाई हैंडल बना सकते हैं. हालांकि, ऐंकर के सामान्य इस्तेमाल को देखते हुए, ऐप्लिकेशन हर फ़्रेम में ऐंकर पोज़ के लिए क्वेरी करते हैं. इसलिए, इसे "अपडेट स्नैपशॉट" में इस्तेमाल किया जा सकता है. इसके लिए, इनपुट के तौर पर इकाई हैंडल की ज़रूरत होती है. इस सामान्य इस्तेमाल को देखते हुए, xrCreateSpatialAnchorEXT, ऐप्लिकेशन की ओर से xrCreateSpatialEntityFromIdEXT को कॉल करता है. साथ ही, xrCreateSpatialUpdateSnapshotEXT के साथ इस्तेमाल करने के लिए, ऐप्लिकेशन को इकाई हैंडल देता है.

वर्शन हिस्ट्री

  • संशोधन 1, 10-07-2024 (निहाव जैन, Google)

    • एक्सटेंशन की शुरुआती जानकारी