XR_ANDROID_spatial_entity_bound_anchor

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

XR_ANDROID_spatial_entity_bound_anchor

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

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

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

791

সংশোধন

2

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

অনুমোদিত নয়

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

XR_EXT_spatial_anchor

শেষবার পরিবর্তন করার তারিখ

2025-08-18

IP স্ট্যাটাস

IP সংক্রান্ত কোনও দাবি নেই।

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


YuSheng Chang, Google
Kyle Chen, Google
Nihav Jain, Google
Levana Chen, Google Spencer Quin, Google

এক নজরে

এই এক্সটেনশন অ্যাপ্লিকেশনগুলিকে স্পেশাল এন্টিটিতে অ্যাঙ্কর তৈরি এবং অ্যাটাচ করার অনুমতি দেয়, যেগুলিকে এই এক্সটেনশনে "এন্টিটি-বাউন্ড অ্যাঙ্কর" বলা হয়।

এন্টিটি-বাউন্ড অ্যাঙ্করকে XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT কম্পোনেন্ট ও XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT কম্পোনেন্ট সহ (বা "যেটিতে আছে") স্পেশিয়াল এন্টিটি হিসেবে দেখানো হয়। XR_SPATIAL_COMPONENT_TYPE_PARENT_EXT কম্পোনেন্ট, মূল এন্টিটির XrSpatialEntityIdEXT স্টোর করে যার সাথে অ্যাঙ্কর অ্যাটাচ করা থাকে।

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

রানটাইম সংক্রান্ত সহায়তা

রানটাইমে অন্তত একটি স্পেশিয়াল ট্র্যাকিং এক্সটেনশন থাকতেই হবে, যেমন XR_EXT_spatial_plane_tracking। রানটাইম যদি স্পেশিয়াল এন্টিটি বাউন্ড অ্যাঙ্কর সাপোর্ট করে, তাহলে xrEnumerateSpatialAnchorAttachableComponentsANDROID ফাংশন এনিউমারেট করার মাধ্যমে এটি অবশ্যই কমপক্ষে একটি অ্যাটাচ করা যায় এমন কম্পোনেন্ট প্রদান করবে। অ্যাপ্লিকেশনটি xrEnumerateSpatialAnchorAttachableComponentsANDROID ব্যবহার করে অ্যাটাচ করা যায় এমন কম্পোনেন্টগুলি গণনা করতে পারে।

xrEnumerateSpatialAnchorAttachableComponentsANDROID ফাংশনটি এইভাবে সংজ্ঞায়িত করা হয়েছে:

XrResult xrEnumerateSpatialAnchorAttachableComponentsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    attachableComponentCapacityInput,
    uint32_t*                                   attachableComponentCountOutput,
    XrSpatialComponentTypeEXT*                  attachableComponents);

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

  • instance হল XrInstance-এর হ্যান্ডেল।
  • systemId হল XrSystemId যার স্পেশিয়াল পারসিস্টেন্স স্টোর গণনা করা হবে।
  • attachableComponentCapacityInput হল attachableComponents অ্যারের ক্যাপাসিটি, অথবা প্রয়োজনীয় ক্যাপাসিটি ফিরিয়ে আনার অনুরোধ জানাতে 0।
  • attachableComponentCountOutput হল অ্যাটাচ করা যায় এমন কম্পোনেন্টের সংখ্যা অথবা attachableComponentCapacityInput অপর্যাপ্ত হলে প্রয়োজনীয় ক্যাপাসিটি।
  • attachableComponents হল XrSpatialComponentTypeEXT-এর একটি অ্যারে। attachableComponentCapacityInput ০ হলে এটি NULL হতে পারে।
  • প্রয়োজনীয় attachableComponents সাইজ ফিরিয়ে আনার বিস্তারিত বিবরণের জন্য বাফার সাইজ প্যারামিটার অধ্যায় দেখুন।

ইনস্ট্যান্সের লাইফটাইমের জন্য প্রদত্ত systemId-এর জন্য এই এনিউমারেশন থেকে রানটাইমকে অবশ্যই সবসময় অভিন্ন বাফার কন্টেন্ট রিটার্ন করতে হবে।

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

  • xrEnumerateSpatialAnchorAttachableComponentsANDROID কল করার আগে XR_ANDROID_spatial_entity_bound_anchor এক্সটেনশন অবশ্যই চালু করতে হবে
  • instance অবশ্যই একটি সঠিক XrInstance হ্যান্ডেল হতে হবে
  • attachableComponentCountOutput অবশ্যই uint32_t ভ্যালুর পয়েন্টার হতে হবে
  • attachableComponentCapacityInput যদি 0 না হয়, তাহলে attachableComponents অবশ্যই attachableComponentCapacityInput XrSpatialComponentTypeEXT ভ্যালুর অ্যারের পয়েন্টার হতে হবে

রিটার্ন কোড

হয়ে গেছে

  • XR_SUCCESS

ব্যর্থতা

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

স্পেশিয়াল এন্টিটি-বাউন্ড অ্যাঙ্কর তৈরি করা হচ্ছে

