XR_EXT_spatial_anchor

নাম স্ট্রিং

XR_EXT_spatial_anchor

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

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

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

৭৬৩

সংশোধন

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

অনুমোদিত

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

XR_EXT_spatial_entity

অবদানকারীরা

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

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

এই এক্সটেনশনটি XR_EXT_spatial_entity উপর ভিত্তি করে তৈরি এবং অ্যাপ্লিকেশনগুলিকে স্পেশিয়াল অ্যাঙ্কর তৈরি করার সুযোগ দেয়। এই অ্যাঙ্করগুলি হলো ব্যবহারকারীর বাস্তব পরিবেশের যেকোনো বিন্দু, যা পরবর্তীতে রানটাইম দ্বারা ট্র্যাক করা হবে। এরপর রানটাইমটি অন্য সমস্ত স্পেস ও অ্যাঙ্কর থেকে স্বাধীনভাবে, প্রয়োজন অনুযায়ী সময়ের সাথে সাথে অ্যাঙ্করের মূলবিন্দুর অবস্থান ও অভিমুখ সামঞ্জস্য করবে , যাতে এটি বাস্তব জগতের সাথে তার মূল ম্যাপিং বজায় রাখে।

একটি অ্যাঙ্কর যা XrSpatialContextEXT-এর মধ্যে একটি নির্দিষ্ট অবস্থান এবং অভিমুখ অনুসরণ করে, তাকে XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT কম্পোনেন্টযুক্ত (বা "যেটি ধারণ করে") একটি স্পেশিয়াল এনটিটি হিসাবে উপস্থাপন করা হয়।

অ্যাঙ্কর ব্যবহারের সুবিধা

একটি XrSpatialContextEXT- এর জীবনকাল জুড়ে ব্যবহারকারীর ভৌত পরিবেশ সম্পর্কে রানটাইমের ধারণা আপডেট হওয়ার সাথে সাথে, ভার্চুয়াল অবজেক্টগুলো অ্যাপ্লিকেশন দ্বারা স্থাপিত স্থান থেকে সরে যেতে পারে , যা অ্যাপ্লিকেশনটির বাস্তবতা এবং ব্যবহারকারীর অভিজ্ঞতার গুণমানকে প্রভাবিত করে। একটি ভার্চুয়াল অবজেক্ট যেখানে স্থাপন করা হয় তার কাছাকাছি একটি অ্যাঙ্কর তৈরি করে এবং তারপর সর্বদা সেই ভার্চুয়াল অবজেক্টটিকে তার অ্যাঙ্করের সাপেক্ষে রেন্ডার করার মাধ্যমে, একটি অ্যাপ্লিকেশন নিশ্চিত করতে পারে যে প্রতিটি ভার্চুয়াল অবজেক্ট ভৌত পরিবেশে একই অবস্থান এবং অভিমুখে স্থির থাকবে। এছাড়াও, নির্দিষ্ট কিছু রেফারেন্স স্পেসের মতো নয়, অ্যাঙ্করগুলো সিস্টেম-স্তরের রিসেন্টারিং দ্বারা প্রভাবিত হয় না।

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

যদি রানটাইম স্পেশিয়াল অ্যাঙ্কর সমর্থন করে, তবে তাকে অবশ্যই xrEnumerateSpatialCapabilitiesEXT-XR_SPATIAL_CAPABILITY_ANCHOR_EXT গণনা করার মাধ্যমে এটি নির্দেশ করতে হবে।

কনফিগারেশন

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

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

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • capability হল একটি XrSpatialCapabilityEXT
  • enabledComponentCount হলো একটি uint32_t যা enabledComponents অ্যারের উপাদান সংখ্যা নির্দেশ করে।
  • enabledComponents হলো XrSpatialComponentTypeEXT- এর একটি অ্যারের পয়েন্টার।

অ্যাপ্লিকেশনগুলি XrSpatialContextCreateInfoEXT :: capabilityConfigs -এ একটি XrSpatialCapabilityConfigurationAnchorEXT স্ট্রাকচারের পয়েন্টার অন্তর্ভুক্ত করার মাধ্যমে XR_SPATIAL_CAPABILITY_ANCHOR_EXT স্পেশিয়াল ক্যাপাবিলিটি সক্রিয় করতে পারে

