XR_EXT_spatial_anchor

নামের স্ট্রিং

XR_EXT_spatial_anchor

এক্সটেনশনের ধরন

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

রেজিস্টার করা এক্সটেনশন নম্বর

763

সংশোধন

1

অনুমোদনের স্ট্যাটাস

অনুমোদিত

এক্সটেনশন ও ভার্সন ডিপেন্ডেন্সি

XR_EXT_spatial_entity

কন্ট্রিবিউটর

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

এক নজরে

এই এক্সটেনশন 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 রিটার্ন করতেই হবে।

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

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

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 চেনে থাকে কিন্তু 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-এর থেকে বেশি হতে হবে
কনফিগারেশন

যদি XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT-কে XrSpatialCapabilityComponentTypesEXT :: componentTypes-এ কোনও ক্ষমতার জন্য গণনা করা হয়, তাহলে একটি অ্যাপ্লিকেশন এটি সক্ষম করতে পারে XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents-এ গণনা অন্তর্ভুক্ত করে, যা এই কম্পোনেন্টকে সমর্থন করে এমন ক্ষমতার XrSpatialCapabilityConfigurationBaseHeaderEXT থেকে প্রাপ্ত কাঠামোর তালিকা।

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-এ সেট করা ডিসকভারি ক্রাইটেরিয়ার সাথে মেলে, তাহলে রানটাইমকে xrCreateSpatialDiscoverySnapshotAsyncEXT ব্যবহার করে spatialContext-এর জন্য তৈরি করা স্ন্যাপশটে 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 কম্পোনেন্ট কোয়েরি করা যায়। অ্যাপ্লিকেশনটি XrSpatialComponentAnchorListEXT-কে XrSpatialComponentDataQueryResultEXT :: next-এ যোগ করতে পারে যাতে অ্যাঙ্করের জন্য লেটেস্ট লোকেশন ডেটা ফিরিয়ে আনা যায়।

রানটাইম হয়ত নতুন তৈরি করা অ্যাঙ্করের ট্র্যাকিং স্টেট 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));

নতুন কমান্ড

নতুন স্ট্রাকচার

নতুন Enum কনস্ট্যান্ট

  • 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-এর সাথে ব্যবহার করার জন্য এন্টিটি হ্যান্ডেল প্রদান করে।

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

  • রিভিশন ১, ১০-০৭-২০২৪ (নিহভ জৈন, Google)

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