XR_EXT_spatial_marker_tracking

নাম স্ট্রিং

XR_EXT_spatial_marker_tracking

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

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

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

৭৪৪

সংশোধন

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

অনুমোদিত

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

XR_EXT_spatial_entity

অবদানকারীরা

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

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

এই এক্সটেনশনটি XR_EXT_spatial_entity উপর ভিত্তি করে তৈরি এবং এটি অ্যাপ্লিকেশনগুলিকে তাদের পরিবেশে মার্কার সনাক্ত ও ট্র্যাক করতে সক্ষম করে। মার্কারগুলি হলো 2D কোড, যার মধ্যে QR কোড, মাইক্রো QR কোড, ArUco মার্কার বা AprilTag অন্তর্ভুক্ত থাকতে পারে

একটি ট্র্যাক করা মার্কারকে এমন একটি স্থানিক সত্তা হিসেবে উপস্থাপন করা হয় যার নিম্নলিখিত উপাদানগুলো থাকে:

  • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

রানটাইম সমর্থন

একটি রানটাইমকে অবশ্যই xrEnumerateSpatialCapabilitiesEXT ব্যবহার করে নিম্নলিখিত ক্যাপাবিলিটিগুলোর যেকোনো একটি তালিকাভুক্ত করার মাধ্যমে বিভিন্ন মার্কার ট্র্যাকিং ক্যাপাবিলিটির জন্য তার সমর্থন ঘোষণা করতে হবে:

  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT
  • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT

কনফিগারেশন

কোনো মার্কারের ধরন শনাক্তকরণ সক্ষম করতে হলে অ্যাপ্লিকেশনটিকে অবশ্যই xrCreateSpatialContextAsyncEXT- এ সংশ্লিষ্ট কনফিগারেশন কাঠামোটি পাস করতে হবে

মার্কার টাইপ কনফিগারেশন

কিউআর কোড

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

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

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • capability অবশ্যই XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT হতে হবে।
  • enabledComponentCount হলো একটি uint32_t , যা enabledComponents এর অন্তর্ভুক্ত উপাদানের সংখ্যা নির্দেশ করে।
  • enabledComponents হলো এই ক্যাপাবিলিটির জন্য সক্রিয় করতে হবে এমন কম্পোনেন্টগুলোর একটি অ্যারের পয়েন্টার।

যদি QR কোড সমর্থিত হয়, তাহলে xrCreateSpatialContextAsyncEXT কল করার সময় XrSpatialContextCreateInfoEXT :: capabilityConfigs এ যখন একটি XrSpatialCapabilityConfigurationQrCodeEXT স্ট্রাকচার পাস করা হয়, তখন রানটাইমকে অবশ্যই QR কোড ট্র্যাকিং সক্ষম করতে হবে।

যদি xrEnumerateSpatialCapabilitiesEXT দ্বারা XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT গণনা করা না হয়, তাহলে রানটাইমকে অবশ্যই XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT রিটার্ন করতে হবে।

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

মাইক্রো কিউআর কোড

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

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

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • capability অবশ্যই XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT হতে হবে।
  • enabledComponentCount হলো একটি uint32_t , যা enabledComponents এর অন্তর্ভুক্ত উপাদানের সংখ্যা নির্দেশ করে।
  • enabledComponents হলো এই ক্যাপাবিলিটির জন্য সক্রিয় করতে হবে এমন কম্পোনেন্টগুলোর একটি অ্যারের পয়েন্টার।

যদি মাইক্রো কিউআর কোড সমর্থিত হয়, তাহলে xrCreateSpatialContextAsyncEXT কল করার সময় XrSpatialContextCreateInfoEXT :: capabilityConfigs এ একটি XrSpatialCapabilityConfigurationMicroQrCodeEXT স্ট্রাকচার পাস করা হলে রানটাইমকে অবশ্যই মাইক্রো কিউআর কোড ট্র্যাকিং সক্ষম করতে হবে।

যদি xrEnumerateSpatialCapabilitiesEXT দ্বারা XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT গণনা করা না হয়, তাহলে রানটাইমকে অবশ্যই XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT রিটার্ন করতে হবে।

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