যদি capability XR_SPATIAL_CAPABILITY_ANCHOR_EXT না হয়, তাহলে রানটাইমকে অবশ্যই XR_ERROR_VALIDATION_FAILURE রিটার্ন করতে হবে।

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

  • XrSpatialCapabilityConfigurationAnchorEXT ব্যবহার করার আগে XR_EXT_spatial_anchor এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • type অবশ্যই XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT হতে হবে
  • next অবশ্যই NULL অথবা স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি বৈধ পয়েন্টার হতে হবে।
  • capability অবশ্যই একটি বৈধ XrSpatialCapabilityEXT মান হতে হবে
  • enabledComponents অবশ্যই enabledComponentCount সংখ্যক বৈধ XrSpatialComponentTypeEXT মানের একটি অ্যারের পয়েন্টার হতে হবে।
  • enabledComponentCount প্যারামিটারটি অবশ্যই 0 থেকে বড় হতে হবে।

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

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

  • XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT

অ্যাঙ্কর উপাদান

উপাদান ডেটা

XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT তার ডেটার জন্য XrPosef ব্যবহার করে, যা অ্যাঙ্করের অবস্থান এবং অভিমুখ প্রদান করে।

ডেটা কোয়েরি করার জন্য উপাদান তালিকার কাঠামো

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

typedef struct XrSpatialComponentAnchorListEXT {
    XrStructureType    type;
    void*              next;
    uint32_t           locationCount;
    XrPosef*           locations;
} XrSpatialComponentAnchorListEXT;

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • locationCount হলো একটি uint32_t যা locations অ্যারের উপাদান সংখ্যা বর্ণনা করে।
  • locations হলো XrPosef- এর একটি অ্যারে।

যদি XrSpatialComponentAnchorListEXT, XrSpatialComponentDataQueryResultEXT :: next chain-এর মধ্যে থাকে কিন্তু XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT XrSpatialComponentDataQueryConditionEXT :: componentTypes মধ্যে অন্তর্ভুক্ত না থাকে, তাহলে রানটাইমকে অবশ্যই xrQuerySpatialComponentDataEXT থেকে XR_ERROR_VALIDATION_FAILURE রিটার্ন করতে হবে

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

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

  • XrSpatialComponentAnchorListEXT ব্যবহার করার আগে XR_EXT_spatial_anchor এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • type অবশ্যই XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT হতে হবে
  • next অবশ্যই NULL অথবা স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি বৈধ পয়েন্টার হতে হবে।
  • locations অবশ্যই locationCount সংখ্যক XrPosef স্ট্রাকচারের একটি অ্যারের পয়েন্টার হতে হবে।
  • locationCount প্যারামিটারটি অবশ্যই 0 থেকে বড় হতে হবে।
কনফিগারেশন

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

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

স্থানিক অ্যাঙ্কর তৈরি করা

xrCreateSpatialAnchorEXT ফাংশনটি নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:

XrResult xrCreateSpatialAnchorEXT(
    XrSpatialContextEXT                         spatialContext,
    const XrSpatialAnchorCreateInfoEXT*         createInfo,
    XrSpatialEntityIdEXT*                       anchorEntityId,
    XrSpatialEntityEXT*                         anchorEntity);

প্যারামিটার বিবরণ

  • spatialContext হলো একটি XrSpatialContextEXT যা পূর্বে xrCreateSpatialContextAsyncEXT ব্যবহার করে তৈরি করা হয়েছে।
  • createInfo হলো XrSpatialAnchorCreateInfoEXT- এর একটি পয়েন্টার।
  • anchorEntityId হলো একটি XrSpatialEntityIdEXT এর দিকে নির্দেশকারী একটি পয়েন্টার, যেখানে অ্যাঙ্কর এনটিটির আইডি ফেরত দেওয়া হয়।
  • anchorEntity হলো একটি XrSpatialEntityEXT- এর দিকে নির্দেশকারী একটি পয়েন্টার, যেখানে অ্যাঙ্কর এনটিটির হ্যান্ডেলটি ফেরত দেওয়া হয়।

অ্যাপ্লিকেশনটি xrCreateSpatialAnchorEXT ব্যবহার করে একটি স্পেশিয়াল অ্যাঙ্কর তৈরি করতে পারে

কোনো অ্যাঙ্করের জন্য হালনাগাদ কম্পোনেন্ট ডেটা পেতে, একটি স্ন্যাপশট তৈরি করার সময় anchorEntity তে থাকা মানটি XrSpatialUpdateSnapshotCreateInfoEXT :: entities এর মধ্যে পাস করুন। xrQuerySpatialComponentDataEXT ব্যবহার করার সময়, অ্যাপ্লিকেশনটি XrSpatialComponentDataQueryResultEXT :: entityIds অ্যারেতে এই অ্যাঙ্করটিকে অনন্যভাবে শনাক্ত করতে anchorEntityId ব্যবহার করতে পারে

