XR_ANDROID_spatial_discovery_raycast

Name String

XR_ANDROID_spatial_discovery_raycast

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

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

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

787

बदलाव

1

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

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

एक्सटेंशन और वर्शन की डिपेंडेंसी

XR_EXT_spatial_entity

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

2025-08-12

आईपी स्टेटस

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

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

ब्रायन चेन, Google
लेवाना चेन, Google
काइल चेन, Google
निहाव जैन, Google
स्पेंसर क्विन, Google
नैटली फ़्लूरी, Meta
युइची तागुची, Meta
जिम्मी अलमपरामबिल, ByteDance
ज़िपेंग लियू, ByteDance

खास जानकारी

यह एक्सटेंशन, XR_EXT_spatial_entity पर आधारित है. साथ ही, यह XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT जैसी मौजूदा स्पेशल सुविधाओं के लिए रेकास्ट की सुविधा देता है, ताकि स्पेशल एंटिटी का पता लगाया जा सके.

इस एक्सटेंशन में, डेप्थ बफ़र के हिसाब से रेकास्टिंग के लिए नई स्पेशल क्षमता भी जोड़ी गई है.

अनुमतियां

Android ऐप्लिकेशन की सुविधाओं के हिसाब से ज़रूरी अनुमतियां. अगर XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID का इस्तेमाल किया जाता है, तो ऐप्लिकेशन के पास android.permission.SCENE_UNDERSTANDING_FINE अनुमति होनी चाहिए. अगर XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT का इस्तेमाल किया जाता है, तो ऐप्लिकेशन के पास android.permission.SCENE_UNDERSTANDING_COARSE अनुमति ज़रूर होनी चाहिए. android.permission.SCENE_UNDERSTANDING_FINE का मतलब यह भी है कि android.permission.SCENE_UNDERSTANDING_COARSE अनुमति दी गई है. अगर ऐप्लिकेशन इन दोनों सुविधाओं का इस्तेमाल करता है, तो उसे दोनों अनुमतियों के लिए अलग-अलग अनुरोध करने की ज़रूरत नहीं है.

android.permission.SCENE_UNDERSTANDING_COARSE और android.permission.SCENE_UNDERSTANDING_FINE, दोनों को खतरनाक अनुमतियां माना जाता है.

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

रनटाइम सपोर्ट

अगर रनटाइम, रेकास्टिंग के ज़रिए स्पेस से जुड़ी इकाइयों का पता लगाने की सुविधा देता है, तो उसे ज़रूर यह बताना चाहिए. इसके लिए, उसे xrEnumerateSpatialCapabilityComponentTypesEXT में XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID को गिनना होगा. ऐसा उन सुविधाओं के लिए करना होगा जो रेकास्ट के ज़रिए पता लगाने की सुविधा देती हैं.

अगर रनटाइम, डेप्थ बफ़र के हिसाब से रेकास्टिंग की सुविधा देता है, तो उसे xrEnumerateSpatialCapabilitiesEXT में XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID को ज़रूर शामिल करना चाहिए .

रेकास्टिंग की मदद से, स्पेशल एंटिटी ढूंढना

XrSpatialRaycastInfoANDROID स्ट्रक्चर को इस तरह परिभाषित किया गया है:

typedef struct XrSpatialRaycastInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             time;
    XrVector3f         origin;
    XrVector3f         direction;
    float              maxDistance;
} XrSpatialRaycastInfoANDROID;

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

  • type इस स्ट्रक्चर का XrStructureType है.
  • next, NULL होता है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर होता है.
  • space वह XrSpace है जिसमें XrSpatialRaycastResultDataANDROID की पोज़िशन मौजूद होगी.
  • time एक XrTime है, जिसमें XrSpatialRaycastResultDataANDROID का पोज़ तय किया जाता है.
  • origin एक XrVector3f है, जो रे के ऑरिजिन के बारे में बताता है.
  • direction एक XrVector3f है, जो किरण की दिशा के बारे में बताता है.
  • maxDistance, मीटर में वह दूरी है जिसे ऐप्लिकेशन, ज़रूरी नहीं है कि तय करे. इससे, origin से तय की गई दूरी के अंदर मौजूद इकाइयों का पता लगाने की सुविधा को सीमित किया जा सकता है. ऐसा direction के साथ किया जाता है.

कोई ऐप्लिकेशन, XrSpatialDiscoverySnapshotCreateInfoEXT :: next चेन में XrSpatialRaycastInfoANDROID को शामिल कर सकता है. इससे, ऐसी स्पेशल एंटिटी का पता लगाया जा सकता है जो इस स्ट्रक्चर में तय की गई रे से इंटरसेक्ट करती हैं.