আরুকো মার্কার

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

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

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • capability অবশ্যই XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT হতে হবে।
  • enabledComponentCount হলো একটি uint32_t , যা enabledComponents এর অন্তর্ভুক্ত উপাদানের সংখ্যা নির্দেশ করে।
  • enabledComponents হলো এই ক্যাপাবিলিটির জন্য সক্রিয় করতে হবে এমন কম্পোনেন্টগুলোর একটি অ্যারের পয়েন্টার।
  • arUcoDict হলো শনাক্ত করার জন্য মার্কার ডিকশনারি।

যদি ArUco মার্কার সমর্থিত হয়, তাহলে xrCreateSpatialContextAsyncEXT কল করার সময় XrSpatialContextCreateInfoEXT :: capabilityConfigs এ একটি XrSpatialCapabilityConfigurationArucoMarkerEXT স্ট্রাকচার পাস করা হলে রানটাইমকে অবশ্যই ArUco মার্কার ট্র্যাকিং সক্ষম করতে হবে।

যদি XrSpatialContextCreateInfoEXT :: capabilityConfigs এ একটি XrSpatialCapabilityConfigurationArucoMarkerEXT স্ট্রাকচার থাকে কিন্তু xrEnumerateSpatialCapabilitiesEXT দ্বারা XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT গণনা করা না হয়, তাহলে রানটাইমকে অবশ্যই xrCreateSpatialContextAsyncEXT থেকে XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT রিটার্ন করতে হবে

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

XrSpatialMarkerArucoDictEXT এনুমারেশনটি নিম্নরূপে সংজ্ঞায়িত করা হয়:

