XR_ANDROID_spatial_component_subsumed_by
رشته نام
XR_ANDROID_spatial_component_subsumed_by
نوع افزونه
افزونه نمونه
شماره داخلی ثبتشده
792
بازبینی
1
وضعیت تصویب
تصویبنشده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_entity
و
XR_EXT_spatial_plane_tracking
تاریخ آخرین تغییر
2025-08-19
وضعیت IP
هیچ ادعای مالکیت فکری شناختهشدهای وجود ندارد.
همیاران
Brian Chen، Google
Kyle Chen، Google
Levana Chen، Google
Nihav Jain، Google
Spencer Quin، Google
نمای کلی
این افزونه براساس XR_EXT_spatial_entity ساخته شده است و مؤلفه جدیدی برای XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ارائه میدهد تا XrSpatialEntityIdEXT را که نهاد فعلی را دربرمیگیرد نمایش دهد.
وقتی زمان اجرا اطلاعات محیطی کافی برای تشخیص اینکه ۲ صفحه ردیابیشده درواقع یکسان هستند بهدست آورد، مؤلفه XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID با شناسه یکی از صفحهها به دیگری متصل میشود. از آن به بعد، برنامه فقط باید موجودیتی را پردازش کند که مؤلفه XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID را ندارد.
این افزونه همچنین فیلتر جدیدی را معرفی میکند که برنامه میتواند آن را به XrSpatialDiscoverySnapshotCreateInfoEXT زنجیر کند تا هر نهادی را که مؤلفه XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID دارد فیلتر کند.
اجازهها
برنامههای Android باید اجازه android.permission.SCENE_UNDERSTANDING_COARSE را در مانیفست خود فهرست کنند زیرا این افزونه سطوح را در محیط ردیابی میکند. اجازه android.permission.SCENE_UNDERSTANDING_COARSE یک اجازه خطرناک محسوب میشود.
(سطح محافظت: خطرناک)
پشتیبانی زمان اجرا
اگر زمان اجرا قادر به ادغام یک صفحه در صفحه دیگر باشد، باید این موضوع را با شمارش XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID بهعنوان یک مؤلفه پشتیبانیشده برای قابلیت XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT در xrEnumerateSpatialCapabilityComponentTypesEXT نشان دهد.
همه دادههای مؤلفه نهاد پیوستشده XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID باید با نهادی که آن را دربرمیگیرد یکسان باشد.
Subsumed By Component
دادههای مؤلفه
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID از ساختار XrSpatialEntityIdEXT برای دادههایش استفاده میکند که نشاندهنده شناسه نهاد دربرگیرنده است.
ساختار فهرست مؤلفه برای پُرسمان دادهها
ساختار XrSpatialComponentSubsumedByListANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialComponentSubsumedByListANDROID {
XrStructureType type;
void* next;
uint32_t subsumedUniqueIdCount;
XrSpatialEntityIdEXT* subsumedUniqueIds;
} XrSpatialComponentSubsumedByListANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. subsumedUniqueIdCountیکuint32_tاست که تعداد عناصر را در آرایهsubsumedUniqueIdsتوصیف میکند.-
subsumedUniqueIdsآرایهای ازXrSpatialEntityIdEXTاست.
برنامه میتواند با افزودن XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID به زنجیره بعدی XrSpatialComponentDataQueryResultEXT، مؤلفه XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID نهادهای فضایی را در XrSpatialSnapshotEXT جستجو کند.
اگر XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID در زنجیره بعدی XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.
اگر subsumedUniqueIdCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_component_subsumed_byباید قبلاز استفاده از XrSpatialComponentSubsumedByListANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
subsumedUniqueIdsباید اشارهگری به آرایهای از مقادیرsubsumedUniqueIdCountXrSpatialEntityIdEXTباشد - پارامتر
subsumedUniqueIdCountباید بزرگتر از0باشد
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID در XrSpatialCapabilityComponentTypesEXT :: componentTypes برای قابلیت XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT شمارش شده باشد، برنامه میتواند آن را با گنجاندن enum در فهرست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents از ساختار مشتقشده XrSpatialCapabilityConfigurationBaseHeaderEXT از قابلیتی که از این مؤلفه پشتیبانی میکند، فعال کند.
فیلتر کردن نهادهای زیرمجموعه
ساختار XrSpatialDiscoveryUniqueEntitiesFilterANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialDiscoveryUniqueEntitiesFilterANDROID {
XrStructureType type;
const void* next;
} XrSpatialDiscoveryUniqueEntitiesFilterANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است.
برنامه میتواند XrSpatialDiscoveryUniqueEntitiesFilterANDROID را در زنجیره next از XrSpatialDiscoverySnapshotCreateInfoEXT اضافه کند تا عکس آنی با نهادهایی دریافت کند که تحت نهاد دیگری قرار ندارند.
اگر برنامهها XrSpatialDiscoveryUniqueEntitiesFilterANDROID را به XrSpatialDiscoverySnapshotCreateInfoEXT زنجیر کنند و درعینحال مؤلفه XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID را در XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes اضافه کنند، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
اگر برنامه XrSpatialDiscoveryUniqueEntitiesFilterANDROID را به XrSpatialDiscoverySnapshotCreateInfoEXT زنجیر کند اما هیچ مؤلفهای را در XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes فهرست نکند، زمان اجرا باید همه موجودیتهای فضایی را در عکس آنی که دارای مجموعه مؤلفههای فهرستشده در XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents برای قابلیتهای پیکربندیشده برای spatialContext هستند، بهجز موجودیتهایی که مؤلفه XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID را دارند، لحاظ کند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_component_subsumed_byباید قبلاز استفاده از XrSpatialDiscoveryUniqueEntitiesFilterANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد
کد نمونه
پیکربندی قابلیت ردیابی هواپیما
کد نمونه زیر نحوه ایجاد بافت فضایی با قابلیت XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT را نشان میدهد که از XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID پشتیبانی میکند.
// Check runtime supported capabilities
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()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
return;
}
// 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.componentTypeCapacityInput = planeCapabilityComponents.size();
planeComponents.componentTypes = planeCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &planeComponents));
const auto supportsComponent = [&planeCapabilityComponents](XrSpatialComponentTypeEXT component) {
return std::find(planeCapabilityComponents.begin(), planeCapabilityComponents.end(), component) != planeCapabilityComponents.end();
};
std::vector<XrSpatialComponentTypeEXT> planeTrackingComponents {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
if (supportsComponent(XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID)) {
planeTrackingComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID);
}
// 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
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
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_COMPONENT_TYPE_SUBSUMED_BY_ANDROID را از بافت پیکربندیشده با XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT نشان میدهد.
// previously created
XrSpatialSnapshotEXT snapshot;
// Query subsumed_by components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_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,
};
CHK_XR(xrQuerySpatialComponentDataEXT(
snapshot, &queryCond, &queryResult));
// Query again with allocated memory
std::vector<XrSpatialEntityIdEXT> subsumedUniqueIds;
subsumedUniqueIds.resize(queryResult.entityIdCountOutput);
XrSpatialComponentSubsumedByListANDROID subsumedByList {
.type = XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID,
.subsumedUniqueIdCount = static_cast<uint32_t>(subsumedUniqueIds.size()),
.subsumedUniqueIds = subsumedUniqueIds.data(),
};
queryResult.next = &subsumedByList;
CHK_XR(xrQuerySpatialComponentDataEXT(
snapshot, &queryCond, &queryResult));
for (uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// Plane was subsumed, remove it from processing logic
// removeEntityFromProcessingLogic(queryResult.entityIds[i], /*replaceWith=*/ subsumedByList.subsumedUniqueIds[i]);
}
// Cleanup
xrDestroySpatialSnapshotEXT(snapshot);
فیلتر کردن نهادهای زیرمجموعه
کد نمونه زیر نشان میدهد که چگونه میتوان نهادهای دارای مؤلفه XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID را بااستفاده از فیلتر از عکس آنی اکتشاف فیلتر کرد، و همچنین شناسه نهاد نهادهای فرعی را جستجو کرد.
// Init filter
XrSpatialDiscoveryUniqueEntitiesFilterANDROID filter {
.type = XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID,
};
// Chain filter to the snapshot create info
// WARNING: Chaining the filter while include subsumed_by component in the
// componentTypes is invalid
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
.type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
.next = &filter
};
XrFutureEXT future {XR_NULL_FUTURE_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &discoverySnapshotCreateInfo, &future))
waitUntilReady(future);
// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
createSnapshotCompletionInfo {
.type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
.baseSpace = space,
.time = updateTime,
.future = future,
};
XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
.type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT,
};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
spatialContext, &createSnapshotCompletionInfo,
&completion));
if(completion.futureResult != XR_SUCCESS) return;
// Subsumed entities has already been filtered out in this snapshot,
// now query the various components of the entities.
// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);
سازههای جدید
درحال گسترش دادن XrSpatialComponentDataQueryResultEXT :
درحال گسترش دادن XrSpatialDiscoverySnapshotCreateInfoEXT :
ثابتهای شمارشی جدید
XR_ANDROID_SPATIAL_COMPONENT_SUBSUMED_BY_EXTENSION_NAMEXR_ANDROID_spatial_component_subsumed_by_SPEC_VERSIONدرحال گسترش دادن XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
درحال گسترش دادن XrStructureType :
XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROIDXR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID
مشکلات
سابقه نسخه
بازبینی ۱، ۲۰۲۵/۱۱/۱۹ (Brian Chen)
- توضیحات اولیه افزونه.