अगर कोई ऐप्लिकेशन, XrSpatialRaycastInfoANDROID का इस्तेमाल ऐसे XrSpatialContextEXT के साथ करता है जिसे किसी भी सुविधा के लिए XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID को चालू किए बिना कॉन्फ़िगर किया गया था, तो रनटाइम को xrCreateSpatialDiscoverySnapshotAsyncEXT या xrCreateSpatialRaycastSnapshotANDROID से XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT ज़रूर दिखाना चाहिए .

रनटाइम में, कॉम्पोनेंट का डेटा और XrSpatialSnapshotEXT में मौजूद सिर्फ़ उन स्पैटियल इकाइयों के आईडी शामिल होने चाहिए जो XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID कॉम्पोनेंट के साथ काम करने वाली सुविधाओं से आते हैं.

अगर कोई ऐप्लिकेशन maxDistance को पॉज़िटिव वैल्यू पर सेट करता है, तो रनटाइम को स्नैपशॉट में ऐसी कोई भी हिट स्पैटियल इकाई शामिल नहीं करनी चाहिए जो direction के साथ-साथ panme:origin से maxDistance से ज़्यादा दूर हो. अगर maxDistance को 0 या नेगेटिव वैल्यू पर सेट किया जाता है, तो रनटाइम को यह मानना ज़रूरी है कि रे की लंबाई तय नहीं है.

मान्य इस्तेमाल (इंप्लिसिट)

Raycast Result Component

XrSpatialRaycastResultDataANDROID स्ट्रक्चर को इस तरह परिभाषित किया गया है:

typedef struct XrSpatialRaycastResultDataANDROID {
    XrPosef    hitPose;
    float      distanceSquared;
} XrSpatialRaycastResultDataANDROID;

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

  • hitPose एक XrPosef है. यह उस पॉइंट को तय करता है जहां किरण, स्पेशल एंटिटी से मिलती है.
  • distanceSquared, किरण के ऑरिजिन से लेकर इंटरसेक्शन पॉइंट तक की दूरी का वर्ग है.

XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID कॉम्पोनेंट, सिर्फ़ xrCreateSpatialDiscoverySnapshotAsyncEXT से बनाए गए XrSpatialSnapshotEXT में मौजूद होगा. इसमें XrSpatialRaycastInfoANDROID, XrSpatialDiscoverySnapshotCreateInfoEXT :: next चेन में शामिल है. इसके अलावा, यह xrCreateSpatialRaycastSnapshotANDROID से बनाए गए XrSpatialSnapshotEXT में भी मौजूद होगा.

रनटाइम को, xrCreateSpatialUpdateSnapshotEXT का इस्तेमाल करके बनाए गए किसी भी XrSpatialSnapshotEXT में इस कॉम्पोनेंट को शामिल नहीं करना चाहिए .

अगर ऐप्लिकेशन में XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID शामिल है, तो रनटाइम को xrCreateSpatialUpdateSnapshotEXT से XR_ERROR_VALIDATION_FAILURE वापस करना होगा .

अगर XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID को सिर्फ़ कुछ सुविधाओं के लिए चालू किया गया है, तो रनटाइम को स्नैपशॉट में सिर्फ़ उन सुविधाओं से मिली जगह की जानकारी वाली इकाइयां शामिल करनी होंगी. उदाहरण के लिए, अगर कोई ऑब्जेक्ट और कोई प्लेन एक ही दिशा में है और XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID सिर्फ़ XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT के लिए चालू है , तो सिर्फ़ प्लेन का पता लगाया जाएगा.

XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID का hitPose, XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace में XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time पर मौजूद होगा . पॉज़िटिव Z ऐक्सिस, हिट की गई सतह का नॉर्मल है. साथ ही, नेगेटिव Y ऐक्सिस, रे की शुरुआत की ओर इशारा करता है.

मान्य इस्तेमाल (इंप्लिसिट)

  • XrSpatialRaycastResultDataANDROID का इस्तेमाल करने से पहले, XR_ANDROID_spatial_discovery_raycast एक्सटेंशन को चालू करना ज़रूरी है

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

XrSpatialComponentRaycastResultListANDROID स्ट्रक्चर को इस तरह से परिभाषित किया गया है:

typedef struct XrSpatialComponentRaycastResultListANDROID {
    XrStructureType                       type;
    void*                                 next;
    uint32_t                              raycastResultCount;
    XrSpatialRaycastResultDataANDROID*    raycastResults;
} XrSpatialComponentRaycastResultListANDROID;

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

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

