XR_ANDROID_spatial_discovery_raycast
رشته نام
XR_ANDROID_spatial_discovery_raycast
نوع افزونه
افزونه نمونه
شماره داخلی ثبتشده
787
بازبینی
1
وضعیت تصویب
تصویبنشده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_entity
تاریخ آخرین تغییر
2025-08-12
وضعیت IP
هیچ ادعای مالکیت فکری شناختهشدهای وجود ندارد.
همیاران
Brian Chen، Google
Levana Chen، Google
Kyle Chen، Google
Nihav Jain، Google
Spencer Quin، Google
Natalie Fleury، Meta
Yuichi Taguchi، Meta
Jimmy Alamparambil، ByteDance
Zhipeng Liu، ByteDance
نمای کلی
این افزونه برپایه XR_EXT_spatial_entity ساخته شده است و عملکرد پرتوتابی را برای قابلیتهای فضایی موجود، مانند XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ، برای کشف موجودیتهای فضایی ارائه میدهد.
این افزونه همچنین قابلیت فضایی جدیدی برای پرتوتابی دربرابر میانگیر عمق معرفی میکند.
اجازهها
اجازههای لازم بسته به قابلیتهایی که برنامه Android استفاده میکند. اگر از XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID استفاده شود، برنامه باید اجازه android.permission.SCENE_UNDERSTANDING_FINE را داشته باشد. اگر از XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT استفاده شود، برنامه باید اجازه android.permission.SCENE_UNDERSTANDING_COARSE را داشته باشد. android.permission.SCENE_UNDERSTANDING_FINE همچنین بهمعنای اجازه android.permission.SCENE_UNDERSTANDING_COARSE است، اگر برنامه از هر دو قابلیت استفاده کند، برنامه نیازی به درخواست جداگانه هر دو اجازه ندارد.
هر دو android.permission.SCENE_UNDERSTANDING_COARSE و android.permission.SCENE_UNDERSTANDING_FINE اجازههای خطرناک محسوب میشوند.
(سطح محافظت: خطرناک)
پشتیبانی زمان اجرا
اگر زمان اجرا از کشف موجودیتهای فضایی ازطریق پرتوتابی پشتیبانی میکند، باید این موضوع را با شمارش XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID در xrEnumerateSpatialCapabilityComponentTypesEXT برای قابلیتهایی که از کشف با پرتوتابی پشتیبانی میکنند نشان دهد.
اگر زمان اجرا از پرتوتابی درمقابل میانگیر عمق پشتیبانی میکند، باید XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID را در xrEnumerateSpatialCapabilitiesEXT فهرست کند.
کشف نهادهای فضایی با پرتوتابی
ساختار XrSpatialRaycastInfoANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialRaycastInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrVector3f origin;
XrVector3f direction;
float maxDistance;
} XrSpatialRaycastInfoANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
spaceهمان XrSpace است که حالت XrSpatialRaycastResultDataANDROID در آن قرار خواهد گرفت. -
timeیکXrTimeاست که در آن حالت XrSpatialRaycastResultDataANDROID تعریف شده است. -
originیک XrVector3f است که مبدأ پرتو را توصیف میکند. directionیک XrVector3f است که جهت پرتو را توصیف میکند.maxDistanceفاصلهای به متر است که برنامه میتواند بهطور اختیاری برای محدود کردن کاوش نهادهایی که در فاصله مشخصشده ازorigin، در امتدادdirectionقرار دارند، مشخص کند.
برنامه میتواند XrSpatialRaycastInfoANDROID را در زنجیره XrSpatialDiscoverySnapshotCreateInfoEXT :: next اضافه کند تا موجودیتهای فضایی را که با پرتو تعریفشده در این ساختار تلاقی دارند کشف کند.
اگر برنامهای از XrSpatialRaycastInfoANDROID با XrSpatialContextEXT استفاده کند که بدون فعال کردن XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID برای هر قابلیتی پیکربندی شده باشد، زمان اجرا باید XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT را از xrCreateSpatialDiscoverySnapshotAsyncEXT یا xrCreateSpatialRaycastSnapshotANDROID برگرداند.
زمان اجرا باید شامل دادههای مؤلفه و شناسههای فقط آن موجودیتهای فضایی در XrSpatialSnapshotEXT باشد که از قابلیتهای پشتیبانیکننده از مؤلفه XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID میآیند.
اگر برنامهای maxDistance را روی مقدار مثبت تنظیم کند، زمان اجرا نباید هیچ نهاد فضایی ضربهخوردهای را در عکس آنی که بیشاز maxDistance از panme:origin در امتداد direction فاصله دارد لحاظ کند. اگر maxDistance روی ۰ یا مقدار منفی تنظیم شده باشد، زمان اجرا باید پرتو را نامحدود درنظر بگیرد.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_discovery_raycastباید قبلاز استفاده از XrSpatialRaycastInfoANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
spaceباید شناسه مجازی XrSpace معتبر باشد
عنصر نتیجه Raycast
ساختار XrSpatialRaycastResultDataANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialRaycastResultDataANDROID {
XrPosef hitPose;
float distanceSquared;
} XrSpatialRaycastResultDataANDROID;
توضیحات عضو
hitPoseیک XrPosef است که نقطهای را که پرتو با موجودیت فضایی تلاقی میکند تعریف میکند.distanceSquaredمجذور فاصله از مبدأ پرتو تا نقطه تقاطع است.
مؤلفه XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID فقط در XrSpatialSnapshotEXT ایجادشده از xrCreateSpatialDiscoverySnapshotAsyncEXT وجود خواهد داشت که در آن XrSpatialRaycastInfoANDROID در زنجیره XrSpatialDiscoverySnapshotCreateInfoEXT :: next یا در XrSpatialSnapshotEXT ایجادشده از xrCreateSpatialRaycastSnapshotANDROID گنجانده شده است.
زمان اجرا نباید این مؤلفه را در هیچ XrSpatialSnapshotEXT که بااستفاده از xrCreateSpatialUpdateSnapshotEXT ایجاد شده است لحاظ کند.
اگر برنامه XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID را در XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes لحاظ کند، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrCreateSpatialUpdateSnapshotEXT برگرداند.
اگر XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID فقط برای قابلیتهای خاصی فعال شده باشد، زمان اجرا باید فقط موجودیتهای فضایی ارائهشده توسط آن قابلیتها را در عکس آنی لحاظ کند. برای مثال، اگر یک شیء و یک سطح در یک جهت قرار داشته باشند و XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID فقط برای XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT فعال باشد، فقط سطح شناسایی خواهد شد.
hitPose مربوط به XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID در XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace در XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time قرار خواهد گرفت. محور Z مثبت، بردار نرمال سطح برخورد است و محور Y منفی تقریباً بهسمت مبدأ پرتو اشاره میکند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_discovery_raycastباید قبلاز استفاده از XrSpatialRaycastResultDataANDROID فعال شود
ساختار فهرست مؤلفه برای پُرسمان دادهها
ساختار XrSpatialComponentRaycastResultListANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialComponentRaycastResultListANDROID {
XrStructureType type;
void* next;
uint32_t raycastResultCount;
XrSpatialRaycastResultDataANDROID* raycastResults;
} XrSpatialComponentRaycastResultListANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. raycastResultCountیکuint32_tاست که تعداد عناصر را در آرایهraycastResultsتوصیف میکند.-
raycastResultsآرایهای از XrSpatialRaycastResultDataANDROID است.
برای پرسمان مؤلفه نتیجه پرتوتابی موجودیتهای فضایی در XrSpatialSnapshotEXT ، XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID را در XrSpatialComponentDataQueryConditionEXT :: componentTypes اضافه کنید و XrSpatialComponentRaycastResultListANDROID را به زنجیره XrSpatialComponentDataQueryResultEXT :: next اضافه کنید.
اگر XrSpatialComponentRaycastResultListANDROID در زنجیره XrSpatialComponentDataQueryResultEXT :: next باشد اما XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrQuerySpatialComponentDataEXT برگرداند.
اگر raycastResultCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT را از xrQuerySpatialComponentDataEXT برگرداند.
raycastResults برگرداندهشده نامرتب است. برنامه میتواند از XrSpatialRaycastResultDataANDROID :: distanceSquared برای مرتبسازی نتایج براساس فاصله استفاده کند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_discovery_raycastباید قبلاز استفاده از XrSpatialComponentRaycastResultListANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
raycastResultsباید اشارهگری به آرایهای از ساختارهایraycastResultCountXrSpatialRaycastResultDataANDROID باشد - پارامتر
raycastResultCountباید بزرگتر از0باشد
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID در XrSpatialCapabilityComponentTypesEXT :: componentTypes برای برخی قابلیتها شمارش شده باشد، برنامه میتواند با گنجاندن مقدار شمارشی در فهرست XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents آن را فعال کند. این مؤلفه برای گنجانده شدن در زنجیره بعدی XrSpatialCapabilityConfigurationBaseHeaderEXT به پیکربندی خاصی نیاز ندارد.
اگر برنامه XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID را در XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes لحاظ کند، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را از xrCreateSpatialUpdateSnapshotEXT برگرداند. این مؤلفه مختص عکسهای آنی کاوش است.
قابلیت فضایی پرتوتابی عمق
پیکربندی
ساختار XrSpatialCapabilityConfigurationDepthRaycastANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialCapabilityConfigurationDepthRaycastANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationDepthRaycastANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. -
capabilityیک XrSpatialCapabilityEXT است و بایدXR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROIDباشد. enabledComponentCountیکuint32_tاست که تعداد عناصر را در آرایهenabledComponentsتوصیف میکند. باید بزرگتر از ۰ باشد.-
enabledComponentsاشارهگری به آرایهای از XrSpatialComponentTypeEXT است.
برنامهها میتوانند قابلیت فضایی XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID را با گنجاندن اشارهگری به ساختار XrSpatialCapabilityConfigurationDepthRaycastANDROID در XrSpatialContextCreateInfoEXT :: capabilityConfigs فعال کنند.
اگر capability XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID نباشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE را برگرداند.
شناسه نهادهای کشفشده ازطریق این قابلیت همیشه XR_NULL_SPATIAL_ENTITY_ID_EXT است. این همچنین به این معنی است که برنامه نمیتواند دسته XrSpatialEntityEXT برای این موجودیتها ایجاد کند، و بنابراین آنها نمیتوانند در XrSpatialUpdateSnapshotCreateInfoEXT :: entities برای ایجاد عکس آنی بهروزرسانی گنجانده شوند
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_discovery_raycastباید پیشاز استفاده از XrSpatialCapabilityConfigurationDepthRaycastANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد -
capabilityباید مقدار XrSpatialCapabilityEXT معتبری باشد -
enabledComponentsباید اشارهگری به آرایهای از مقادیر معتبرenabledComponentCountXrSpatialComponentTypeEXT باشد - پارامتر
enabledComponentCountباید بزرگتر از0باشد
قطعات تضمینشده
زمان اجرایی که از XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID پشتیبانی میکند، باید از مؤلفههای فضایی زیر بهعنوان مؤلفههای تضمینشده موجودیتهای کشفشده توسط این قابلیت پشتیبانی کند و باید آنها را در xrEnumerateSpatialCapabilityComponentTypesEXT فهرست کند -
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Raycast همزمان
تابع xrCreateSpatialRaycastSnapshotANDROID بهصورت زیر تعریف میشود:
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
شرح پارامترها
spatialContextیک XrSpatialContextEXT است که قبلاً بااستفاده از xrCreateSpatialContextAsyncEXT ایجاد شده است.-
createInfoاشارهگری به XrSpatialRaycastSnapshotCreateInfoANDROID است. -
snapshotاشارهگری به XrSpatialSnapshotEXT است.
درحالیکه xrCreateSpatialDiscoverySnapshotAsyncEXT برای اکثر موارد استفاده کافی است، برای برنامههایی که به نتایج فوری پرتوتابی نیاز دارند کند محسوب میشود. xrCreateSpatialRaycastSnapshotANDROID یک پرتوتابی همگام را برای ایجاد عکس آنی شروع میکند که به برنامهها اجازه میدهد فوراً پرسمان نتایج پرتوتابی را شروع کنند.
اگر هرکدام از XrSpatialComponentTypeEXT در XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes برای قابلیتهای فضایی ارسالشده به XrSpatialContextCreateInfoEXT :: capabilityConfigs هنگام ایجاد spatialContext فعال نشده باشد، زمان اجرا باید XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT را برگرداند.
اگر برنامه فهرست انواع مؤلفههای فضایی را در XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes ارائه نکند، زمان اجرا باید همه موجودیتهای فضایی را در عکس آنی که دارای مجموعه مؤلفههای فهرستشده در XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents برای قابلیتهای پشتیبانیشده raycast پیکربندیشده برای spatialContext هستند لحاظ کند. زمان اجرا باید شامل دادههای مربوط به همه مؤلفههای فعالشده قابلیتهای پشتیبانیشده raycast پیکربندیشده برای spatialContext باشد.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_discovery_raycastباید قبلاز فراخوانی xrCreateSpatialRaycastSnapshotANDROID فعال شود -
spatialContextباید یک دسته XrSpatialContextEXT معتبر باشد -
createInfoباید اشارهگری به ساختار معتبر XrSpatialRaycastSnapshotCreateInfoANDROID باشد -
snapshotباید اشارهگری به دسته XrSpatialSnapshotEXT باشد
کدهای برگشتی
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
ساختار XrSpatialRaycastSnapshotCreateInfoANDROID بهصورت زیر تعریف میشود:
typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
const XrSpatialRaycastInfoANDROID* raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;
توضیحات عضو
typeXrStructureType این ساختار است.-
nextبرابر باNULLیا اشارهگری به ساختار بعدی در زنجیره ساختار است. چنین ساختارهایی در OpenXR اصلی یا این افزونه تعریف نشده است. componentTypeCountیکuint32_tاست که تعداد عناصر را در آرایهcomponentTypesتوصیف میکند.-
componentTypesآرایهای از XrSpatialComponentTypeEXT است. -
raycastInfoساختار XrSpatialRaycastInfoANDROID است که اطلاعات پرتو را توصیف میکند.
استفاده معتبر (ضمنی)
- افزونه
XR_ANDROID_spatial_discovery_raycastباید قبلاز استفاده از XrSpatialRaycastSnapshotCreateInfoANDROID فعال شود -
typeبایدXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROIDباشد -
nextبایدNULLیا اشارهگر معتبری به ساختار بعدی در زنجیره ساختار باشد - اگر
componentTypeCountبرابر با0نباشد،componentTypesباید اشارهگری به آرایهای از مقادیر معتبرcomponentTypeCountXrSpatialComponentTypeEXT باشد -
raycastInfoباید اشارهگری به ساختار XrSpatialRaycastInfoANDROID معتبر باشد
کد نمونه
پیکربندی قابلیت ردیابی صفحه و Depth Raycast
کد نمونه زیر نشان میدهد که چگونه یک بافت فضایی با قابلیتهایی ایجاد کنید که از عملکرد raycast پشتیبانی میکنند. برای این مثال، از XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID و XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT استفاده میشود.
// Check runtime supported capabilities
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_DEPTH_RAYCAST_ANDROID) == capabilities.end()) {
return;
}
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
return;
}
// Create capability config for depth raycasting
std::vector<XrSpatialComponentTypeEXT> depthRaycastComponents {
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
};
// Create capability config for depth raycasting
XrSpatialCapabilityConfigurationDepthRaycastANDROID depthRaycastConfig {
.type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID,
.enabledComponentCount = (uint32_t)depthRaycastComponents.size(),
.enabledComponents = depthRaycastComponents.data(),
};
// Enumerate runtime supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes {
XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT
};
bool isRaycastSupportedViaPlaneTracking;
std::vector<XrSpatialComponentTypeEXT> planeTrackingComponents {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));
planeTrackingComponents.resize(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = (uint32_t)planeTrackingComponents.size();
capabilityComponentTypes.componentTypes = planeTrackingComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));
// Check if raycast is supported by plane tracking
isRaycastSupportedViaPlaneTracking = std::find(planeTrackingComponents.begin(),
planeTrackingComponents.end(), XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID)
!= planeTrackingComponents.end();
// 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
// Types of raycast is determined by configs included in XrSpatialContextCreateInfoEXT
// For this example, both plane raycast & depth raycast are performed
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&depthRaycastConfig));
if(isRaycastSupportedViaPlaneTracking) 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_CAPABILITY_DEPTH_RAYCAST_ANDROID و XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT پیکربندی شده است کشف کرد و دادههای مؤلفه آن را پُرسمان کرد.
// Fill in the raycast info.
XrSpatialRaycastInfoANDROID raycastInfo {
.type = XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID,
.next = nullptr,
.space = viewSpace,
.time = updateTime,
.origin = {0.0f, 0.0f, 0.0f},
.direction = {0.0f, 0.0f,-1.0f},
.maxDistance = 0.0f // ray is unbounded
};
// Next pointing to the raycast info.
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
.type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
.next = &raycastInfo
};
// Create snapshot
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT (
spatialContext, &discoverySnapshotCreateInfo, &future));
waitUntilReady(future);
// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
createSnapshotCompletionInfo {
.type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
.baseSpace = viewSpace,
.time = updateTime,
.future = future,
};
XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
spatialContext, &createSnapshotCompletionInfo,
&completion));
if(completion.futureResult != XR_SUCCESS) return;
// Query hit result components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_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,
};
XrResult result = xrQuerySpatialComponentDataEXT(
completion.snapshot, &queryCond, &queryResult);
// Check query result.
if(result != XR_SUCCESS) return;
// Query again for the hit result list.
std::vector<XrSpatialRaycastResultDataANDROID> raycastResults;
raycastResults.resize(queryResult.entityIdCountOutput);
XrSpatialComponentRaycastResultListANDROID raycastResultList {
.type = XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID,
.raycastResultCount = (uint32_t)raycastResults.size(),
.raycastResults = raycastResults.data(),
};
queryResult.next = &raycastResultList;
result = xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult);
// Check query result again.
if(result != XR_SUCCESS) return;
std::vector<XrSpatialEntityEXT> hitEntities;
std::vector<XrPosef> depthHitPoses;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// access raycastResults[i] for id & pose
XrSpatialEntityIdEXT id = queryResult.entityIds[i];
XrPosef pose = raycastResults[i].hitPose;
if (id != XR_NULL_SPATIAL_ENTITY_ID_EXT) {
// hit entities (e.g. planes)
// get entity handle via entity id
XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
.type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
.entityId = id,
};
XrSpatialEntityEXT entity = XR_NULL_HANDLE;
xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);
hitEntities.push_back(entity);
} else {
// hit depth
depthHitPoses.push_back(pose);
}
}
// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);
ایجاد عکس آنی Raycast
کد نمونه زیر نحوه ایجاد عکس آنی پرتوتابی همگام را نشان میدهد.
// fill in create info
XrSpatialRaycastSnapshotCreateInfoANDROID createInfo {
.type = XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID,
.componentTypeCount = 0, // include all hit spatial entities
.componentTypes = nullptr,
.raycastInfo = &raycastInfo
};
// create raycast snapshot
XrSpatialSnapshotEXT raycastSnapshot = XR_NULL_HANDLE;
CHK_XR(xrCreateSpatialRaycastSnapshotANDROID(
spatialContext, &createInfo, &raycastSnapshot));
// ...
// query component data as previous example
// ...
// Cleanup
xrDestroySpatialSnapshotEXT(raycastSnapshot);
فرمانهای جدید
سازههای جدید
- XrSpatialCapabilityConfigurationDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
درحال گسترش دادن XrSpatialComponentDataQueryResultEXT :
درحال گسترش دادن XrSpatialDiscoverySnapshotCreateInfoEXT :
ثابتهای شمارشی جدید
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAMEXR_ANDROID_spatial_discovery_raycast_SPEC_VERSIONدرحال گسترش دادن XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
درحال گسترش دادن XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
درحال گسترش دادن XrStructureType :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID
مشکلات
سابقه نسخه
بازبینی ۱، ۲۰۲۵-۰۷-۱۵ (Brian Chen)
- توضیحات اولیه افزونه.