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 कलेक्शन में मौजूद एलिमेंट की संख्या बताता है.
  • enabledComponents XrSpatialComponentTypeEXT के कलेक्शन का पॉइंटर है.

ऐप्लिकेशन, 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 होनी चाहिए
  • 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 चेन में है, लेकिन 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 होनी चाहिए
  • next NULL या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए
  • locations को locationCount XrPosef स्ट्रक्चर के कलेक्शन का पॉइंटर होना ज़रूरी है
  • 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_SUCCESS
  • XR_SESSION_LOSS_PENDING

Failure

  • 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 के साथ संबंध बदल जाए, जिसका इस्तेमाल इसे शुरू करने के लिए किया गया था.

ऐप्लिकेशन, 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));

नए निर्देश

नए स्ट्रक्चर

नए Enum कॉन्सटेंट

  • 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)

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