XR_ANDROID_spatial_component_subsumed_by

नाम स्ट्रिंग

XR_ANDROID_spatial_component_subsumed_by

एक्सटेंशन का टाइप

इंस्टेंस एक्सटेंशन

रजिस्टर किए गए एक्सटेंशन का नंबर

792

संशोधन

1

पुष्टि की स्थिति

पुष्टि नहीं की गई

एक्सटेंशन और वर्शन की ज़रूरी शर्तें

XR_EXT_spatial_entity
और
XR_EXT_spatial_plane_tracking

पिछली बार बदलाव किए जाने की तारीख

2025-08-19

आईपी की स्थिति

आईपी से जुड़े कोई दावे नहीं मिले हैं.

योगदान देने वाले

ब्रायन चेन, Google
काइल चेन, Google
लेवाना चेन, Google
निहाव जैन, Google
स्पेंसर क्विन, Google

खास जानकारी

यह एक्सटेंशन, XR_EXT_spatial_entity पर आधारित है. साथ ही, यह XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT के लिए एक नया कॉम्पोनेंट उपलब्ध कराता है, ताकि XrSpatialEntityIdEXT को दिखाया जा सके. यह कॉम्पोनेंट, मौजूदा इकाई को शामिल करता है.

जब रनटाइम को एनवायरमेंट की इतनी जानकारी मिल जाती है कि वह ट्रैक किए गए दो प्लेन को एक ही मान लेता है, तो XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट को दूसरे प्लेन से जोड़ दिया जाता है. इस कॉम्पोनेंट में, पहले प्लेन का आईडी होता है. इसके बाद, ऐप्लिकेशन को सिर्फ़ उस इकाई को प्रोसेस करना होता है जिसमें XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट नहीं होता.

इस एक्सटेंशन में एक नया फ़िल्टर भी शामिल है. ऐप्लिकेशन, इस फ़िल्टर को XrSpatialDiscoverySnapshotCreateInfoEXT से जोड़कर, उन सभी इकाइयों को फ़िल्टर कर सकता है जिनमें XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट होता है.

अनुमतियां

Android ऐप्लिकेशन के मेनिफ़ेस्ट में, android.permission.SCENE_UNDERSTANDING_COARSE अनुमति शामिल होनी चाहिए. ऐसा इसलिए, क्योंकि यह एक्सटेंशन, एनवायरमेंट में मौजूद प्लेन को ट्रैक करता है. android.permission.SCENE_UNDERSTANDING_COARSE अनुमति को खतरनाक अनुमति माना जाता है.

(सुरक्षा का लेवल: खतरनाक)

रंटाइम की सुविधा

अगर रनटाइम, एक प्लेन को दूसरे में शामिल कर सकता है, तो उसे xrEnumerateSpatialCapabilityComponentTypesEXT में, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT सुविधा के लिए, XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID को काम करने वाले कॉम्पोनेंट के तौर पर शामिल करके, इसकी जानकारी देनी होगी .

XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID से जुड़ी इकाई का कॉम्पोनेंट डेटा, उस इकाई के कॉम्पोनेंट डेटा जैसा होना चाहिए जिसमें वह शामिल है.

कॉम्पोनेंट में शामिल होना

कॉम्पोनेंट डेटा

XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID अपने डेटा के लिए, XrSpatialEntityIdEXT स्ट्रक्चर का इस्तेमाल करता है. यह स्ट्रक्चर, उस इकाई का आईडी दिखाता है जिसमें दूसरी इकाई शामिल है.

डेटा की क्वेरी करने के लिए कॉम्पोनेंट की सूची वाला स्ट्रक्चर

XrSpatialComponentSubsumedByListANDROID स्ट्रक्चर को इस तरह से तय किया गया है:

typedef struct XrSpatialComponentSubsumedByListANDROID {
    XrStructureType          type;
    void*                    next;
    uint32_t                 subsumedUniqueIdCount;
    XrSpatialEntityIdEXT*    subsumedUniqueIds;
} XrSpatialComponentSubsumedByListANDROID;

सदस्यों की जानकारी

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में मौजूद अगले स्ट्रक्चर का पॉइंटर है.
  • subsumedUniqueIdCount, uint32_t है. यह subsumedUniqueIds कलेक्शन में मौजूद एलिमेंट की संख्या के बारे में बताता है.
  • subsumedUniqueIds, XrSpatialEntityIdEXT का कलेक्शन है .

ऐप्लिकेशन, XrSpatialSnapshotEXT में मौजूद स्पेस से जुड़ी इकाइयों के XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट की क्वेरी कर सकता है. इसके लिए, उसे XrSpatialComponentDataQueryResultEXT की अगली चेन में XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID जोड़ना होगा.