যদি spatialContext এর জন্য XR_SPATIAL_CAPABILITY_ANCHOR_EXT কনফিগার করা না থাকে, তাহলে রানটাইমকে অবশ্যই xrCreateSpatialAnchorEXT থেকে XR_ERROR_VALIDATION_FAILURE রিটার্ন করতে হবে। XR_SPATIAL_CAPABILITY_ANCHOR_EXT ক্যাপাবিলিটির জন্য কীভাবে একটি XrSpatialContextEXT কনফিগার করতে হয়, তা জানতে কনফিগারেশন দেখুন।

anchorEntity দ্বারা উপস্থাপিত অ্যাঙ্করটি শুধুমাত্র spatialContext এর জীবনকাল পর্যন্ত, অথবা অ্যাপ্লিকেশনটি এর উপর xrDestroySpatialEntityEXT কল না করা পর্যন্ত বৈধ থাকে, দুটির মধ্যে যেটি আগে ঘটে। অন্যান্য এক্সটেনশনগুলো এই নতুন তৈরি অ্যাঙ্করটিকে একাধিক XrSession জুড়ে স্থায়ী করার জন্য অথবা প্রসেস সীমানা পেরিয়ে অন্যান্য অ্যাপ্লিকেশনের সাথে শেয়ার করার জন্য ফাংশন সরবরাহ করতে পারে

একটি নতুন তৈরি করা অ্যাঙ্কর, ধ্বংস না হওয়া পর্যন্ত, অবশ্যই তার প্যারেন্ট স্পেশিয়াল কনটেক্সটে ডিসকভারেবল বা আবিষ্কারযোগ্য হতে হবে। এর মানে হলো, যদি অ্যাঙ্করটি XrSpatialDiscoverySnapshotCreateInfoEXT- এ সেট করা ডিসকভারি ক্রাইটেরিয়ার সাথে মেলে, তাহলে রানটাইমকে অবশ্যই spatialContext জন্য xrCreateSpatialDiscoverySnapshotAsyncEXT ব্যবহার করে তৈরি করা স্ন্যাপশটে anchorEntityId অন্তর্ভুক্ত করতে হবে। নতুন তৈরি করা অ্যাঙ্করটি XR_SPATIAL_CAPABILITY_ANCHOR_EXT দিয়ে কনফিগার করা অন্যান্য স্পেশিয়াল কনটেক্সটেও ডিসকভারেবল হতে পারে , যদিও সেক্ষেত্রে XrSpatialEntityIdEXT ভিন্ন হবে, কারণ একটি নির্দিষ্ট XrSpatialEntityIdEXT তার XrSpatialContextEXT-এর জন্য অনন্য।

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

  • xrCreateSpatialAnchorEXT কল করার আগে XR_EXT_spatial_anchor এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • spatialContext অবশ্যই একটি বৈধ XrSpatialContextEXT হ্যান্ডেল হতে হবে।
  • createInfo অবশ্যই একটি বৈধ XrSpatialAnchorCreateInfoEXT স্ট্রাকচারের পয়েন্টার হতে হবে।
  • anchorEntityId অবশ্যই একটি XrSpatialEntityIdEXT মানের দিকে নির্দেশকারী একটি পয়েন্টার হতে হবে।
  • anchorEntity অবশ্যই একটি XrSpatialEntityEXT হ্যান্ডেলের দিকে নির্দেশকারী একটি পয়েন্টার হতে হবে।

রিটার্ন কোড

সাফল্য

  • 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_POSE_INVALID
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_SPATIAL_ANCHOR_ATTACHABLE_COMPONENT_NOT_FOUND_ANDROID (যদি XR_ANDROID_spatial_entity_bound_anchor সক্রিয় থাকে)
  • XR_ERROR_SPATIAL_ENTITY_ID_INVALID_EXT (যদি XR_ANDROID_spatial_entity_bound_anchor সক্রিয় থাকে)

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

typedef struct XrSpatialAnchorCreateInfoEXT {
    XrStructureType    type;
    const void*        next;
    XrSpace            baseSpace;
    XrTime             time;
    XrPosef            pose;
} XrSpatialAnchorCreateInfoEXT;

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

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • baseSpace হলো সেই XrSpace যেখানে pose প্রয়োগ করা হয়।
  • time হলো সেই XrTime যেখানে baseSpace অবস্থিত (এবং pose প্রয়োগ করা হয়)।
  • pose হলো অ্যাঙ্কর এনটিটির অবস্থান।

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