XrSpatialSnapshotEXT में मौजूद स्पेशल एंटिटी के रेकास्ट नतीजे वाले कॉम्पोनेंट के बारे में क्वेरी करने के लिए, XrSpatialComponentDataQueryConditionEXT :: componentTypes में XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID शामिल करें. साथ ही, XrSpatialComponentDataQueryResultEXT :: next चेन में XrSpatialComponentRaycastResultListANDROID जोड़ें.

अगर XrSpatialComponentRaycastResultListANDROID, XrSpatialComponentDataQueryResultEXT :: next चेन में है, लेकिन XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID को XrSpatialComponentDataQueryConditionEXT :: componentTypes में शामिल नहीं किया गया है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_VALIDATION_FAILURE वापस भेजना ज़रूरी है .

अगर raycastResultCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput से कम है, तो रनटाइम को xrQuerySpatialComponentDataEXT से XR_ERROR_SIZE_INSUFFICIENT ज़रूर लौटाना चाहिए .

लौटाए गए raycastResults क्रम में नहीं हैं. कोई ऐप्लिकेशन, दूरी के हिसाब से नतीजों को क्रम से लगाने के लिए, XrSpatialRaycastResultDataANDROID :: distanceSquared का इस्तेमाल कर सकता है.

मान्य इस्तेमाल (इंप्लिसिट)

  • XrSpatialComponentRaycastResultListANDROID का इस्तेमाल करने से पहले, XR_ANDROID_spatial_discovery_raycast एक्सटेंशन को चालू करना ज़रूरी है
  • type ज़रूरी है कि XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID
  • next ज़रूरी है कि NULL हो या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर हो
  • raycastResults, raycastResultCount XrSpatialRaycastResultDataANDROID स्ट्रक्चर के ऐरे का पॉइंटर होना चाहिए
  • raycastResultCount पैरामीटर की वैल्यू, 0 से ज़्यादा होनी चाहिए

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

अगर किसी सुविधा के लिए, XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID को XrSpatialCapabilityComponentTypesEXT :: componentTypes में गिना जाता है, तो ऐप्लिकेशन XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents सूची में enum वैल्यू शामिल करके, इसे चालू कर सकता है. इस कॉम्पोनेंट को XrSpatialCapabilityConfigurationBaseHeaderEXT की अगली चेन में शामिल करने के लिए, किसी खास कॉन्फ़िगरेशन की ज़रूरत नहीं होती .

अगर ऐप्लिकेशन में XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID शामिल है, तो रनटाइम को xrCreateSpatialUpdateSnapshotEXT से XR_ERROR_VALIDATION_FAILURE वापस करना होगा . यह कॉम्पोनेंट, डिस्कवरी स्नैपशॉट के लिए खास तौर पर है.

डेप्थ रेकास्ट की स्पेशियल अबिलिटी

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

XrSpatialCapabilityConfigurationDepthRaycastANDROID स्ट्रक्चर को इस तरह परिभाषित किया गया है:

typedef struct XrSpatialCapabilityConfigurationDepthRaycastANDROID {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
} XrSpatialCapabilityConfigurationDepthRaycastANDROID;

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

  • type इस स्ट्रक्चर का XrStructureType है.
  • next, NULL होता है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर होता है.
  • capability एक XrSpatialCapabilityEXT है और यह XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID होना चाहिए .
  • enabledComponentCount, uint32_t है. यह enabledComponents कलेक्शन में मौजूद एलिमेंट की संख्या के बारे में बताता है. यह 0 से ज़्यादा होना चाहिए.
  • enabledComponents, XrSpatialComponentTypeEXT के ऐरे का पॉइंटर है .

ऐप्लिकेशन, XrSpatialContextCreateInfoEXT :: capabilityConfigs में XrSpatialCapabilityConfigurationDepthRaycastANDROID स्ट्रक्चर का पॉइंटर शामिल करके, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID स्पेशल कैपेबिलिटी चालू कर सकते हैं .

अगर capability, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID नहीं है, तो रनटाइम को XR_ERROR_VALIDATION_FAILURE वैल्यू ज़रूर दिखानी चाहिए .

इस सुविधा की मदद से खोजे गए ऑब्जेक्ट का आईडी हमेशा XR_NULL_SPATIAL_ENTITY_ID_EXT होता है . इसका यह भी मतलब है कि ऐप्लिकेशन, इन इकाइयों के लिए XrSpatialEntityEXT हैंडल नहीं बना सकता. इसलिए, इन्हें अपडेट स्नैपशॉट बनाने के लिए XrSpatialUpdateSnapshotCreateInfoEXT :: entities में शामिल नहीं किया जा सकता