অ্যাঙ্কর তৈরি করতে অ্যাপ্লিকেশন xrCreateSpatialAnchorEXT ফাংশন ব্যবহার করে। কোনও অ্যাপ্লিকেশন যদি স্পেশিয়াল এন্টিটির সাথে অ্যাটাচ করা এন্টিটি-বাউন্ড অ্যাঙ্কর তৈরি করতে চায়, তাহলে xrCreateSpatialAnchorEXT ফাংশন কল করার সময় এটি XrSpatialAnchorCreateInfoEXT স্ট্রাকচারের পরবর্তী পয়েন্টারে XrSpatialAnchorParentANDROID স্ট্রাকচার চেইন করতে পারবে।

XrSpatialAnchorParentANDROID স্ট্রাকচারটি এইভাবে সংজ্ঞায়িত করা হয়েছে:

typedef struct XrSpatialAnchorParentANDROID {
    XrStructureType         type;
    const void*             next;
    XrSpatialEntityIdEXT    parentId;
} XrSpatialAnchorParentANDROID;

মেম্বারদের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • parentId হল সেই এন্টিটির XrSpatialEntityIdEXT যার সাথে অ্যাঙ্কর অ্যাটাচ করা হবে।

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

XrSpatialAnchorParentANDROID ::parentId যদি xrCreateSpatialAnchorEXT :: spatialContext-এর জন্য সঠিক আইডি না হয়, তাহলে রানটাইমকে xrCreateSpatialAnchorEXT থেকে XR_ERROR_SPATIAL_ENTITY_ID_INVALID_EXT রিটার্ন করতেই হবে।

xrEnumerateSpatialAnchorAttachableComponentsANDROID-এর মাধ্যমে গণনা করা কোনও কম্পোনেন্ট পেরেন্ট এন্টিটিতে না থাকলে, রানটাইমকে xrCreateSpatialAnchorEXT থেকে XR_ERROR_SPATIAL_ANCHOR_ATTACHABLE_COMPONENT_NOT_FOUND_ANDROID রিটার্ন করতেই হবে।

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

উদাহরণ কোড

স্পেশিয়াল এন্টিটি-বাউন্ড অ্যাঙ্কর তৈরি করুন

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

XrFutureEXT future {XR_NULL_FUTURE_EXT};

std::vector<XrSpatialEntityEXT> entityBoundAnchorEntities;

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

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

  waitUntilReady(future);

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

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

    XrSpatialComponentDataQueryConditionEXT queryCond{
      .type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT,
      .componentTypeCount = static_cast<uint32_t>(snapshotComponents.size()),
      .componentTypes = snapshotComponents.data(),
    };

    XrSpatialComponentDataQueryResultEXT queryResult{
      .type = 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{
      .type = XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT,
      .boundCount = static_cast<uint32_t>(bounded2D.size()),
      .bounds = bounded2D.data(),
    };
    queryResult.next = &bounded2DList;

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

    entityBoundAnchorEntities.reserve(queryResult.entityIdCountOutput);

    // Create anchors attached to the plane entities
    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (entityStates[i] != XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
        continue;
      }

      // Parent ID info the chained to spatial anchor create info next
      XrSpatialAnchorParentANDROID parentIdCreateInfo{
        .type = XR_TYPE_SPATIAL_ANCHOR_PARENT_ANDROID,
        .parentId = entityIds[i],
      };

      // spatial anchor create info
      XrSpatialAnchorCreateInfoEXT createInfo{
        .type = XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT,
        // assign Parent ID to anchor create info next, and the pose to the bounded2D center
        .next = &parentIdCreateInfo,
        .baseSpace = localSpace,
        .time = time,
        .pose = bounded2D[i].center,
      };

      XrSpatialEntityIdEXT entityBoundAnchorEntityId {XR_NULL_SPATIAL_ENTITY_ID_EXT};
      XrSpatialEntityEXT entityBoundAnchorEntity {XR_NULL_HANDLE};
      CHK_XR(xrCreateSpatialAnchorEXT(spatialContext, &createInfo, &entityBoundAnchorEntityId, &entityBoundAnchorEntity));

      entityBoundAnchorEntities.push_back(entityBoundAnchorEntity);
    }

    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 = {
    .type = XR_TYPE_EVENT_DATA_BUFFER,
  };
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      if (event.type == 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
  // ...
}

এন্টিটি-বাউন্ড অ্যাঙ্কর পোজ ও পেরেন্ট এন্টিটি আইডি পান

নিম্নলিখিত উদাহরণ কোডটি দেখায় যে কীভাবে একটি এন্টিটি-বাউন্ড অ্যাঙ্করের পোজ এবং এর পেরেন্ট এন্টিটির আইডি পাওয়া যায়।

std::vector<XrSpatialEntityEXT> entities;