अगर XrSpatialComponentDataQueryResultEXT :: next की अगली चेन में XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID शामिल है, लेकिन XrSpatialComponentDataQueryConditionEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID शामिल नहीं है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_VALIDATION_FAILURE दिखाना होगा .

अगर subsumedUniqueIdCount , XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput से कम है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_SIZE_INSUFFICIENT दिखाना होगा .

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

  • XR_ANDROID_spatial_component_subsumed_by एक्सटेंशन चालूहोना चाहिए XrSpatialComponentSubsumedByListANDROID का इस्तेमाल करने से पहले
  • , type XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID होना चाहिए
  • next होना चाहिए NULL या स्ट्रक्चर चेन में मौजूद अगले स्ट्रक्चर का मान्य पॉइंटर
  • , subsumedUniqueIds subsumedUniqueIdCount XrSpatialEntityIdEXT वैल्यू के कलेक्शन का पॉइंटर होना चाहिए
  • subsumedUniqueIdCount पैरामीटर, 0 से ज़्यादा होना चाहिए

कॉन्फ़िगरेशन

अगर XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID केपबिलिटी के लिए, XrSpatialCapabilityComponentTypesEXT :: componentTypes में XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT को शामिल किया गया है, तो ऐप्लिकेशन इसे चालू कर सकता है. इसके लिए, उसे XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents की सूची में, इस कॉम्पोनेंट के साथ काम करने वाली केपबिलिटी के XrSpatialCapabilityConfigurationBaseHeaderEXT से मिले स्ट्रक्चर में, enum को शामिल करना होगा.

शामिल की गई इकाइयों को फ़िल्टर करना

XrSpatialDiscoveryUniqueEntitiesFilterANDROID स्ट्रक्चर को इस तरह से तय किया गया है:

typedef struct XrSpatialDiscoveryUniqueEntitiesFilterANDROID {
    XrStructureType    type;
    const void*        next;
} XrSpatialDiscoveryUniqueEntitiesFilterANDROID;

सदस्यों की जानकारी

  • type, इस स्ट्रक्चर का XrStructureType है.
  • next, NULL है या स्ट्रक्चर चेन में मौजूद अगले स्ट्रक्चर का पॉइंटर है.

ऐप्लिकेशन, XrSpatialDiscoverySnapshotCreateInfoEXT की next चेन में XrSpatialDiscoveryUniqueEntitiesFilterANDROID को शामिल करके, ऐसी इकाइयों का स्नैपशॉट पा सकता है जो किसी दूसरी इकाई में शामिल नहीं हैं.

अगर ऐप्लिकेशन, XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट को शामिल करते समय, XrSpatialDiscoverySnapshotCreateInfoEXT में XrSpatialDiscoveryUniqueEntitiesFilterANDROID को जोड़ते हैं, तो रनटाइम को XR_ERROR_VALIDATION_FAILURE दिखाना होगा .

अगर ऐप्लिकेशन, XrSpatialDiscoverySnapshotCreateInfoEXT में XrSpatialDiscoveryUniqueEntitiesFilterANDROID को जोड़ता है, लेकिन XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes में कोई कॉम्पोनेंट शामिल नहीं करता है, तो रनटाइम को स्नैपशॉट में, स्पेस से जुड़ी उन सभी इकाइयों को शामिल करना होगा जिनमें कॉम्पोनेंट का सेट मौजूद है. यह सेट, spatialContext के लिए कॉन्फ़िगर की गई सुविधाओं के लिए, XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents में शामिल कॉम्पोनेंट का सेट होता है. हालांकि, इसमें उन इकाइयों को शामिल नहीं किया जाता जिनमें XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट होता है.

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

  • XrSpatialDiscoveryUniqueEntitiesFilterANDROID का इस्तेमाल करने से पहले, XR_ANDROID_spatial_component_subsumed_by एक्सटेंशन चालू **होना चाहिए**
  • , type **होना चाहिए** XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID
  • next होना चाहिए NULL या स्ट्रक्चर चेन में मौजूद अगले स्ट्रक्चर का मान्य पॉइंटर

कोड का उदाहरण

प्लेन ट्रैकिंग की सुविधा कॉन्फ़िगर करना

यहां दिए गए उदाहरण कोड में, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT सुविधा के साथ स्पेस से जुड़ा कॉन्टेक्स्ट बनाने का तरीका बताया गया है. यह सुविधा, XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID के साथ काम करती है.

// Check runtime supported capabilities
uint32_t capabilityCount = 0;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));

if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
  return;
}

// Enumerate supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT planeComponents{
  .type = XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT,
};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
std::vector<XrSpatialComponentTypeEXT> planeCapabilityComponents(planeComponents.componentTypeCountOutput);
planeComponents.componentTypeCapacityInput = planeCapabilityComponents.size();
planeComponents.componentTypes = planeCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));