मान्य इस्तेमाल (इंप्लिसिट)

  • XrSpatialCapabilityConfigurationDepthRaycastANDROID का इस्तेमाल करने से पहले, XR_ANDROID_spatial_discovery_raycast एक्सटेंशन को चालू करना ज़रूरी है
  • type ज़रूरी है कि XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID
  • next ज़रूरी है कि NULL हो या स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर हो
  • capability XrSpatialCapabilityEXT की मान्य वैल्यू होनी चाहिए
  • enabledComponents, enabledComponentCount मान्य XrSpatialComponentTypeEXT वैल्यू के ऐरे का पॉइंटर होना चाहिए
  • enabledComponentCount पैरामीटर की वैल्यू, 0 से ज़्यादा होनी चाहिए

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

XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID के साथ काम करने वाले रनटाइम को, इस सुविधा से मिली इकाइयों के गारंटीड कॉम्पोनेंट के तौर पर, यहां दिए गए स्पेशल कॉम्पोनेंट के साथ काम करना ज़रूरी है. साथ ही, उन्हें xrEnumerateSpatialCapabilityComponentTypesEXT में शामिल करना ज़रूरी है -

  • XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID

सिंक्रोनस रेकास्ट

xrCreateSpatialRaycastSnapshotANDROID फ़ंक्शन को इस तरह से परिभाषित किया गया है:

XrResult xrCreateSpatialRaycastSnapshotANDROID(
    XrSpatialContextEXT                         spatialContext,
    const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
    XrSpatialSnapshotEXT*                       snapshot);

पैरामीटर की जानकारी

ज़्यादातर इस्तेमाल के मामलों के लिए, xrCreateSpatialDiscoverySnapshotAsyncEXT काफ़ी है. हालांकि, जिन ऐप्लिकेशन को रेकास्ट के नतीजे तुरंत चाहिए उनके लिए यह धीमा है. xrCreateSpatialRaycastSnapshotANDROID, स्नैपशॉट बनाने के लिए सिंक्रोनस रेकास्टिंग शुरू करता है. इससे ऐप्लिकेशन, रेकास्ट के नतीजों के बारे में तुरंत क्वेरी कर सकते हैं.

अगर spatialContext बनाते समय, XrSpatialContextCreateInfoEXT :: capabilityConfigs को पास की गई स्पेशल सुविधाओं के लिए, XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes में मौजूद XrSpatialComponentTypeEXT में से कोई भी सुविधा चालू नहीं है, तो रनटाइम को XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT वापस भेजना ज़रूरी है .

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

मान्य इस्तेमाल (इंप्लिसिट)

रिटर्न कोड

सफल

  • 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_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialRaycastSnapshotCreateInfoANDROID स्ट्रक्चर को इस तरह से परिभाषित किया गया है:

typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
    XrStructureType                       type;
    const void*                           next;
    uint32_t                              componentTypeCount;
    const XrSpatialComponentTypeEXT*      componentTypes;
    const XrSpatialRaycastInfoANDROID*    raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;

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

  • type इस स्ट्रक्चर का XrStructureType है.
  • next, NULL होता है या स्ट्रक्चर चेन में अगले स्ट्रक्चर का पॉइंटर होता है. इस तरह के स्ट्रक्चर, OpenXR के मुख्य स्पेसिफ़िकेशन या इस एक्सटेंशन में तय नहीं किए गए हैं.
  • componentTypeCount, uint32_t है. यह componentTypes कलेक्शन में मौजूद एलिमेंट की संख्या के बारे में बताता है.
  • componentTypes, XrSpatialComponentTypeEXT का एक कलेक्शन है .
  • raycastInfo, XrSpatialRaycastInfoANDROID स्ट्रक्चर है. यह रे की जानकारी देता है.

मान्य इस्तेमाल (इंप्लिसिट)

कोड का उदाहरण

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

यहां दिए गए उदाहरण कोड में, रेकास्ट की सुविधा के साथ काम करने वाली क्षमताओं के साथ स्पेशल कॉन्टेक्स्ट बनाने का तरीका बताया गया है. इस उदाहरण के लिए, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID और XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT का इस्तेमाल किया गया है.

// Check runtime supported capabilities
uint32_t capabilityCount;
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_DEPTH_RAYCAST_ANDROID) == capabilities.end()) {
  return;
}

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

// Create capability config for depth raycasting
std::vector<XrSpatialComponentTypeEXT> depthRaycastComponents {
  XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
};

