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मीटर में वह दूरी है जिसे ऐप्लिकेशन चाहे तो तय कर सकता है. इससे,directionके साथ-साथoriginसे तय की गई दूरी के अंदर मौजूद इकाइयों को खोजने की सुविधा को सीमित किया जा सकता है.
कोई ऐप्लिकेशन, XrSpatialDiscoverySnapshotCreateInfoEXT :: next चेन में XrSpatialRaycastInfoANDROID को शामिल कर सकता है. इससे उन स्पेशल इकाइयों का पता लगाया जा सकता है जो इस स्ट्रक्चर में तय की गई रे को इंटरसेक्ट करती हैं.
अगर कोई ऐप्लिकेशन XrSpatialContextEXT के साथ XrSpatialRaycastInfoANDROID का इस्तेमाल करता है, जिसे किसी भी क्षमता के लिए 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 या नेगेटिव वैल्यू पर सेट किया जाता है, तो रनटाइम को रे को अनबाउंडेड मानना चाहिए.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialRaycastInfoANDROID का इस्तेमाल करने से पहले,
XR_ANDROID_spatial_discovery_raycastएक्सटेंशन को चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
spaceXrSpace हैंडल मान्य होना चाहिए
Raycast के नतीजे वाला कॉम्पोनेंट
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 में शामिल किया गया है.
रनटाइम में, इस कॉम्पोनेंट को किसी भी ऐसे XrSpatialSnapshotEXT में शामिल नहीं करना चाहिए जिसे xrCreateSpatialUpdateSnapshotEXT का इस्तेमाल करके बनाया गया हो.
अगर ऐप्लिकेशन में 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 :: time पर XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace में मौजूद होगा. पॉज़िटिव 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होनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
raycastResultsकोraycastResultCountXrSpatialRaycastResultDataANDROID स्ट्रक्चर के कलेक्शन का पॉइंटर होना चाहिए -
raycastResultCountपैरामीटर की वैल्यू,0से ज़्यादा होनी चाहिए
कॉन्फ़िगरेशन
अगर किसी सुविधा के लिए, XrSpatialCapabilityComponentTypesEXT :: componentTypes में XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID को शामिल किया गया है, तो ऐप्लिकेशन उसे चालू कर सकता है. इसके लिए, उसे 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 के कलेक्शन का पॉइंटर है.
ऐप्लिकेशन, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID स्पेशल कैपेबिलिटी को चालू कर सकते हैं. इसके लिए, उन्हें XrSpatialContextCreateInfoEXT :: capabilityConfigs में XrSpatialCapabilityConfigurationDepthRaycastANDROID स्ट्रक्चर का पॉइंटर शामिल करना होगा.
अगर 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होनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए -
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);
पैरामीटर की जानकारी
spatialContextएक XrSpatialContextEXT है, जिसे पहले xrCreateSpatialContextAsyncEXT का इस्तेमाल करके बनाया गया था.createInfo, XrSpatialRaycastSnapshotCreateInfoANDROID का पॉइंटर है.snapshot, XrSpatialSnapshotEXT का पॉइंटर है.
ज़्यादातर मामलों में xrCreateSpatialDiscoverySnapshotAsyncEXT का इस्तेमाल किया जा सकता है. हालांकि, जिन ऐप्लिकेशन को रेकास्ट के नतीजे तुरंत चाहिए होते हैं उनके लिए यह तरीका धीमा माना जाता है. xrCreateSpatialRaycastSnapshotANDROID, स्नैपशॉट बनाने के लिए सिंक्रोनस रेकास्टिंग शुरू करता है. इससे ऐप्लिकेशन, रेकास्ट के नतीजों के लिए तुरंत क्वेरी करना शुरू कर सकते हैं.
अगर spatialContext बनाते समय XrSpatialContextCreateInfoEXT :: capabilityConfigs को पास की गई स्पेशल सुविधाओं के लिए, XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes में मौजूद कोई भी XrSpatialComponentTypeEXT चालू नहीं है, तो रनटाइम को XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT ज़रूर दिखाना चाहिए.
अगर ऐप्लिकेशन, XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes में स्पेशल कॉम्पोनेंट टाइप की सूची नहीं देता है, तो रनटाइम को स्नैपशॉट में उन सभी स्पेशल इकाइयों को शामिल करना चाहिए जिनमें कॉम्पोनेंट का सेट मौजूद है. इन कॉम्पोनेंट की जानकारी, XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents में दी गई है. ऐसा, spatialContext के लिए कॉन्फ़िगर की गई, रेकास्ट की सुविधा वाली क्षमताओं के लिए किया जाता है. रनटाइम में, spatialContext के लिए कॉन्फ़िगर की गई रेकास्ट की सुविधा के सभी चालू कॉम्पोनेंट का डेटा शामिल होना चाहिए.
सही इस्तेमाल (इंप्लिसिट)
- xrCreateSpatialRaycastSnapshotANDROID को कॉल करने से पहले,
XR_ANDROID_spatial_discovery_raycastएक्सटेंशन को चालू करना ज़रूरी है -
spatialContextएक मान्य XrSpatialContextEXT हैंडल होना चाहिए -
createInfoको किसी मान्य XrSpatialRaycastSnapshotCreateInfoANDROID स्ट्रक्चर का पॉइंटर होना चाहिए -
snapshotको XrSpatialSnapshotEXT हैंडल का पॉइंटर होना ज़रूरी है
रिटर्न कोड
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXTXR_ERROR_TIME_INVALIDXR_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 स्ट्रक्चर है. इसमें रे की जानकारी दी गई है.
सही इस्तेमाल (इंप्लिसिट)
- XrSpatialRaycastSnapshotCreateInfoANDROID का इस्तेमाल करने से पहले,
XR_ANDROID_spatial_discovery_raycastएक्सटेंशन को चालू करना ज़रूरी है -
typeकी वैल्यूXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROIDहोनी चाहिए -
nextNULLया स्ट्रक्चर चेन में अगले स्ट्रक्चर का मान्य पॉइंटर होना चाहिए - अगर
componentTypeCountकी वैल्यू0नहीं है, तोcomponentTypesकोcomponentTypeCountमान्य 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 Snapshot बनाएं
यहां दिए गए कोड के उदाहरण से पता चलता है कि सिंक्रोनस रेकास्ट स्नैपशॉट कैसे बनाया जाता है.
// 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);
नए निर्देश
नए स्ट्रक्चर
- XrSpatialCapabilityConfigurationDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
XrSpatialComponentDataQueryResultEXT को एक्सटेंड करना :
XrSpatialDiscoverySnapshotCreateInfoEXT को एक्सटेंड करना :
नए Enum कॉन्सटेंट
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAMEXR_ANDROID_spatial_discovery_raycast_SPEC_VERSIONXrSpatialCapabilityEXT को एक्सटेंड करना :
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
XrSpatialComponentTypeEXT को एक्सटेंड करना :
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
XrStructureType को एक्सटेंड करना :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID
समस्याएं
वर्शन हिस्ट्री
बदलाव 1, 15-07-2025 (ब्रायन चेन)
- एक्सटेंशन का शुरुआती ब्यौरा.