XR_ANDROID_spatial_discovery_raycast
رشته نام
XR_ANDROID_spatial_discovery_raycast
نوع افزونه
افزونه نمونه
شماره داخلی ثبت شده
۷۸۷ عدد
بازنگری
۱
وضعیت تصویب
تصویب نشده
وابستگیهای افزونه و نسخه
XR_EXT_spatial_entity
آخرین تاریخ اصلاح
۲۰۲۵-۰۸-۱۲
وضعیت آیپی
هیچ ادعای مالکیت معنوی شناختهشدهای وجود ندارد.
مشارکتکنندگان
برایان چن، گوگل
لوانا چن، گوگل
کایل چن، گوگل
نیهاو جین، گوگل
اسپنسر کوئین، گوگل
ناتالی فلوری، متا
یویچی تاگوچی، متا
جیمی آلمپارامبیل، بایتدنس
ژیپنگ لیو، ByteDance
نمای کلی
این افزونه بر پایه XR_EXT_spatial_entity ساخته شده و قابلیت raycast را برای قابلیتهای مکانی موجود، مانند XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ، برای کشف موجودیتهای مکانی فراهم میکند.
این افزونه همچنین یک قابلیت مکانی جدید برای پخش پرتو در برابر بافر عمقی معرفی میکند.
مجوزها
مجوزهای مورد نیاز بسته به قابلیتهایی که برنامه اندروید استفاده میکند. اگر از 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 مجوزهای خطرناک محسوب میشوند.
(سطح حفاظت: خطرناک)
پشتیبانی زمان اجرا
اگر زمان اجرا از کشف موجودیتهای مکانی از طریق raycasting پشتیبانی میکند، باید این موضوع را با شمارش XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID در xrEnumerateSpatialCapabilityComponentTypesEXT برای قابلیتهایی که از کشف توسط raycast پشتیبانی میکنند، نشان دهد.
اگر زمان اجرا از پخش پرتو در برابر بافر عمق پشتیبانی کند، باید XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID را در xrEnumerateSpatialCapabilitiesEXT شمارش کند.
کشف موجودیتهای مکانی با استفاده از raycasting
ساختار XrSpatialRaycastInfoANDROID به صورت زیر تعریف میشود:
typedef struct XrSpatialRaycastInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrVector3f origin;
XrVector3f direction;
float maxDistance;
} XrSpatialRaycastInfoANDROID;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
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 روی 0 یا مقدار منفی تنظیم شود، زمان اجرا باید پرتو را بدون مرز در نظر بگیرد.
کاربرد معتبر (ضمنی)
- افزونهی
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 در زنجیره next XrSpatialDiscoverySnapshotCreateInfoEXT :: یا در 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;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
raycastResultCountیکuint32_tاست که تعداد عناصر موجود در آرایهraycastResultsرا توصیف میکند. -
raycastResultsآرایهای از XrSpatialRaycastResultDataANDROID است.
برای پرسوجوی مؤلفهی نتیجهی raycast مربوط به موجودیتهای مکانی در یک XrSpatialSnapshotEXT ، XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID را در XrSpatialComponentDataQueryConditionEXT :: componentTypes وارد کنید و XrSpatialComponentRaycastResultListANDROID را به زنجیرهی next XrSpatialComponentDataQueryResultEXT :: اضافه کنید.
اگر XrSpatialComponentRaycastResultListANDROID در زنجیره next XrSpatialComponentDataQueryResultEXT :: باشد اما XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID در XrSpatialComponentDataQueryConditionEXT :: componentTypes گنجانده نشده باشد، زمان اجرا باید XR_ERROR_VALIDATION_FAILURE از xrQuerySpatialComponentDataEXT :: componentTypes برگرداند.
اگر raycastResultCount کمتر از XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput باشد، زمان اجرا باید XR_ERROR_SIZE_INSUFFICIENT از xrQuerySpatialComponentDataEXT برگرداند.
نتایج raycastResults برگشتی نامرتب هستند. یک برنامه میتواند از XrSpatialRaycastResultDataANDROID :: distanceSquared برای مرتبسازی نتایج بر اساس فاصله استفاده کند.
کاربرد معتبر (ضمنی)
- قبل از استفاده از XrSpatialComponentRaycastResultListANDROID، افزونهی
XR_ANDROID_spatial_discovery_raycastباید فعال باشد. -
typeبایدXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد. -
raycastResultsباید یک اشارهگر به آرایهای از ساختارهایraycastResultCountXrSpatialRaycastResultDataANDROID باشد. - پارامتر
raycastResultCountباید بزرگتر از0باشد.
پیکربندی
اگر XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID برای برخی قابلیتها در XrSpatialCapabilityComponentTypesEXT :: componentTypes شمارش شده باشد، برنامه میتواند با قرار دادن مقدار enum در لیست 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;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
nextNULLیا اشارهگری به ساختار بعدی در یک زنجیره ساختار است. -
capabilityیک XrSpatialCapabilityEXT است و بایدXR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROIDباشد. -
enabledComponentCountیکuint32_tاست که تعداد عناصر موجود در آرایهenabledComponentsرا توصیف میکند. این مقدار باید بزرگتر از 0 باشد. -
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 برای ایجاد یک snapshot بهروزرسانی، لحاظ کند.
کاربرد معتبر (ضمنی)
- افزونهی
XR_ANDROID_spatial_discovery_raycastباید قبل از استفاده از XrSpatialCapabilityConfigurationDepthRaycastANDROID فعال شود. -
typeبایدXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDباشد. -
nextبایدNULLیا یک اشارهگر معتبر به ساختار بعدی در یک زنجیره ساختار باشد. -
capabilityباید یک مقدار معتبر XrSpatialCapabilityEXT باشد. -
enabledComponentsباید اشارهگری به آرایهای ازenabledComponentCountبا مقادیر معتبر XrSpatialComponentTypeEXT باشد. - پارامتر
enabledComponentCountباید بزرگتر از0باشد.
قطعات تضمین شده
یک زمان اجرا که از XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID پشتیبانی میکند، باید از اجزای مکانی زیر به عنوان اجزای تضمینشدهی موجودیتهای کشفشده توسط این قابلیت پشتیبانی کند و باید آنها را در xrEnumerateSpatialCapabilityComponentTypesEXT شمارش کند -
-
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
پخش همزمان پرتو
تابع xrCreateSpatialRaycastSnapshotANDROID به صورت زیر تعریف شده است:
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
توضیحات پارامتر
-
spatialContextیک XrSpatialContextEXT است که قبلاً با استفاده از xrCreateSpatialContextAsyncEXT ایجاد شده است. -
createInfoیک اشارهگر به XrSpatialRaycastSnapshotCreateInfoANDROID است. -
snapshotیک اشارهگر به XrSpatialSnapshotEXT است.
اگرچه xrCreateSpatialDiscoverySnapshotAsyncEXT برای اکثر موارد استفاده کافی است، اما برای برنامههایی که به نتایج raycast فوری نیاز دارند، کند تلقی میشود. xrCreateSpatialRaycastSnapshotANDROID یک raycasting همزمان را برای ایجاد یک snapshot آغاز میکند که به برنامهها اجازه میدهد بلافاصله شروع به پرسوجو از نتایج raycast کنند.
اگر هر یک از XrSpatialComponentTypeEXT در XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes برای قابلیتهای مکانی ارسال شده به XrSpatialContextCreateInfoEXT :: capabilityConfigs هنگام ایجاد spatialContext فعال نباشند، زمان اجرا باید XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT را برگرداند.
اگر برنامه فهرستی از انواع مؤلفههای مکانی را در XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes ارائه ندهد، زمان اجرا باید شامل تمام موجودیتهای مکانی در snapshot باشد که دارای مجموعهای از مؤلفههایی هستند که در XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents برای قابلیتهای پشتیبانیشده توسط raycast پیکربندیشده برای spatialContext شمارش شدهاند. زمان اجرا باید شامل دادههای مربوط به تمام مؤلفههای فعالشده از قابلیتهای پشتیبانیشده توسط raycast پیکربندیشده برای spatialContext باشد.
کاربرد معتبر (ضمنی)
- افزونهی
XR_ANDROID_spatial_discovery_raycastباید قبل از فراخوانی xrCreateSpatialRaycastSnapshotANDROID فعال شود. -
spatialContextباید یک هندل معتبر XrSpatialContextEXT باشد. -
createInfoباید یک اشارهگر به ساختار معتبر XrSpatialRaycastSnapshotCreateInfoANDROID باشد. -
snapshotباید یک اشارهگر به یک هندل XrSpatialSnapshotEXT باشد.
کدهای بازگشت
-
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_RUNTIME_FAILURE -
XR_ERROR_SESSION_LOST -
XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT -
XR_ERROR_TIME_INVALID -
XR_ERROR_VALIDATION_FAILURE
ساختار XrSpatialRaycastSnapshotCreateInfoANDROID به صورت زیر تعریف شده است:
typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
const XrSpatialRaycastInfoANDROID* raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;
توضیحات اعضا
-
typeنوع XrStructureType این ساختار است. -
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باید اشارهگری به آرایهای ازcomponentTypeCountبا مقادیر معتبر XrSpatialComponentTypeEXT باشد. -
raycastInfoباید یک اشارهگر به یک ساختار معتبر XrSpatialRaycastInfoANDROID باشد.
کد مثال
پیکربندی قابلیت Depth Raycast و Plane Tracking
کد نمونه زیر نحوه ایجاد یک زمینه مکانی با قابلیتهایی که از قابلیت 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
کد مثال زیر نحوه ایجاد 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);
دستورات جدید
سازههای جدید
- پیکربندی XrSpatialCapabilityDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
ثابتهای شمارشی جدید
-
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAME -
XR_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_ANDROID -
XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID -
XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID -
XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID
-
مسائل
تاریخچه نسخه
نسخه ۱، ۲۰۲۵-۰۷-۱۵ (برایان چن)
- توضیحات اولیه افزونه