typedef enum XrSpatialMarkerArucoDictEXT {
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT = 1,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT = 2,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT = 3,
    XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT = 4,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT = 5,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT = 6,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT = 7,
    XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT = 8,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT = 9,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT = 10,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT = 11,
    XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT = 12,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT = 13,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT = 14,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT = 15,
    XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT = 16,
    XR_SPATIAL_MARKER_ARUCO_DICT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMarkerArucoDictEXT;

সমর্থিত পূর্বনির্ধারিত ArUco অভিধান:

গণনাকারীর বিবরণ

  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_50_EXT — ৫০টি আইডি সহ একটি ৪ বাই ৪ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_100_EXT — ১০০টি আইডি সহ একটি ৪ বাই ৪ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_250_EXT — ২৫০টি আইডি সহ একটি ৪ বাই ৪ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_4X4_1000_EXT — ১০০০টি আইডি সহ একটি ৪ বাই ৪ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT — ৫০টি আইডি সহ একটি ৫ বাই ৫ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_100_EXT — ১০০টি আইডি সহ একটি ৫ বাই ৫ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_250_EXT — ২৫০টি আইডি সহ একটি ৫ বাই ৫ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_5X5_1000_EXT — ১০০০টি আইডি সহ একটি ৫ বাই ৫ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_50_EXT — ৫০টি আইডি সহ একটি ৬ বাই ৬ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_100_EXT — ১০০টি আইডি সহ একটি ৬ বাই ৬ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_250_EXT — ২৫০টি আইডি সহ একটি ৬ বাই ৬ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_6X6_1000_EXT — ১০০০টি আইডি সহ একটি ৬ বাই ৬ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_50_EXT — ৫০টি আইডি সহ একটি ৭ বাই ৭ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_100_EXT — ১০০টি আইডি সহ একটি ৭ বাই ৭ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_250_EXT — ২৫০টি আইডি সহ একটি ৭ বাই ৭ পিক্সেলের আরুকো মার্কার ডিকশনারি।
  • XR_SPATIAL_MARKER_ARUCO_DICT_7X7_1000_EXT — ১০০০টি আইডি সহ একটি ৭ বাই ৭ পিক্সেলের আরুকো মার্কার ডিকশনারি।
এপ্রিলট্যাগস

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

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

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • capability অবশ্যই XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT হতে হবে।
  • enabledComponentCount হলো একটি uint32_t , যা enabledComponents এর অন্তর্ভুক্ত উপাদানের সংখ্যা নির্দেশ করে।
  • enabledComponents হলো এই ক্যাপাবিলিটির জন্য সক্রিয় করতে হবে এমন কম্পোনেন্টগুলোর একটি অ্যারের পয়েন্টার।
  • aprilDict হলো শনাক্ত করার জন্য মার্কার ডিকশনারি।

যদি AprilTag সমর্থিত হয়, তাহলে xrCreateSpatialContextAsyncEXT কল করার সময় XrSpatialContextCreateInfoEXT :: capabilityConfigs এ একটি XrSpatialCapabilityConfigurationAprilTagEXT স্ট্রাকচার পাস করা হলে রানটাইমকে অবশ্যই AprilTag ট্র্যাকিং সক্ষম করতে হবে

যদি XrSpatialContextCreateInfoEXT :: capabilityConfigsXrSpatialCapabilityConfigurationAprilTagEXT নামের কোনো স্ট্রাকচার থাকে, কিন্তু xrEnumerateSpatialCapabilitiesEXT দ্বারা XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT গণনা করা না হয়, তাহলে রানটাইমকে অবশ্যই xrCreateSpatialContextAsyncEXT থেকে XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT রিটার্ন করতে হবে।

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

XrSpatialMarkerAprilTagDictEXT এনুমারেশনটি নিম্নরূপে সংজ্ঞায়িত করা হয়:

typedef enum XrSpatialMarkerAprilTagDictEXT {
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT = 1,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT = 2,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT = 3,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT = 4,
    XR_SPATIAL_MARKER_APRIL_TAG_DICT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMarkerAprilTagDictEXT;

সমর্থিত পূর্বনির্ধারিত এপ্রিলট্যাগ অভিধান:

গণনাকারীর বিবরণ

  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_16H5_EXT — ৪ বাই ৪ বিট, যেকোনো দুটি কোডের মধ্যে সর্বনিম্ন হ্যামিং দূরত্ব = ৫, ৩০টি কোড।
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_25H9_EXT — ৫ বাই ৫ বিট, যেকোনো দুটি কোডের মধ্যে সর্বনিম্ন হ্যামিং দূরত্ব = ৯, ৩৫টি কোড।
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H10_EXT — ৬ বাই ৬ বিট, যেকোনো দুটি কোডের মধ্যে সর্বনিম্ন হ্যামিং দূরত্ব = ১০, ২৩২০টি কোড।
  • XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT — ৬ বাই ৬ বিট, যেকোনো দুটি কোডের মধ্যে সর্বনিম্ন হ্যামিং দূরত্ব = ১১,৫৮৭টি কোড।

ঐচ্ছিক মার্কার কনফিগারেশন

সমর্থিত ঐচ্ছিক বৈশিষ্ট্যগুলির তালিকা পেতে অ্যাপ্লিকেশনগুলিকে xrEnumerateSpatialCapabilityFeaturesEXT কল করতে হবে

যেকোনো এক্সটেনশন দ্বারা সমর্থিত সমস্ত স্পেশিয়াল ক্যাপাবিলিটি ফিচারের সম্পূর্ণ তালিকার জন্য XrSpatialCapabilityFeatureEXT দেখুন।

মার্কারের আকার

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

typedef struct XrSpatialMarkerSizeEXT {
    XrStructureType    type;
    const void*        next;
    float              markerSideLength;
} XrSpatialMarkerSizeEXT;

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • markerSideLength হলো সমস্ত মার্কারের মাপ, যা মিটারে পরিমাপ করা হয়।

যদি কোনো নির্দিষ্ট ক্যাপাবিলিটির জন্য xrEnumerateSpatialCapabilityFeaturesEXT দ্বারা XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT গণনা করা হয়, এবং যদি অ্যাপ্লিকেশনটি সেই ক্যাপাবিলিটির সংশ্লিষ্ট কনফিগারেশন স্ট্রাকচারের সাথে XrSpatialMarkerSizeEXT চেইন করে, তাহলে রানটাইমকে অবশ্যই ধরে নিতে হবে যে শনাক্ত করা সমস্ত মার্কারের প্রস্থ এবং উচ্চতা markerSideLength । রানটাইমকে এই তথ্য সরবরাহ করলে, রানটাইম আরও সঠিক পোজ এবং আকার ফেরত দিতে পারে। এই স্ট্রাকচারটি অবশ্যই XrSpatialCapabilityConfigurationQrCodeEXT , XrSpatialCapabilityConfigurationMicroQrCodeEXT , XrSpatialCapabilityConfigurationArucoMarkerEXT , অথবা XrSpatialCapabilityConfigurationAprilTagEXT- এর next চেইনে লিঙ্ক করতে হবে।

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

স্ট্যাটিক মার্কার অপ্টিমাইজেশন

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

typedef struct XrSpatialMarkerStaticOptimizationEXT {
    XrStructureType    type;
    const void*        next;
    XrBool32           optimizeForStaticMarker;
} XrSpatialMarkerStaticOptimizationEXT;

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • optimizeForStaticMarker নির্দেশ করে যে, স্পেসের সমস্ত মার্কার অপরিবর্তিত থাকবে বলে আশা করা হচ্ছে কিনা।

যদি কোনো নির্দিষ্ট ক্যাপাবিলিটির জন্য xrEnumerateSpatialCapabilityFeaturesEXT দ্বারা XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT গণনা করা হয়, এবং যদি অ্যাপ্লিকেশনটি সেই ক্যাপাবিলিটির সংশ্লিষ্ট কনফিগারেশন স্ট্রাকচারের সাথে XrSpatialMarkerStaticOptimizationEXT চেইন করে, তাহলে optimizeForStaticMarker XR_TRUE তে সেট করা থাকলে রানটাইমকে অবশ্যই ধরে নিতে হবে যে শনাক্ত করা সমস্ত মার্কার স্ট্যাটিক। এটি রানটাইমকে আরও নির্ভুল পোজ এবং আকার তৈরি করতে সাহায্য করে। এই স্ট্রাকচারটিকে অবশ্যই XrSpatialCapabilityConfigurationQrCodeEXT , XrSpatialCapabilityConfigurationMicroQrCodeEXT , XrSpatialCapabilityConfigurationArucoMarkerEXT , অথবা XrSpatialCapabilityConfigurationAprilTagEXT- এর next চেইনে লিঙ্ক করতে হবে।

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

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

যে রানটাইম XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT , XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT , XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT , অথবা XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT সমর্থন করে, তাকে অবশ্যই ঐ ক্যাপাবিলিটিগুলো দ্বারা আবিষ্কৃত সকল এনটিটির নিশ্চিত উপাদান হিসেবে নিম্নলিখিত স্পেশিয়াল উপাদানগুলো সরবরাহ করতে হবে, এবং অবশ্যই সেগুলোকে xrEnumerateSpatialCapabilityComponentTypesEXT -এ তালিকাভুক্ত করতে হবে:

  • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

মার্কার উপাদান

উপাদান ডেটা

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

typedef struct XrSpatialMarkerDataEXT {
    XrSpatialCapabilityEXT    capability;
    uint32_t                  markerId;
    XrSpatialBufferEXT        data;
} XrSpatialMarkerDataEXT;

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

  • capability হলো XrSpatialCapabilityEXT যা মার্কারটি শনাক্ত করেছে।
  • markerId হলো মার্কারের এনকোডেড শনাক্তকারী। ArUco মার্কার এবং AprilTag-এর জন্য এই ফিল্ডটি অবশ্যই বৈধ হতে হবে এবং এনকোডেড আইডি দিয়ে পূরণ করতে হবে। QR কোডের জন্য এই ফিল্ডটি অবশ্যই শূন্য হতে হবে।
  • data হলো মার্কারটিতে থাকা বাফার আইডি এবং অতিরিক্ত তথ্যের ধরণ।

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT এবং XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT অতিরিক্ত ডেটা সমর্থন করে। যদি capability এগুলোর মধ্যে একটি হয় -

  • যদি রানটাইম মার্কারের ডেটা সফলভাবে ডিকোড করে, তবে মার্কারের ডেটার উপর নির্ভর করে এটিকে অবশ্যই data বাফার টাইপটি XR_SPATIAL_BUFFER_TYPE_UINT8_EXT অথবা XR_SPATIAL_BUFFER_TYPE_STRING_EXT এ সেট করতে হবে। রানটাইমকে অবশ্যই data মধ্যে একটি বৈধ বাফার আইডি সেট করতে হবে , যা অ্যাপ্লিকেশনটি ডেটা পাওয়ার জন্য উপযুক্ত xrGetSpatialBuffer* ফাংশনের সাথে ব্যবহার করতে পারবে
  • যদি রানটাইম এখনও মার্কারের ডেটা ডিকোড না করে থাকে, তবে এটিকে অবশ্যই data বাফার আইডি XR_NULL_SPATIAL_BUFFER_ID_EXT এবং বাফার টাইপ XR_SPATIAL_BUFFER_TYPE_UNKNOWN_EXT এ সেট করতে হবে

XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT এবং XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT অতিরিক্ত ডেটা সমর্থন করে না এবং রানটাইমকে অবশ্যই data বাফার আইডি XR_NULL_SPATIAL_BUFFER_ID_EXT- এ সেট করতে হবে।

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

  • XrSpatialMarkerDataEXT ব্যবহার করার আগে XR_EXT_spatial_marker_tracking এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • capability অবশ্যই একটি বৈধ XrSpatialCapabilityEXT মান হতে হবে
  • data অবশ্যই একটি বৈধ XrSpatialBufferEXT কাঠামো হতে হবে।
ডেটা কোয়েরি করার জন্য উপাদান তালিকার কাঠামো

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

typedef struct XrSpatialComponentMarkerListEXT {
    XrStructureType            type;
    void*                      next;
    uint32_t                   markerCount;
    XrSpatialMarkerDataEXT*    markers;
} XrSpatialComponentMarkerListEXT;

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি পয়েন্টার। কোর OpenXR বা এই এক্সটেনশনে এই ধরনের কোনো স্ট্রাকচার সংজ্ঞায়িত করা নেই।
  • markerCount হলো markers মেম্বারের অন্তর্ভুক্ত উপাদানের সংখ্যা।
  • markers হল XrSpatialMarkerDataEXT এর একটি অ্যারে।

অ্যাপ্লিকেশনটি একটি XrSpatialSnapshotEXT- এর মধ্যে থাকা স্পেশিয়াল এনটিটিগুলোর মার্কার কম্পোনেন্ট কোয়েরি করতে পারে, এর জন্য XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_MARKER_EXT যোগ করতে হবে এবং XrSpatialComponentDataQueryResultEXT- এর পরবর্তী পয়েন্টার চেইনে XrSpatialComponentMarkerListEXT যোগ করতে হবে।

যদি XrSpatialComponentMarkerListEXT, XrSpatialComponentDataQueryResultEXT :: next এর পরবর্তী চেইনে থাকে কিন্তু XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT XrSpatialComponentDataQueryConditionEXT :: componentTypes মধ্যে অন্তর্ভুক্ত না থাকে, তাহলে রানটাইমকে অবশ্যই xrQuerySpatialComponentDataEXT থেকে XR_ERROR_VALIDATION_FAILURE রিটার্ন করতে হবে

যদি markerCount XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput থেকে কম হয়, তাহলে রানটাইমকে অবশ্যই xrQuerySpatialComponentDataEXT থেকে XR_ERROR_SIZE_INSUFFICIENT রিটার্ন করতে হবে

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

  • XrSpatialComponentMarkerListEXT ব্যবহার করার আগে XR_EXT_spatial_marker_tracking এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • type অবশ্যই XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT হতে হবে
  • next অবশ্যই NULL অথবা স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি বৈধ পয়েন্টার হতে হবে।
  • markers অবশ্যই markerCount সংখ্যক XrSpatialMarkerDataEXT স্ট্রাকচারের একটি অ্যারের পয়েন্টার হতে হবে।
  • markerCount প্যারামিটারটি অবশ্যই 0 থেকে বড় হতে হবে।
কনফিগারেশন

যদি কোনো ক্যাপাবিলিটির জন্য XrSpatialCapabilityComponentTypesEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_MARKER_EXT এনুমারেট করা থাকে, তাহলে একটি অ্যাপ্লিকেশন সেই কম্পোনেন্টকে সমর্থনকারী ক্যাপাবিলিটির XrSpatialCapabilityConfigurationBaseHeaderEXT ডিরাইভড স্ট্রাকচারের XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents লিস্টে এনুমার‍্যান্টটি অন্তর্ভুক্ত করার মাধ্যমে এটিকে সক্রিয় করতে পারে

এই কম্পোনেন্টটিকে XrSpatialCapabilityConfigurationBaseHeaderEXT :: next চেইনে অন্তর্ভুক্ত করার জন্য কোনো বিশেষ কনফিগারেশনের প্রয়োজন হয় না।

সীমাবদ্ধ 2D উপাদান

বাউন্ডেড ২ডি কম্পোনেন্টটি, যে এনটিটির উপর মার্কারটি অবস্থিত, তার কেন্দ্র এবং বিস্তৃতি প্রদান করে। বাউন্ডেড ২ডি কম্পোনেন্ট সম্পর্কে আরও বিস্তারিত জানতে 'বাউন্ডেড ২ডি' দেখুন।

XrSpatialBounded2DDataEXT :: center অবশ্যই মার্কারের কেন্দ্রকে নির্দেশ করবে। মার্কারের সামনের দিক থেকে দেখলে, X-অক্ষ অবশ্যই ডানদিকে এবং Y-অক্ষ অবশ্যই মার্কারের উপরের দিকে নির্দেশ করবে। রানটাইমকে অবশ্যই ডান-হাতি স্থানাঙ্ক ব্যবস্থা (right-handed coordinate system) অনুসরণ করতে হবে, ফলে Z-অক্ষ মার্কারের সামনের দিক থেকে বেরিয়ে আসবে। এর মানে হলো, {0, 0, 0} অবস্থান, {0, 0, 0, 1} ঘূর্ণন (কোনো ঘূর্ণন নেই) এবং {1, 1} বিস্তৃতি (extent) সহ একটি মার্কার বলতে {0, 0, 0} কেন্দ্রে অবস্থিত একটি ১ মিটার x ১ মিটার মার্কারকে বোঝায়, যার সামনের দিকের নরমাল ভেক্টরটি কম্পোনেন্টের স্পেসে +Z দিকের দিকে নির্দেশ করে।

মার্কারটির অভিমুখের একটি উপস্থাপনা নিচে দেখানো হলো।

এক্সআর এমএল মার্কার অক্ষ বোঝা

চিত্র ২৫। অক্ষসহ কিউআর কোড মার্কার।

পরীক্ষার কোড

নিম্নলিখিত কোডগুলির XY প্লেন অবশ্যই ডকুমেন্টের ভিতরে থাকতে হবে এবং Z-অক্ষ দর্শকের দিকে নির্দেশিত থাকতে হবে। অক্ষের মূলবিন্দু অবশ্যই প্রতিটি মার্কারের কেন্দ্রে থাকতে হবে। X-অক্ষ অবশ্যই ডানদিকে এবং Y-অক্ষ অবশ্যই ডকুমেন্টের উপরের দিকে নির্দেশ করবে।

এক্সট মার্কার ট্র্যাকিং কিউআর

চিত্র ২৬। 'OpenXR' লেখা সহ কিউআর কোড।

এক্সট মার্কার ট্র্যাকিং এপ্রিলট্যাগ

চিত্র ২৭। এপ্রিলট্যাগ XR_SPATIAL_MARKER_APRIL_TAG_DICT_36H11_EXT , আইডি ৪২ সহ।

এক্সট মার্কার ট্র্যাকিং আরুকো

চিত্র ২৮। ArUco মার্কার XR_SPATIAL_MARKER_ARUCO_DICT_5X5_50_EXT , যার আইডি ৪৩।

উদাহরণ কোড

কিউআর কোড ট্র্যাকিং সক্ষমতা কনফিগার করুন

নিম্নলিখিত উদাহরণ কোডটি দেখায় যে কীভাবে একটি স্পেশিয়াল কনটেক্সট তৈরি করার সময় কিউআর কোড ট্র্যাকিং ক্ষমতা কনফিগার করতে হয়।

// Check if marker tracking capability is supported
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_MARKER_TRACKING_QR_CODE_EXT) == capabilities.end()) {
  return;
}

