XR_ANDROID_spatial_discovery_raycast
নামের স্ট্রিং
XR_ANDROID_spatial_discovery_raycast
এক্সটেনশনের ধরন
ইনস্ট্যান্স এক্সটেনশন
রেজিস্টার করা এক্সটেনশন নম্বর
787
সংশোধন
1
অনুমোদনের স্ট্যাটাস
অনুমোদিত নয়
এক্সটেনশন ও ভার্সন ডিপেন্ডেন্সি
XR_EXT_spatial_entity
শেষবার পরিবর্তন করার তারিখ
2025-08-12
IP স্ট্যাটাস
IP সংক্রান্ত কোনও দাবি নেই।
কন্ট্রিবিউটর
ব্রায়ান চেন, 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 অন্তর্ভুক্ত করতে পারে।
কোনও অ্যাপ্লিকেশন যদি 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হতে হবে -
nextঅবশ্যইNULLবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের সঠিক পয়েন্টার হতে হবে -
spaceঅবশ্যই একটি সঠিক XrSpace হ্যান্ডেল হতে হবে
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 :: 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অবশ্যইraycastResultCountXrSpatialRaycastResultDataANDROID স্ট্রাকচারের অ্যারের পয়েন্টার হতে হবে -
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অ্যারেতে এলিমেন্টের সংখ্যা বর্ণনা করে। এটি অবশ্যই ০-এর থেকে বেশি হতে হবে।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);
প্যারামিটারের বিবরণ
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হতে হবে -
nextঅবশ্যইNULLবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের সঠিক পয়েন্টার হতে হবে -
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 স্ন্যাপশট তৈরি করুন
সিঙ্ক্রোনাস রেকাস্ট স্ন্যাপশট কীভাবে তৈরি করতে হয় তা নিম্নলিখিত উদাহরণ কোড থেকে জানতে পারবেন।
// 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
ইস্যু
ভার্সনের ইতিহাস
রিভিশন ১, ১৫-০৭-২০২৫ (ব্রায়ান চেন)
- এক্সটেনশনের প্রাথমিক বিবরণ।