XR_ANDROID_spatial_discovery_raycast
String Nama
XR_ANDROID_spatial_discovery_raycast
Jenis Ekstensi
Ekstensi instance
Nomor Ekstensi Terdaftar
787
Revisi
1
Status Ratifikasi
Tidak diratifikasi
Dependensi Ekstensi dan Versi
XR_EXT_spatial_entity
Tanggal Terakhir Diubah
2025-08-12
Status IP
Tidak ada klaim IP yang diketahui.
Kontributor
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
Ringkasan
Ekstensi ini dibuat berdasarkan XR_EXT_spatial_entity dan menyediakan fungsi raycast untuk kemampuan spasial yang ada, seperti XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , untuk menemukan entitas spasial.
Ekstensi ini juga memperkenalkan kemampuan spasial baru untuk raycasting terhadap buffer kedalaman.
Izin
Izin yang diperlukan bergantung pada kemampuan yang digunakan aplikasi Android. Jika XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID digunakan, aplikasi harus memiliki izin android.permission.SCENE_UNDERSTANDING_FINE. Jika XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT digunakan, aplikasi harus memiliki izin android.permission.SCENE_UNDERSTANDING_COARSE. android.permission.SCENE_UNDERSTANDING_FINE juga menyiratkan izin android.permission.SCENE_UNDERSTANDING_COARSE. Jika aplikasi menggunakan kedua kemampuan tersebut, aplikasi tidak perlu meminta kedua izin secara terpisah.
android.permission.SCENE_UNDERSTANDING_COARSE dan android.permission.SCENE_UNDERSTANDING_FINE dianggap sebagai izin berbahaya.
(tingkat perlindungan: berbahaya)
Dukungan Runtime
Jika runtime mendukung penemuan entitas spasial melalui raycasting, runtime harus menunjukkannya dengan mencantumkan XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID di xrEnumerateSpatialCapabilityComponentTypesEXT untuk kemampuan yang mendukung penemuan dengan raycast.
Jika runtime mendukung raycasting terhadap buffer kedalaman, runtime harus menghitung XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID dalam xrEnumerateSpatialCapabilitiesEXT .
Menemukan entitas spasial dengan raycasting
Struktur XrSpatialRaycastInfoANDROID ditentukan sebagai:
typedef struct XrSpatialRaycastInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrVector3f origin;
XrVector3f direction;
float maxDistance;
} XrSpatialRaycastInfoANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.spaceadalah XrSpace tempat pose XrSpatialRaycastResultDataANDROID akan berada.timeadalahXrTimetempat pose XrSpatialRaycastResultDataANDROID ditentukan.originadalah XrVector3f yang menjelaskan asal sinar.directionadalah XrVector3f yang menjelaskan arah sinar.maxDistanceadalah jarak dalam meter yang dapat ditentukan secara opsional oleh aplikasi untuk membatasi penemuan entitas yang berada dalam jarak yang ditentukan dariorigin, di sepanjangdirection.
Aplikasi dapat menyertakan XrSpatialRaycastInfoANDROID dalam rantai XrSpatialDiscoverySnapshotCreateInfoEXT :: next untuk menemukan entitas spasial yang berpotongan dengan sinar yang ditentukan dalam struktur ini.
Jika aplikasi menggunakan XrSpatialRaycastInfoANDROID dengan XrSpatialContextEXT yang dikonfigurasi tanpa mengaktifkan XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID untuk kemampuan apa pun, runtime harus menampilkan XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT dari xrCreateSpatialDiscoverySnapshotAsyncEXT atau xrCreateSpatialRaycastSnapshotANDROID .
Runtime harus menyertakan data dan ID komponen hanya dari entitas spasial tersebut di XrSpatialSnapshotEXT yang berasal dari kemampuan yang mendukung komponen XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID.
Jika aplikasi menyetel maxDistance ke nilai positif, runtime tidak boleh menyertakan entity spasial hit apa pun dalam snapshot yang berjarak lebih dari maxDistance dari panme:origin di sepanjang direction . Jika maxDistance disetel ke 0 atau nilai negatif, runtime harus menganggap sinar tidak terbatas.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_spatial_discovery_raycastharus diaktifkan sebelum menggunakan XrSpatialRaycastInfoANDROID -
typeharus berupaXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
spaceharus berupa handle XrSpace yang valid
Komponen Hasil Raycast
Struktur XrSpatialRaycastResultDataANDROID ditentukan sebagai:
typedef struct XrSpatialRaycastResultDataANDROID {
XrPosef hitPose;
float distanceSquared;
} XrSpatialRaycastResultDataANDROID;
Deskripsi Anggota
hitPoseadalah XrPosef yang menentukan titik tempat sinar berpotongan dengan entitas spasial.distanceSquaredadalah kuadrat jarak dari asal sinar ke titik persimpangan.
Komponen XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID hanya akan ada di XrSpatialSnapshotEXT yang dibuat dari xrCreateSpatialDiscoverySnapshotAsyncEXT dengan XrSpatialRaycastInfoANDROID disertakan dalam rantai XrSpatialDiscoverySnapshotCreateInfoEXT :: next atau di XrSpatialSnapshotEXT yang dibuat dari xrCreateSpatialRaycastSnapshotANDROID .
Runtime tidak boleh menyertakan komponen ini dalam XrSpatialSnapshotEXT apa pun yang dibuat menggunakan xrCreateSpatialUpdateSnapshotEXT .
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrCreateSpatialUpdateSnapshotEXT jika aplikasi menyertakan XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID di XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .
Jika XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID hanya diaktifkan untuk kemampuan tertentu, harus menyertakan hanya entitas spasial yang disediakan oleh kemampuan tersebut dalam snapshot. Misalnya, jika objek dan bidang sejajar ke arah yang sama dan XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID hanya diaktifkan untuk XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , hanya bidang yang akan ditemukan.
hitPose dari XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID akan berada di XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace di XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time . Sumbu Z positif adalah normal permukaan yang terkena, dan sumbu Y negatif kira-kira mengarah ke asal sinar.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_spatial_discovery_raycastharus diaktifkan sebelum menggunakan XrSpatialRaycastResultDataANDROID
Struktur daftar komponen untuk mengkueri data
Struktur XrSpatialComponentRaycastResultListANDROID ditentukan sebagai:
typedef struct XrSpatialComponentRaycastResultListANDROID {
XrStructureType type;
void* next;
uint32_t raycastResultCount;
XrSpatialRaycastResultDataANDROID* raycastResults;
} XrSpatialComponentRaycastResultListANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.raycastResultCountadalahuint32_tyang menjelaskan jumlah elemen dalam arrayraycastResults.raycastResultsadalah array XrSpatialRaycastResultDataANDROID .
Untuk membuat kueri komponen hasil raycast entitas spasial dalam XrSpatialSnapshotEXT , sertakan XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes dan tambahkan XrSpatialComponentRaycastResultListANDROID ke rantai XrSpatialComponentDataQueryResultEXT :: next.
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrQuerySpatialComponentDataEXT jika XrSpatialComponentRaycastResultListANDROID ada dalam rantai XrSpatialComponentDataQueryResultEXT :: next, tetapi XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID tidak disertakan dalam XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Runtime harus menampilkan XR_ERROR_SIZE_INSUFFICIENT dari xrQuerySpatialComponentDataEXT jika raycastResultCount kurang dari XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
raycastResults yang ditampilkan tidak berurutan. Aplikasi dapat menggunakan XrSpatialRaycastResultDataANDROID :: distanceSquared untuk mengurutkan hasil menurut jarak.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_spatial_discovery_raycastharus diaktifkan sebelum menggunakan XrSpatialComponentRaycastResultListANDROID -
typeharus berupaXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
raycastResultsharus berupa pointer ke array strukturraycastResultCountXrSpatialRaycastResultDataANDROID - Parameter
raycastResultCountharus lebih besar dari0
Konfigurasi
Jika XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID tercantum dalam XrSpatialCapabilityComponentTypesEXT :: componentTypes untuk beberapa kemampuan, aplikasi dapat mengaktifkannya dengan menyertakan nilai enum dalam daftar XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. Komponen ini tidak memerlukan konfigurasi khusus untuk disertakan dalam rantai XrSpatialCapabilityConfigurationBaseHeaderEXT berikutnya .
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE dari xrCreateSpatialUpdateSnapshotEXT jika aplikasi menyertakan XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID di XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes . Komponen ini khusus untuk snapshot penemuan.
Kemampuan Spasial Depth Raycast
Konfigurasi
Struktur XrSpatialCapabilityConfigurationDepthRaycastANDROID ditentukan sebagai:
typedef struct XrSpatialCapabilityConfigurationDepthRaycastANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationDepthRaycastANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur.capabilityadalah XrSpatialCapabilityEXT dan harus berupaXR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID.enabledComponentCountadalahuint32_tyang menjelaskan jumlah elemen dalam arrayenabledComponents. Nilainya harus lebih besar dari 0.enabledComponentsadalah pointer ke array XrSpatialComponentTypeEXT .
Aplikasi dapat mengaktifkan kemampuan spasial XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID dengan menyertakan pointer ke struktur XrSpatialCapabilityConfigurationDepthRaycastANDROID di XrSpatialContextCreateInfoEXT :: capabilityConfigs .
Runtime harus menampilkan XR_ERROR_VALIDATION_FAILURE jika capability bukan XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID .
ID entitas yang ditemukan melalui kemampuan ini selalu XR_NULL_SPATIAL_ENTITY_ID_EXT . Ini juga berarti aplikasi tidak dapat membuat handle XrSpatialEntityEXT untuk entitas ini, sehingga entitas tersebut tidak dapat disertakan dalam XrSpatialUpdateSnapshotCreateInfoEXT :: entities untuk membuat snapshot update
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_spatial_discovery_raycastharus diaktifkan sebelum menggunakan XrSpatialCapabilityConfigurationDepthRaycastANDROID -
typeharus berupaXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur -
capabilityharus berupa nilai XrSpatialCapabilityEXT yang valid -
enabledComponentsmust berupa pointer ke array nilaienabledComponentCountXrSpatialComponentTypeEXT yang valid - Parameter
enabledComponentCountharus lebih besar dari0
Komponen yang Dijamin
Runtime yang mendukung XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID , harus mendukung komponen spasial berikut sebagai komponen terjamin dari entitas yang ditemukan oleh kemampuan ini dan harus mencantumkannya di xrEnumerateSpatialCapabilityComponentTypesEXT -
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Raycast Sinkron
Fungsi xrCreateSpatialRaycastSnapshotANDROID ditentukan sebagai:
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
Deskripsi Parameter
spatialContextadalah XrSpatialContextEXT yang sebelumnya dibuat menggunakan xrCreateSpatialContextAsyncEXT .createInfoadalah pointer ke XrSpatialRaycastSnapshotCreateInfoANDROID .snapshotadalah pointer ke XrSpatialSnapshotEXT .
Meskipun xrCreateSpatialDiscoverySnapshotAsyncEXT sudah cukup untuk sebagian besar kasus penggunaan, fungsi ini dianggap lambat untuk aplikasi yang memerlukan hasil raycast instan. xrCreateSpatialRaycastSnapshotANDROID memulai raycasting sinkron untuk membuat snapshot, yang memungkinkan aplikasi mulai mengkueri hasil raycast dengan segera.
Runtime harus menampilkan XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT jika ada XrSpatialComponentTypeEXT di XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes yang tidak diaktifkan untuk kemampuan spasial yang diteruskan ke XrSpatialContextCreateInfoEXT :: capabilityConfigs saat membuat spatialContext .
Jika aplikasi tidak menyediakan daftar jenis komponen spasial di XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes , runtime harus menyertakan semua entity spasial dalam snapshot yang memiliki kumpulan komponen yang tercantum di XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents untuk kemampuan yang didukung raycast yang dikonfigurasi untuk spatialContext . Runtime harus menyertakan data untuk semua komponen yang diaktifkan dari kemampuan yang didukung raycast yang dikonfigurasi untuk spatialContext .
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_spatial_discovery_raycastharus diaktifkan sebelum memanggil xrCreateSpatialRaycastSnapshotANDROID -
spatialContextharus berupa handle XrSpatialContextEXT yang valid -
createInfoharus berupa pointer ke struktur XrSpatialRaycastSnapshotCreateInfoANDROID yang valid -
snapshotharus berupa pointer ke handle XrSpatialSnapshotEXT
Kode Status
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
Struktur XrSpatialRaycastSnapshotCreateInfoANDROID ditentukan sebagai:
typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
const XrSpatialRaycastInfoANDROID* raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;
Deskripsi Anggota
typeadalah XrStructureType dari struktur ini.nextadalahNULLatau pointer ke struktur berikutnya dalam rantai struktur. Tidak ada struktur seperti itu yang ditentukan dalam OpenXR inti atau ekstensi ini.componentTypeCountadalahuint32_tyang menjelaskan jumlah elemen dalam arraycomponentTypes.componentTypesadalah array XrSpatialComponentTypeEXT .raycastInfoadalah struktur XrSpatialRaycastInfoANDROID yang menjelaskan informasi sinar.
Penggunaan yang Valid (Implisit)
- Ekstensi
XR_ANDROID_spatial_discovery_raycastharus diaktifkan sebelum menggunakan XrSpatialRaycastSnapshotCreateInfoANDROID -
typeharus berupaXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID -
nextharus berupaNULLatau pointer yang valid ke struktur berikutnya dalam rantai struktur - Jika
componentTypeCountbukan0,componentTypesharus berupa pointer ke array nilai XrSpatialComponentTypeEXT yang validcomponentTypeCount -
raycastInfoharus berupa pointer ke struktur XrSpatialRaycastInfoANDROID yang valid
Kode contoh
Mengonfigurasi Kemampuan Depth Raycast dan Plane Tracking
Contoh kode berikut menunjukkan cara membuat konteks spasial dengan kemampuan yang mendukung fungsi raycast. Untuk contoh ini, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID dan XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT digunakan.
// 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))
Menemukan Entitas Spasial & Data Komponen Kueri
Contoh kode berikut menunjukkan cara menemukan entitas spasial untuk konteks yang dikonfigurasi dengan XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID & XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT dan mengkueri data komponennya.
// 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);
Membuat Snapshot Raycast
Contoh kode berikut menunjukkan cara membuat snapshot raycast sinkron.
// 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);
Perintah Baru
Struktur Baru
- XrSpatialCapabilityConfigurationDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
Memperluas XrSpatialComponentDataQueryResultEXT :
Memperluas XrSpatialDiscoverySnapshotCreateInfoEXT :
Konstanta Enum Baru
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAMEXR_ANDROID_spatial_discovery_raycast_SPEC_VERSIONMemperluas XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
Memperluas XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Memperluas 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
Masalah
Riwayat Versi
Revisi 1, 15-07-2025 (Brian Chen)
- Deskripsi ekstensi awal.