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 বা নেগেটিভ সেট করা হলে, রানটাইমকে অবশ্যই রে আনবাউন্ডেড হিসেবে বিবেচনা করতে হবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

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 ব্যবহার করতে পারে।

সঠিক ব্যবহার (অন্তর্নিহিত)

কনফিগারেশন

কিছু ক্ষমতার জন্য 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-এ এগুলি অন্তর্ভুক্ত করা যাবে না

সঠিক ব্যবহার (অন্তর্নিহিত)

গ্যারেন্টিযুক্ত কম্পোনেন্ট

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-এ স্পেশাল কম্পোনেন্টের প্রকারের তালিকা প্রদান না করলে, রানটাইমে স্ন্যাপশটে সমস্ত স্পেশাল এন্টিটি অবশ্যই অন্তর্ভুক্ত করতে হবে, যেগুলিতে কম্পোনেন্টের সেট রয়েছে যা XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents-এ গণনা করা হয়েছে, যা spatialContext-এর জন্য কনফিগার করা রেকাস্ট সমর্থিত ক্ষমতার জন্য। রানটাইমে 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);

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

ইস্যু

ভার্সনের ইতিহাস

  • রিভিশন ১, ১৫-০৭-২০২৫ (ব্রায়ান চেন)

    • এক্সটেনশনের প্রাথমিক বিবরণ।