কোয়েরি অ্যাঙ্কর পোজ

অ্যাঙ্করটি তৈরি হওয়ার পরে, রানটাইমকে সময়ের সাথে সাথে অন্যান্য স্পেসের সাপেক্ষে এর অবস্থান এবং অভিমুখ সামঞ্জস্য করতে হবে , যাতে এর মূল বাস্তব-জগতের অবস্থানের সাথে সর্বোত্তম সম্ভাব্য সারিবদ্ধতা বজায় থাকে; এমনকি যদি এর ফলে অ্যাঙ্করটিকে ইনিশিয়ালাইজ করতে ব্যবহৃত মূল XrSpatialAnchorCreateInfoEXT :: baseSpace এর সাথে এর সম্পর্ক পরিবর্তিতও হয়ে যায়।

অ্যাপ্লিকেশনটি অ্যাঙ্করের XrSpatialEntityEXT- এর সাথে xrCreateSpatialUpdateSnapshotEXT ব্যবহার করে একটি নতুন XrSpatialSnapshotEXT তৈরি করতে পারে এবং তারপর xrQuerySpatialComponentDataEXT ব্যবহার করে সেই স্ন্যাপশট থেকে XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT কম্পোনেন্টটি কোয়েরি করতে পারে। অ্যাঙ্করগুলির জন্য সর্বশেষ অবস্থানের ডেটা পুনরুদ্ধার করতে অ্যাপ্লিকেশনটি XrSpatialComponentDataQueryResultEXT :: nextXrSpatialComponentAnchorListEXT যোগ করতে পারে

রানটাইম একটি নতুন তৈরি অ্যাঙ্করের ট্র্যাকিং স্টেট XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT এ সেট করতে পারে । অ্যাপ্লিকেশনটিকে অবশ্যই শুধুমাত্র XrSpatialComponentDataQueryResultEXT :: entityStates এ প্রদত্ত অ্যাঙ্কর এনটিটির স্টেট এবং এনটিটির অ্যাঙ্কর কম্পোনেন্ট ডেটা পড়তে হবে, যদি ট্র্যাকিং স্টেটটি XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT হয়।

অ্যাঙ্কর ব্যবহারের নির্দেশিকা

  • প্রতিটি অ্যাঙ্করের ভঙ্গি অন্য কোনো অ্যাঙ্কর বা স্পেস থেকে স্বাধীনভাবে সামঞ্জস্য হয়। আলাদাভাবে অ্যাঙ্কর করা ভার্চুয়াল অবজেক্টগুলো একে অপরের সাপেক্ষে সরে যেতে বা ঘুরতে পারে , যা স্থানিক ক্রমবিন্যাসকে ভেঙে দেয়, বিশেষত যখন এই ভার্চুয়াল অবজেক্টগুলোর একে অপরের সাপেক্ষে স্থির থাকার কথা। এই ধরনের ক্ষেত্রে, অ্যাপ্লিকেশনটির উচিত সেই সমস্ত ভার্চুয়াল অবজেক্টের জন্য একই অ্যাঙ্কর পুনরায় ব্যবহার করা, যেগুলো একে অপরের সাপেক্ষে নড়াচড়া করে না।
  • যেসব অ্যাঙ্কর আর ব্যবহৃত হচ্ছে না, অ্যাপ্লিকেশনটির উচিত সেগুলোর জন্য থাকা XrSpatialEntityEXT হ্যান্ডেলগুলো ধ্বংস করে দেওয়া, যাতে রানটাইম ঐ অ্যাঙ্করগুলোকে ট্র্যাক করার জন্য ব্যবহৃত রিসোর্সগুলো মুক্ত করতে পারে

উদাহরণ কোড

অ্যাঙ্কর ক্ষমতা কনফিগার করুন

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

// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{

  std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
    XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
  };

  XrSpatialCapabilityConfigurationAnchorEXT anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
  anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
  anchorConfig.enabledComponentCount = enabledComponents.size();
  anchorConfig.enabledComponents = enabledComponents.data();

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

  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;
}

// ...
// Create spatial anchors and get their latest pose in the frame loop.
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