auto updateEntityBoundAnchorInfo = [&](XrSpatialContextEXT spatialContext, XrTime time) {
    // We want to get updated data for all components of the entities, so skip specifying componentTypes.
    XrSpatialUpdateSnapshotCreateInfoEXT snapshotCreateInfo{
      .type = XR_TYPE_SPATIAL_UPDATE_SNAPSHOT_CREATE_INFO_EXT,
      .entityCount = static_cast<uint32_t>(entities.size()),
      .entities = entities.data(),
      .baseSpace = localSpace,
      .time = time,
    };

    XrSpatialSnapshotEXT snapshot {XR_NULL_HANDLE};
    CHK_XR(xrCreateSpatialUpdateSnapshotEXT(spatialContext, &snapshotCreateInfo, &snapshot));

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

    XrSpatialComponentDataQueryResultEXT queryResult{
      .type = 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{
      .type = XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT,
      .locationCount = static_cast<uint32_t>(locations.size()),
      .locations = locations.data(),
    };
    queryResult.next = &locationList;

    // query for the parent entity ID data
    std::vector<XrSpatialEntityIdEXT> parentIds(queryResult.entityIdCountOutput);
    XrSpatialComponentParentListEXT parentList{
      .type = XR_TYPE_SPATIAL_COMPONENT_PARENT_LIST_EXT,
      .parentCount = static_cast<uint32_t>(parentIds.size()),
      .parents = parentIds.data(),
    };
    queryResult.next = &parentList;

    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].
        // Parent entity ID for entity entityIds[i] is parentIds[i].
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(snapshot));
};

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

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

  updateEntityBoundAnchorInfo(spatialContext, time);

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

অ্যাটাচ করা যায় এমন কম্পোনেন্ট গণনা করুন এবং এন্টিটি বাউন্ড অ্যাঙ্কর ক্ষমতা চেক করুন

নিচে দেওয়া কোডের উদাহরণ থেকে বোঝা যায় যে কীভাবে অ্যাটাচ করা যায় এমন কম্পোনেন্ট এনুমারেট করতে হয় এবং রানটাইম এন্টিটি বাউন্ড অ্যাঙ্কর ক্ষমতাকে সাপোর্ট করে কিনা তা চেক করতে হয়।

// Check spatial capability
uint32_t capabilityCount = 0;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));

// Check if anchor capability is supported
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_ANCHOR_EXT) == capabilities.end()) {
  return;
}

// Check if plane tracking capability is supported
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
  return;
}

// The supported spatial tracking components
std::vector<XrSpatialComponentTypeEXT> spatialTrackingCapabilityComponents;

// Enumerate supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT planeComponents{
  .type = XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT,
};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
std::vector<XrSpatialComponentTypeEXT> planeCapabilityComponents(planeComponents.componentTypeCountOutput);
planeComponents.componentTypes = planeCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));

// Add plane supported components to spatial tracking supported components
spatialTrackingCapabilityComponents.insert(spatialTrackingCapabilityComponents.end(), planeCapabilityComponents.begin(), planeCapabilityComponents.end());

// Enumerate supported attachable components for anchor
uint32_t attachableComponentCount = 0;
CHK_XR(xrEnumerateSpatialAnchorAttachableComponentsANDROID(instance, systemId, 0, &attachableComponentCount, nullptr));
std::vector<XrSpatialComponentTypeEXT> attachableComponents(attachableComponentCount);
CHK_XR(xrEnumerateSpatialAnchorAttachableComponentsANDROID(instance, systemId, attachableComponentCount, &attachableComponentCount, attachableComponents.data()));

// Check if at least one spatial tracking component is supported
const auto supportsComponent = [&spatialTrackingCapabilityComponents](XrSpatialComponentTypeEXT component) {
  return std::find(spatialTrackingCapabilityComponents.begin(), spatialTrackingCapabilityComponents.end(), component) != spatialTrackingCapabilityComponents.end();
};

bool atLeastOneComponentSupported = false;
for (int32_t i = 0; i < attachableComponentCount; ++i) {
  if(supportsComponent(attachableComponents[i])) {
    atLeastOneComponentSupported = true;
    break;
  }
}

// No spatial tracking component supported for anchor attachment
if(!atLeastOneComponentSupported) return;

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

নতুন কমান্ড

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

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

  • XR_ANDROID_SPATIAL_ENTITY_BOUND_ANCHOR_EXTENSION_NAME
  • XR_ANDROID_spatial_entity_bound_anchor_SPEC_VERSION
  • XrResult এক্সটেন্ড করা হচ্ছে :

    • XR_ERROR_SPATIAL_ANCHOR_ATTACHABLE_COMPONENT_NOT_FOUND_ANDROID
  • XrStructureType এক্সটেন্ড করা হচ্ছে :

    • XR_TYPE_SPATIAL_ANCHOR_PARENT_ANDROID

ইস্যু

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

  • সংশোধন ১, ১৮-০৮-২০২৫ (YuSheng Chang)

    • এক্সটেনশনের প্রাথমিক বিবরণ।
  • সংশোধন ২, ১৬-১২-২০২৫ (কাইল চেন)

    • API-এর নির্দিষ্ট কিছু আচরণের জন্য আরও নির্দেশমূলক ভাষা যোগ করুন।
    • xrEnumerateSpatialAnchorAttachableComponentsANDROID-এর উদাহরণ কোড যোগ করুন।