// Create capability config for depth raycasting
XrSpatialCapabilityConfigurationDepthRaycastANDROID depthRaycastConfig {
  .type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID,
  .next = nullptr,
  .capability = XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID,
  .enabledComponentCount = (uint32_t)depthRaycastComponents.size(),
  .enabledComponents = depthRaycastComponents.data(),
};

// Enumerate runtime supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes {
  XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT
};

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

CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
       XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));

planeTrackingComponents.resize(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = (uint32_t)planeTrackingComponents.size();
capabilityComponentTypes.componentTypes = planeTrackingComponents.data();

CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
       XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));

// Check if raycast is supported by plane tracking
isRaycastSupportedViaPlaneTracking = std::find(planeTrackingComponents.begin(),
planeTrackingComponents.end(), XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID)
!= planeTrackingComponents.end();

// 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
// Types of raycast is determined by configs included in XrSpatialContextCreateInfoEXT
// For this example, both plane raycast & depth raycast are performed
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&depthRaycastConfig));
if(isRaycastSupportedViaPlaneTracking) 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_DEPTH_RAYCAST_ANDROID और XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT के साथ कॉन्फ़िगर किए गए किसी कॉन्टेक्स्ट के लिए, स्पैटियल एंटिटी ढूंढने और उसके कॉम्पोनेंट डेटा के बारे में क्वेरी करने का तरीका बताया गया है.

// Fill in the raycast info.
XrSpatialRaycastInfoANDROID raycastInfo {
  .type        = XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID,
  .next        = nullptr,
  .space       = viewSpace,
  .time        = updateTime,
  .origin      = {0.0f, 0.0f, 0.0f},
  .direction   = {0.0f, 0.0f,-1.0f},
  .maxDistance = 0.0f  // ray is unbounded
};

// Next pointing to the raycast info.
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
  .type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
  .next = &raycastInfo
};

// Create snapshot
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT (
spatialContext, &discoverySnapshotCreateInfo, &future));

waitUntilReady(future);

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

XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
  XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};

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

if(completion.futureResult != XR_SUCCESS) return;

// Query hit result components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_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,
};

XrResult result = xrQuerySpatialComponentDataEXT(
           completion.snapshot, &queryCond, &queryResult);

// Check query result.
if(result != XR_SUCCESS) return;

// Query again for the hit result list.
std::vector<XrSpatialRaycastResultDataANDROID> raycastResults;
raycastResults.resize(queryResult.entityIdCountOutput);
XrSpatialComponentRaycastResultListANDROID raycastResultList {
  .type               = XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID,
  .raycastResultCount = (uint32_t)raycastResults.size(),
  .raycastResults     = raycastResults.data(),
};

queryResult.next = &raycastResultList;
result = xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult);

// Check query result again.
if(result != XR_SUCCESS) return;

std::vector<XrSpatialEntityEXT> hitEntities;
std::vector<XrPosef> depthHitPoses;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
    // access raycastResults[i] for id & pose
    XrSpatialEntityIdEXT   id   = queryResult.entityIds[i];
    XrPosef                pose = raycastResults[i].hitPose;

    if (id != XR_NULL_SPATIAL_ENTITY_ID_EXT) {
        // hit entities (e.g. planes)
    // get entity handle via entity id
    XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
      .type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
      .entityId = id,
    };

    XrSpatialEntityEXT entity = XR_NULL_HANDLE;
    xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);

    hitEntities.push_back(entity);
  } else {
    // hit depth
    depthHitPoses.push_back(pose);
  }
}

// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);

Raycast स्नैपशॉट बनाएं

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

// fill in create info
XrSpatialRaycastSnapshotCreateInfoANDROID createInfo {
  .type = XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID,
  .componentTypeCount = 0,   // include all hit spatial entities
  .componentTypes = nullptr,
  .raycastInfo = &raycastInfo
};

// create raycast snapshot
XrSpatialSnapshotEXT raycastSnapshot = XR_NULL_HANDLE;
CHK_XR(xrCreateSpatialRaycastSnapshotANDROID(
  spatialContext, &createInfo, &raycastSnapshot));

// ...
// query component data as previous example
// ...

// Cleanup
xrDestroySpatialSnapshotEXT(raycastSnapshot);

नए निर्देश

नई संरचनाएं

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

  • XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAME
  • XR_ANDROID_spatial_discovery_raycast_SPEC_VERSION
  • XrSpatialCapabilityEXT को बढ़ाना :

    • XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
  • XrSpatialComponentTypeEXT को बढ़ाना :

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

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID
    • XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID
    • XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID
    • XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID

समस्याएं

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

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

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