const auto supportsComponent = [&planeCapabilityComponents](XrSpatialComponentTypeEXT component) {
  return std::find(planeCapabilityComponents.begin(), planeCapabilityComponents.end(), component) != planeCapabilityComponents.end();
};


std::vector<XrSpatialComponentTypeEXT> planeTrackingComponents {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};

if (supportsComponent(XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID)) {
  planeTrackingComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID);
}

// Create capability config for plane tracking
XrSpatialCapabilityConfigurationPlaneTrackingEXT planeTrackingConfig {
  .type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT,
  .next = nullptr,
  .capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT,
  .enabledComponentCount = (uint32_t)planeTrackingComponents.size(),
  .enabledComponents = planeTrackingComponents.data(),
};

// Create spatial context
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&planeTrackingConfig));

XrSpatialContextCreateInfoEXT contextCreateInfo {
  .type = XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT,
  .next = nullptr,
  .capabilityConfigCount = (uint32_t)capabilityConfigs.size(),
  .capabilityConfigs = capabilityConfigs.data(),
};

CHK_XR(xrCreateSpatialContextAsyncEXT(session, &contextCreateInfo, &future))

// Completes creating spatial context
XrCreateSpatialContextCompletionEXT contextCompletion{
XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};

CHK_XR(xrCreateSpatialContextCompleteEXT(session, future, &contextCompletion))

कॉम्पोनेंट डेटा की क्वेरी करना

यहां दिए गए उदाहरण कोड में, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT के साथ कॉन्फ़िगर किए गए कॉन्टेक्स्ट से, XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट डेटा की क्वेरी करने का तरीका बताया गया है .

// previously created
XrSpatialSnapshotEXT snapshot;

// Query subsumed_by components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
};

XrSpatialComponentDataQueryConditionEXT queryCond {
  .type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT,
  .componentTypeCount = 1,
  .componentTypes     = enabledComponents.data(),
};

XrSpatialComponentDataQueryResultEXT queryResult {
  .type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT,
};

CHK_XR(xrQuerySpatialComponentDataEXT(
           snapshot, &queryCond, &queryResult));

// Query again with allocated memory
std::vector<XrSpatialEntityIdEXT> subsumedUniqueIds;
subsumedUniqueIds.resize(queryResult.entityIdCountOutput);
XrSpatialComponentSubsumedByListANDROID subsumedByList {
  .type = XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID,
  .subsumedUniqueIdCount = static_cast<uint32_t>(subsumedUniqueIds.size()),
  .subsumedUniqueIds = subsumedUniqueIds.data(),
};

queryResult.next = &subsumedByList;
CHK_XR(xrQuerySpatialComponentDataEXT(
           snapshot, &queryCond, &queryResult));

for (uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
  // Plane was subsumed, remove it from processing logic
  // removeEntityFromProcessingLogic(queryResult.entityIds[i], /*replaceWith=*/ subsumedByList.subsumedUniqueIds[i]);
}

// Cleanup
xrDestroySpatialSnapshotEXT(snapshot);

शामिल की गई इकाइयों को फ़िल्टर करना

यहां दिए गए उदाहरण कोड में, फ़िल्टर का इस्तेमाल करके, डिस्कवरी स्नैपशॉट से XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID कॉम्पोनेंट वाली इकाइयों को फ़िल्टर करने का तरीका बताया गया है. साथ ही, इसमें शामिल की गई इकाइयों के आईडी की क्वेरी करने का तरीका भी बताया गया है.

// Init filter
XrSpatialDiscoveryUniqueEntitiesFilterANDROID filter {
  .type = XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID,
};

// Chain filter to the snapshot create info
// WARNING: Chaining the filter while include subsumed_by component in the
// componentTypes is invalid
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
  .type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
  .next = &filter
};

XrFutureEXT future {XR_NULL_FUTURE_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &discoverySnapshotCreateInfo, &future))

waitUntilReady(future);

// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
  createSnapshotCompletionInfo {
    .type   = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
    .baseSpace = space,
    .time      = updateTime,
    .future    = future,
  };

XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
  .type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT,
};

CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
           spatialContext, &createSnapshotCompletionInfo,
           &completion));

if(completion.futureResult != XR_SUCCESS) return;

// Subsumed entities has already been filtered out in this snapshot,
// now query the various components of the entities.

// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);

नए स्ट्रक्चर

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

  • XR_ANDROID_SPATIAL_COMPONENT_SUBSUMED_BY_EXTENSION_NAME
  • XR_ANDROID_spatial_component_subsumed_by_SPEC_VERSION
  • XrSpatialComponentTypeEXT को बढ़ाना :

    • XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
  • XrStructureType को बढ़ाना :

    • XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID
    • XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID

समस्याएं

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

  • पहला संशोधन, 19 नवंबर, 2025 (ब्रायन चेन)

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