XR_ANDROID_spatial_discovery_raycast

নাম স্ট্রিং

XR_ANDROID_spatial_discovery_raycast

এক্সটেনশন টাইপ

ইনস্ট্যান্স এক্সটেনশন

নিবন্ধিত এক্সটেনশন নম্বর

৭৮৭

সংশোধন

অনুমোদনের অবস্থা

অনুমোদিত নয়

এক্সটেনশন এবং সংস্করণ নির্ভরতা

XR_EXT_spatial_entity

সর্বশেষ সংশোধনের তারিখ

২০২৫-০৮-১২

আইপি স্ট্যাটাস

কোনো জ্ঞাত আইপি দাবি নেই।

অবদানকারীরা

ব্রায়ান চেন, গুগল
লেভানা চেন, গুগল
কাইল চেন, গুগল
নিহাব জৈন, গুগল
স্পেন্সার কুইন, গুগল
নাটালি ফ্লেউরি, মেটা
ইউইচি তাগুচি, মেটা
জিমি আলামপারাম্বিল, বাইটড্যান্স
ঝিপেং লিউ, বাইটড্যান্স

সংক্ষিপ্ত বিবরণ

এই এক্সটেনশনটি XR_EXT_spatial_entity উপর ভিত্তি করে তৈরি এবং এটি XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT এর মতো বিদ্যমান স্পেশিয়াল ক্যাপাবিলিটিগুলোর জন্য স্পেশিয়াল এনটিটি আবিষ্কার করতে রে-কাস্ট কার্যকারিতা প্রদান করে।

এই এক্সটেনশনটি ডেপথ বাফারের বিপরীতে রে-কাস্টিংয়ের জন্য একটি নতুন স্থানিক সক্ষমতাও যোগ করে।

অনুমতি

অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি যে ক্যাপাবিলিটিগুলো ব্যবহার করে, তার উপর নির্ভর করে প্রয়োজনীয় পারমিশন। যদি 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 কে একটি ধনাত্মক মানে সেট করে, তাহলে রানটাইমকে অবশ্যই snappn:origin থেকে direction বরাবর maxDistance চেয়ে বেশি দূরে অবস্থিত কোনো হিট স্পেশাল এনটিটিকে snappn-এ অন্তর্ভুক্ত করা যাবে না। যদি maxDistance 0 বা একটি ঋণাত্মক মানে সেট করা হয়, তাহলে রানটাইমকে অবশ্যই রে-টিকে আনবাউন্ডেড (unbounded) হিসেবে বিবেচনা করতে হবে।

বৈধ ব্যবহার (অন্তর্নিহিত)

রেকাস্ট ফলাফল উপাদান

XrSpatialRaycastResultDataANDROID কাঠামোটি নিম্নরূপে সংজ্ঞায়িত করা হয়:

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

সদস্যদের বিবরণ

  • hitPose হলো একটি XrPosef যা সেই বিন্দুকে সংজ্ঞায়িত করে যেখানে রশ্মিটি স্থানিক সত্তার সাথে ছেদ করে।
  • distanceSquared হলো রশ্মির উৎস থেকে ছেদবিন্দু পর্যন্ত দূরত্বের বর্গ।

XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID কম্পোনেন্টটি শুধুমাত্র এমন একটি XrSpatialSnapshotEXT- এ উপস্থিত থাকবে যা xrCreateSpatialDiscoverySnapshotAsyncEXT থেকে তৈরি করা হয়েছে, যেখানে 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 :: 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 :: componentTypesXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID অন্তর্ভুক্ত করুন এবং XrSpatialComponentDataQueryResultEXT :: next চেইনে XrSpatialComponentRaycastResultListANDROID যোগ করুন।

যদি XrSpatialComponentRaycastResultListANDROID, XrSpatialComponentDataQueryResultEXT :: next chain-এ থাকে কিন্তু 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 ব্যবহার করতে পারে

বৈধ ব্যবহার (অন্তর্নিহিত)

কনফিগারেশন

যদি কোনো ক্যাপাবিলিটির জন্য XrSpatialCapabilityComponentTypesEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID তালিকাভুক্ত থাকে, তাহলে অ্যাপ্লিকেশনটি XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents তালিকায় enum ভ্যালুটি অন্তর্ভুক্ত করার মাধ্যমে এটিকে সক্রিয় করতে পারে । এই কম্পোনেন্টটিকে XrSpatialCapabilityConfigurationBaseHeaderEXT- এর পরবর্তী চেইনে অন্তর্ভুক্ত করার জন্য কোনো বিশেষ কনফিগারেশনের প্রয়োজন হয় না।

যদি অ্যাপ্লিকেশনটি XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypesXR_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 অন্তর্ভুক্ত করা যায় না।

বৈধ ব্যবহার (অন্তর্নিহিত)

গ্যারান্টিযুক্ত উপাদান

যে রানটাইম 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 এর জন্য কনফিগার করা রেকাস্ট সাপোর্টেড ক্যাপাবিলিটিগুলোর সমস্ত সক্রিয় কম্পোনেন্টের ডেটা অন্তর্ভুক্ত করতে হবে।

বৈধ ব্যবহার (অন্তর্নিহিত)

  • xrCreateSpatialRaycastSnapshotANDROID কল করার আগে XR_ANDROID_spatial_discovery_raycast এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • spatialContext অবশ্যই একটি বৈধ XrSpatialContextEXT হ্যান্ডেল হতে হবে।
  • createInfo অবশ্যই একটি বৈধ XrSpatialRaycastSnapshotCreateInfoANDROID স্ট্রাকচারের পয়েন্টার হতে হবে।
  • snapshot অবশ্যই একটি XrSpatialSnapshotEXT হ্যান্ডেলের দিকে নির্দেশকারী একটি পয়েন্টার হতে হবে।

রিটার্ন কোড

সাফল্য

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ব্যর্থতা

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

রেকাস্ট স্ন্যাপশট তৈরি করুন

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে সিঙ্ক্রোনাস রেকাস্ট স্ন্যাপশট তৈরি করতে হয়।

// 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);

নতুন কমান্ড

নতুন কাঠামো

নতুন এনাম ধ্রুবক

  • 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

সমস্যা

সংস্করণ ইতিহাস

  • সংশোধন ১, ২০২৫-০৭-১৫ (ব্রায়ান চেন)

    • প্রাথমিক সম্প্রসারণের বিবরণ।