uint32_t featureCount = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> capabilityFeatures(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT, featureCount, &featureCount, capabilityFeatures.data()));

bool supportsFixedMarkerSize = std::find(capabilityFeatures.begin(), capabilityFeatures.end(), XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT) != capabilityFeatures.end();

// Create a spatial context
XrSpatialContextEXT spatialContext{};

// Enable the 2 guaranteed components of the qr code tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT,
};
XrSpatialCapabilityConfigurationQrCodeEXT markerConfiguration{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT};
markerConfiguration.capability = XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT;
markerConfiguration.enabledComponentCount = static_cast<uint32_t>(enabledComponents.size());
markerConfiguration.enabledComponents = enabledComponents.data();

// only chained if features.markerSideLength is true.
XrSpatialMarkerSizeEXT markerSize{XR_TYPE_SPATIAL_MARKER_SIZE_EXT};
markerSize.markerSideLength = 0.10f;
if (supportsFixedMarkerSize) {
  markerConfiguration.next = &markerSize;
}


std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
  reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&markerConfiguration),
};

XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

waitUntilReady(createContextFuture);

XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
  return;
}

spatialContext = completion.spatialContext;

// ...
// Discovery entities with the spatial context
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

স্থানিক সত্তা আবিষ্কার করুন এবং উপাদান ডেটা কোয়েরি করুন

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT দিয়ে কনফিগার করা একটি কনটেক্সটের জন্য স্পেশিয়াল এনটিটিগুলি আবিষ্কার করতে হয় এবং এর কম্পোনেন্ট ডেটা কোয়েরি করতে হয়।