স্পেশাল অ্যাঙ্কর তৈরি করুন এবং এর অবস্থান জানুন

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি স্পেশিয়াল অ্যাঙ্কর তৈরি করতে হয় এবং প্রতি ফ্রেমে এর পোজ পাওয়া যায়।

XrSpatialAnchorCreateInfoEXT createInfo{XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT};
createInfo.baseSpace = localSpace;
createInfo.time = predictedDisplayTime;
createInfo.pose = {{0, 0, 0, 1}, {1, 1, 1}};

XrSpatialEntityIdEXT spatialAnchorEntityId;
XrSpatialEntityEXT spatialAnchorEntity;
CHK_XR(xrCreateSpatialAnchorEXT(spatialContext, &createInfo, &spatialAnchorEntityId, &spatialAnchorEntity));

auto updateAnchorLocation = [&](XrTime time) {
  // We want to get updated data for all components of the entities, so skip specifying componentTypes.
  XrSpatialUpdateSnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_UPDATE_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.entityCount = 1;
  snapshotCreateInfo.entities = &spatialAnchorEntity;
  snapshotCreateInfo.baseSpace = localSpace;
  snapshotCreateInfo.time = time;

  XrSpatialSnapshotEXT snapshot;
  CHK_XR(xrCreateSpatialUpdateSnapshotEXT(spatialContext, &snapshotCreateInfo, &snapshot));

  // Query for the entities that have the anchor component on them.
  std::array<XrSpatialComponentTypeEXT, 1> componentsToQuery {XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT};
  XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
  queryCond.componentTypeCount = componentsToQuery.size();
  queryCond.componentTypes = componentsToQuery.data();

  XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
  CHK_XR(xrQuerySpatialComponentDataEXT(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();

  // query for the pose data
  std::vector<XrPosef> locations(queryResult.entityIdCountOutput);
  XrSpatialComponentAnchorListEXT locationList{XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT};
  locationList.locationCount = locations.size();
  locationList.locations = locations.data();
  queryResult.next = &locationList;

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

  for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
    if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
      // Pose for entity entityIds[i] is locations[i].
    }
  }

  CHK_XR(xrDestroySpatialSnapshotEXT(snapshot));
};


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

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

  updateAnchorLocation(time);

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

CHK_XR(xrDestroySpatialEntityEXT(spatialAnchorEntity));

নতুন কমান্ড

নতুন কাঠামো

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

  • XR_EXT_SPATIAL_ANCHOR_EXTENSION_NAME
  • XR_EXT_spatial_anchor_SPEC_VERSION
  • XrSpatialCapabilityEXT- এর সম্প্রসারণ:

    • XR_SPATIAL_CAPABILITY_ANCHOR_EXT
  • XrSpatialComponentTypeEXT এর সম্প্রসারণ:

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

    • XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT
    • XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT

সমস্যা

  • xrCreateSpatialAnchorEXT কেন একটি এনটিটি আইডি এবং একটি এনটিটি হ্যান্ডেল উভয়ই আউটপুট করে?

    • সমাধান করা হয়েছে
    • উত্তর: xrCreateSpatialAnchorEXT ফাংশনটি আউটপুট হিসেবে শুধুমাত্র এনটিটি আইডি প্রদান করতে পারত এবং অ্যাপ্লিকেশনগুলো xrCreateSpatialEntityFromIdEXT ব্যবহার করে সেই আইডির জন্য একটি এনটিটি হ্যান্ডেল তৈরি করতে পারত। তবে, অ্যাঙ্করের সাধারণ ব্যবহারে অ্যাপ্লিকেশনগুলো প্রতি ফ্রেমে অ্যাঙ্কর পোজ কোয়েরি করে, তাই এটি "আপডেট স্ন্যাপশট"-এ ব্যবহারের জন্য একটি উপযুক্ত প্রার্থী হয়ে ওঠে, যার জন্য ইনপুট হিসেবে এনটিটি হ্যান্ডেলের প্রয়োজন হয়। এই সাধারণ ব্যবহারের কথা মাথায় রেখে, xrCreateSpatialAnchorEXT অ্যাপ্লিকেশনটির পক্ষ থেকে xrCreateSpatialEntityFromIdEXT সম্পাদন করে এবং xrCreateSpatialUpdateSnapshotEXT-এর সাথে ব্যবহারের জন্য অ্যাপ্লিকেশনটিকে এনটিটি হ্যান্ডেল সরবরাহ করে।

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

  • সংস্করণ ১, ২০২৪-০৭-১০ (নিহাব জৈন, গুগল)

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