XR_ANDROID_spatial_discovery_raycast
Name String
XR_ANDROID_spatial_discovery_raycast
Uzantı Türü
Örnek uzantısı
Kayıtlı Uzantı Numarası
787
Düzeltme
1
Onay durumu
Onaylanmadı
Uzantı ve Sürüm Bağımlılıkları
XR_EXT_spatial_entity
Son Değiştirilme Tarihi
2025-08-12
IP Durumu
Bilinen IP hak talebi yok.
Katkıda bulunanlar
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
Genel Bakış
Bu uzantı, XR_EXT_spatial_entity üzerine kurulmuştur ve XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT gibi mevcut uzamsal özellikler için ışın dökümü işlevi sağlayarak uzamsal öğeleri keşfetmenize olanak tanır.
Bu uzantı, derinlik arabelleğine karşı ışın dökümü için yeni bir uzamsal özellik de sunar.
İzinler
Android uygulamasının kullandığı özelliklere bağlı olarak gerekli izinler. XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID kullanılıyorsa uygulamada android.permission.SCENE_UNDERSTANDING_FINE izni olmalıdır. XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT kullanılıyorsa uygulamada android.permission.SCENE_UNDERSTANDING_COARSE izni olmalıdır. android.permission.SCENE_UNDERSTANDING_FINE, android.permission.SCENE_UNDERSTANDING_COARSE iznini de içerir. Uygulama her iki özelliği de kullanıyorsa her iki izni ayrı ayrı istemesi gerekmez.
Hem android.permission.SCENE_UNDERSTANDING_COARSE hem de android.permission.SCENE_UNDERSTANDING_FINE tehlikeli izinler olarak kabul edilir.
(koruma düzeyi: tehlikeli)
Çalışma Zamanı Desteği
Çalışma zamanı, ışın dökümü aracılığıyla uzamsal öğelerin keşfedilmesini destekliyorsa ışın dökümüyle keşfi destekleyen özellikler için xrEnumerateSpatialCapabilityComponentTypesEXT içinde XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID numaralandırarak bunu belirtmelidir.
Çalışma zamanı, derinlik arabelleğine karşı ışın dökümünü destekliyorsa xrEnumerateSpatialCapabilitiesEXT içinde XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID değerini numaralandırması gerekir.
Işın dökümüyle uzamsal öğeleri keşfetme
XrSpatialRaycastInfoANDROID yapısı şu şekilde tanımlanır:
typedef struct XrSpatialRaycastInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrVector3f origin;
XrVector3f direction;
float maxDistance;
} XrSpatialRaycastInfoANDROID;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.space, XrSpace'tir ve XrSpatialRaycastResultDataANDROID'in pozu bu alanda bulunur.time, XrSpatialRaycastResultDataANDROID'in duruşunun tanımlandığı birXrTime'dir.origin, ışının kaynağını açıklayan bir XrVector3f'dir.direction, ışının yönünü açıklayan bir XrVector3f'dir.maxDistance, uygulamanınoriginkonumundan belirtilen mesafedeki öğelerindirectionboyunca keşfedilmesini isteğe bağlı olarak sınırlamak için belirleyebileceği metrelik mesafedir.
Bir uygulama, bu yapı içinde tanımlanan ışınla kesişen uzamsal öğeleri keşfetmek için XrSpatialDiscoverySnapshotCreateInfoEXT :: next zincirine XrSpatialRaycastInfoANDROID ekleyebilir.
Bir uygulama, herhangi bir özellik için XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID etkinleştirilmeden yapılandırılmış bir XrSpatialContextEXT ile XrSpatialRaycastInfoANDROID kullanıyorsa çalışma zamanı, xrCreateSpatialDiscoverySnapshotAsyncEXT veya xrCreateSpatialRaycastSnapshotANDROID'den XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT döndürmelidir.
Çalışma zamanı, yalnızca XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID bileşenini destekleyen özelliklerden gelen XrSpatialSnapshotEXT içindeki uzamsal varlıkların bileşen verilerini ve kimliklerini içermelidir.
Bir uygulama maxDistance değerini pozitif bir değere ayarlarsa çalışma zamanı, direction boyunca panme:origin konumundan maxDistance daha uzakta olan hiçbir isabet uzamsal öğesini anlık görüntüye dahil etmemelidir . maxDistance değeri 0 veya negatif bir değer olarak ayarlanırsa çalışma zamanı, ışını sınırsız olarak kabul etmelidir.
Geçerli Kullanım (Dolaylı)
-
XR_ANDROID_spatial_discovery_raycastuzantısı, XrSpatialRaycastInfoANDROID kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
spaceGeçerli bir XrSpace hesabı olmalıdır.
Raycast Sonuç Bileşeni
XrSpatialRaycastResultDataANDROID yapısı şu şekilde tanımlanır:
typedef struct XrSpatialRaycastResultDataANDROID {
XrPosef hitPose;
float distanceSquared;
} XrSpatialRaycastResultDataANDROID;
Üye Açıklamaları
hitPose, ışının uzamsal varlıkla kesiştiği noktayı tanımlayan bir XrPosef'dir.distanceSquared, ışının başlangıç noktasından kesişim noktasına olan uzaklığın karesidir.
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID bileşeni yalnızca XrSpatialSnapshotEXT oluşturulurken xrCreateSpatialDiscoverySnapshotAsyncEXT işlevinin kullanıldığı ve XrSpatialRaycastInfoANDROID'in XrSpatialDiscoverySnapshotCreateInfoEXT :: next zincirine dahil edildiği durumlarda veya xrCreateSpatialRaycastSnapshotANDROID işleviyle oluşturulan XrSpatialSnapshotEXT'lerde bulunur .
Çalışma zamanı, xrCreateSpatialUpdateSnapshotEXT kullanılarak oluşturulan XrSpatialSnapshotEXT'lerin hiçbirinde bu bileşeni içermemelidir .
Uygulama XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes içinde XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID içeriyorsa çalışma zamanı xrCreateSpatialUpdateSnapshotEXT işlevinden XR_ERROR_VALIDATION_FAILURE döndürmelidir.
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID yalnızca belirli özellikler için etkinleştirilmişse çalışma zamanı, anlık görüntüye yalnızca bu özellikler tarafından sağlanan uzamsal öğeleri dahil etmelidir. Örneğin, bir nesne ve bir düzlem aynı yönde hizalanmışsa ve XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID yalnızca XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT için etkinleştirilmişse yalnızca düzlem keşfedilir.
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID hitPose, XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace içinde XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time konumunda yer alır . Pozitif Z ekseni, isabet eden yüzeyin normalidir ve negatif Y ekseni kabaca ışın kaynağına doğru yönelir.
Geçerli Kullanım (Dolaylı)
- XrSpatialRaycastResultDataANDROID kullanılmadan önce
XR_ANDROID_spatial_discovery_raycastuzantısı etkinleştirilmelidir.
Verileri sorgulamak için bileşen listesi yapısı
XrSpatialComponentRaycastResultListANDROID yapısı şu şekilde tanımlanır:
typedef struct XrSpatialComponentRaycastResultListANDROID {
XrStructureType type;
void* next;
uint32_t raycastResultCount;
XrSpatialRaycastResultDataANDROID* raycastResults;
} XrSpatialComponentRaycastResultListANDROID;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.raycastResultCount,raycastResultsdizisindeki öğelerin sayısını açıklayan biruint32_t'dir.raycastResults, XrSpatialRaycastResultDataANDROID dizisidir .
Bir XrSpatialSnapshotEXT içindeki uzamsal öğelerin ışın dökümü sonucu bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID ekleyin ve XrSpatialComponentRaycastResultListANDROID öğesini XrSpatialComponentDataQueryResultEXT :: next zincirine ekleyin.
Çalışma zamanı, XrSpatialComponentRaycastResultListANDROID, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa xrQuerySpatialComponentDataEXT'den XR_ERROR_VALIDATION_FAILURE döndürmelidir.
Çalışma zamanı, raycastResultCount değeri XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse xrQuerySpatialComponentDataEXT işlevinden XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.
Döndürülen raycastResults sıralanmamıştır. Bir uygulama, sonuçları mesafeye göre sıralamak için XrSpatialRaycastResultDataANDROID :: distanceSquared kullanabilir.
Geçerli Kullanım (Dolaylı)
-
XR_ANDROID_spatial_discovery_raycastuzantısı, XrSpatialComponentRaycastResultListANDROID kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
raycastResults,raycastResultCountXrSpatialRaycastResultDataANDROID yapılarından oluşan bir dizinin işaretçisi olmalıdır. -
raycastResultCountparametresi değerinden büyük olmalıdır.0
Yapılandırma
Bazı özellikler için XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID, XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde numaralandırılmışsa uygulama, numaralandırılmış değeri XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine ekleyerek bu özelliği etkinleştirebilir. Bu bileşenin, bir sonraki XrSpatialCapabilityConfigurationBaseHeaderEXT zincirine dahil edilmesi için özel bir yapılandırma gerekmez .
Uygulama XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes içinde XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID içeriyorsa çalışma zamanı xrCreateSpatialUpdateSnapshotEXT işlevinden XR_ERROR_VALIDATION_FAILURE döndürmelidir. Bu bileşen, keşif anlık görüntüleri için geçerlidir.
Derinlik Işını Yayınlama Uzamsal Yeteneği
Yapılandırma
XrSpatialCapabilityConfigurationDepthRaycastANDROID yapısı şu şekilde tanımlanır:
typedef struct XrSpatialCapabilityConfigurationDepthRaycastANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationDepthRaycastANDROID;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir.capability, XrSpatialCapabilityEXT ve zorunlu olmalıdırXR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID.enabledComponentCount,enabledComponentsdizisindeki öğelerin sayısını açıklayan biruint32_t'dir. 0'dan büyük olmalıdır.enabledComponents, XrSpatialComponentTypeEXT dizisine yönelik bir işaretçidir .
Uygulamalar, XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde XrSpatialCapabilityConfigurationDepthRaycastANDROID yapısına bir işaretçi ekleyerek XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID uzamsal özelliğini etkinleştirebilir .
Çalışma zamanı, capability değeri XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID değilse XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.
Bu özellik aracılığıyla keşfedilen öğelerin kimliği her zaman XR_NULL_SPATIAL_ENTITY_ID_EXT olur . Bu durum, uygulamanın bu öğeler için XrSpatialEntityEXT tutacağı oluşturamayacağı ve dolayısıyla güncelleme anlık görüntüsü oluşturmak için XrSpatialUpdateSnapshotCreateInfoEXT :: entities içine dahil edilemeyeceği anlamına da gelir.
Geçerli Kullanım (Dolaylı)
-
XR_ANDROID_spatial_discovery_raycastuzantısı, XrSpatialCapabilityConfigurationDepthRaycastANDROID kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır. -
enabledComponentsenabledComponentCountgeçerli XrSpatialComponentTypeEXT değerlerinden oluşan bir dizinin işaretçisi olmalıdır. -
enabledComponentCountparametresi değerinden büyük olmalıdır.0
Garantili Bileşenler
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID özelliğini destekleyen bir çalışma zamanı , bu özellik tarafından keşfedilen öğelerin garantili bileşenleri olarak aşağıdaki uzamsal bileşenleri desteklemeli ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT içinde listelemelidir:
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Eşzamanlı Raycast
xrCreateSpatialRaycastSnapshotANDROID işlevi şu şekilde tanımlanır:
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
Parametre Açıklamaları
spatialContext, daha önce xrCreateSpatialContextAsyncEXT kullanılarak oluşturulmuş bir XrSpatialContextEXT'dir .createInfo, XrSpatialRaycastSnapshotCreateInfoANDROID işaretçisidir .snapshot, XrSpatialSnapshotEXT işaretçisidir .
xrCreateSpatialDiscoverySnapshotAsyncEXT çoğu kullanım alanı için yeterli olsa da anlık ışın dökümü sonuçları gerektiren uygulamalar için yavaş kabul edilir. xrCreateSpatialRaycastSnapshotANDROID, anlık görüntü oluşturmak için senkron bir ışın dökümü başlatır. Bu sayede uygulamalar, ışın dökümü sonuçlarını hemen sorgulamaya başlayabilir.
Çalışma zamanı, spatialContext oluşturulurken XrSpatialContextCreateInfoEXT :: capabilityConfigs öğesine iletilen uzamsal özellikler için XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes içindeki XrSpatialComponentTypeEXT öğelerinden herhangi biri etkinleştirilmemişse XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT değerini döndürmelidir.
Uygulama, XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes içinde bir uzamsal bileşen türleri listesi sağlamıyorsa çalışma zamanı, spatialContext için yapılandırılmış ışın dökümü destekli özellikler için XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents içinde numaralandırılmış bileşenler kümesine sahip olan, anlık görüntüdeki tüm uzamsal öğeleri içermelidir . Çalışma zamanı, spatialContext için yapılandırılmış, ışın dökümü destekli özelliklerin etkinleştirilmiş tüm bileşenlerinin verilerini içermelidir .
Geçerli Kullanım (Dolaylı)
-
XR_ANDROID_spatial_discovery_raycastuzantısı, xrCreateSpatialRaycastSnapshotANDROID çağrılmadan önce etkinleştirilmelidir. -
spatialContextgeçerli bir XrSpatialContextEXT işleyeni olmalıdır. -
createInfogeçerli bir XrSpatialRaycastSnapshotCreateInfoANDROID yapısının işaretçisi olmalıdır. -
snapshotXrSpatialSnapshotEXT tutacına yönelik bir işaretçi olmalıdır.
Dönüş Kodları
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 yapısı şu şekilde tanımlanır:
typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
const XrSpatialRaycastInfoANDROID* raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;
Üye Açıklamaları
type, bu yapının XrStructureType'ıdır.next,NULLveya bir yapı zincirindeki sonraki yapının işaretçisidir. Temel OpenXR'de veya bu uzantıda bu tür yapılar tanımlanmamıştır.componentTypeCount,componentTypesdizisindeki öğelerin sayısını açıklayan biruint32_t'dir.componentTypes, XrSpatialComponentTypeEXT dizisidir .raycastInfo, bir ışının bilgilerini açıklayan XrSpatialRaycastInfoANDROID yapısıdır.
Geçerli Kullanım (Dolaylı)
- XrSpatialRaycastSnapshotCreateInfoANDROID kullanılmadan önce
XR_ANDROID_spatial_discovery_raycastuzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROIDolmalıdır. -
nextzorunlu olarakNULLveya bir yapı zincirindeki sonraki yapıya yönelik geçerli bir işaretçi olmalıdır. -
componentTypeCount,0değilsecomponentTypes, geçerli XrSpatialComponentTypeEXT değerlerinden oluşan bir diziye yönelik işaretçi olmalıdır.componentTypeCount -
raycastInfogeçerli bir XrSpatialRaycastInfoANDROID yapısına yönelik bir işaretçi olmalıdır.
Örnek kod
Derinlik ışını yayınını ve düzlem izleme özelliğini yapılandırma
Aşağıdaki örnek kodda, ışın dökümü işlevini destekleyen özelliklere sahip bir uzamsal bağlamın nasıl oluşturulacağı gösterilmektedir. Bu örnekte XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID ve XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT kullanılmaktadır.
// 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))
Uzamsal öğeleri keşfetme ve bileşen verilerini sorgulama
Aşağıdaki örnek kod, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID ve XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ile yapılandırılmış bir bağlam için mekansal öğelerin nasıl keşfedileceğini ve bileşen verilerinin nasıl sorgulanacağını gösterir.
// 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 anlık görüntüsü oluşturma
Aşağıdaki örnek kodda, senkron ışın dökümü anlık görüntüsünün nasıl oluşturulacağı gösterilmektedir.
// 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);
Yeni Komutlar
Yeni Yapılar
- XrSpatialCapabilityConfigurationDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
XrSpatialComponentDataQueryResultEXT'yi genişletme :
XrSpatialDiscoverySnapshotCreateInfoEXT'yi genişletme :
Yeni Enum Sabitleri
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAMEXR_ANDROID_spatial_discovery_raycast_SPEC_VERSIONXrSpatialCapabilityEXT uzatılıyor :
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
XrSpatialComponentTypeEXT'yi genişletme :
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
XrStructureType uzatma :
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
Sayılar
Sürüm Geçmişi
Düzeltme 1, 2025-07-15 (Brian Chen)
- İlk uzantı açıklaması.