XrFutureEXT future = XR_NULL_FUTURE_EXT;

// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT,
};

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

  waitUntilReady(future);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = localSpace;
  completionInfo.time = time;
  completionInfo.future = future;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {

    // Query for the bounded2D and marker component data
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = snapshotComponents.size();
    queryCond.componentTypes = snapshotComponents.data();

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialBounded2DDataEXT> bounded2D(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded2DListEXT bounded2DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
    bounded2DList.boundCount = bounded2D.size();
    bounded2DList.bounds = bounded2D.data();
    queryResult.next = &bounded2DList;

    std::vector<XrSpatialMarkerDataEXT> markers;
    XrSpatialComponentMarkerListEXT markerList{XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT};
    markers.resize(queryResult.entityIdCountOutput);
    markerList.markerCount = markers.size();
    markerList.markers = markers.data();
    bounded2DList.next = &markerList;

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (entityStates[i] != XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
        continue;
      }

      // 2D bounds for entity entityIds[i] is bounded2D[i].extents centered on bounded2D[i].center.

      if (markers[i].capability == XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT) {
        // Check if marker data has been decoded.
        if (markers[i].data.bufferId != XR_NULL_SPATIAL_BUFFER_ID_EXT) {
          if (markers[i].data.bufferType == XR_SPATIAL_BUFFER_TYPE_STRING_EXT) {
            // Qr Code data can be queried using
            // XrSpatialBufferGetInfoEXT getInfo{XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT};
            // info.bufferId = markers[i].data.bufferId;
            // xrGetSpatialBufferStringEXT(completion.snapshot, &getInfo, ...)
          } else if (markers[i].data.bufferType == XR_SPATIAL_BUFFER_TYPE_UINT8_EXT) {
            // Qr Code data can be queried using
            // XrSpatialBufferGetInfoEXT getInfo{XR_TYPE_SPATIAL_BUFFER_GET_INFO_EXT};
            // info.bufferId = markers[i].data.bufferId;
            // xrGetSpatialBufferUint8(completion.snapshot, &getInfo, ...)
          }
        }
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState;  // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
                  *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for.
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // ...
  // Finish frame loop
  // ...
}

নতুন কাঠামো

নতুন এনাম

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

  • XR_EXT_SPATIAL_MARKER_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_marker_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT- এর সম্প্রসারণ:

    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_APRIL_TAG_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_ARUCO_MARKER_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_MICRO_QR_CODE_EXT
    • XR_SPATIAL_CAPABILITY_MARKER_TRACKING_QR_CODE_EXT
  • XrSpatialCapabilityFeatureEXT- এর সম্প্রসারণ:

    • XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_FIXED_SIZE_MARKERS_EXT
    • XR_SPATIAL_CAPABILITY_FEATURE_MARKER_TRACKING_STATIC_MARKERS_EXT
  • XrSpatialComponentTypeEXT এর সম্প্রসারণ:

    • XR_SPATIAL_COMPONENT_TYPE_MARKER_EXT
  • XrStructureType সম্প্রসারণ :

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_APRIL_TAG_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ARUCO_MARKER_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_MICRO_QR_CODE_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_QR_CODE_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MARKER_LIST_EXT
    • XR_TYPE_SPATIAL_MARKER_SIZE_EXT
    • XR_TYPE_SPATIAL_MARKER_STATIC_OPTIMIZATION_EXT

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

  • সংশোধন 1, 2024-07-29 (রন বেসেমস, মেটা)

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