XR_ANDROID_spatial_discovery_raycast
Name String
XR_ANDROID_spatial_discovery_raycast
Uzantı Türü
Örnek uzantısı
Kayıtlı Dahili Numara
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 bir fikri mülkiyet 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 kuruludur ve uzamsal varlıkları keşfetmek için XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT gibi mevcut uzamsal özelliklere ışın dökümü işlevi sağlar.
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 uygulamanın android.permission.SCENE_UNDERSTANDING_FINE iznine sahip olması gerekir. XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT kullanılıyorsa uygulamanın android.permission.SCENE_UNDERSTANDING_COARSE iznine sahip olması gerekir. android.permission.SCENE_UNDERSTANDING_FINE izni, android.permission.SCENE_UNDERSTANDING_COARSE iznini de kapsar. Uygulama her iki özelliği de kullanıyorsa 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 varlıkların keşfini destekliyorsa ışın dökümüyle keşfi destekleyen özellikler için xrEnumerateSpatialCapabilityComponentTypesEXT içinde XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID değerini listeleyerek bunu belirtmesi gerekir.
Çalışma zamanı, derinlik arabelleğine karşı ışın dökümünü destekliyorsa xrEnumerateSpatialCapabilitiesEXT içinde XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID değerini listelemesi gerekir.
Işın dökümüyle uzamsal varlıkları 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 değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.space, XrSpatialRaycastResultDataANDROID'nin duruşunun bulunacağı XrSpace'tir.time, XrSpatialRaycastResultDataANDROID pozunun tanımlandığı birXrTimedeğeridir.origin, ışının kaynağını açıklayan bir XrVector3f'dir.direction, ışının yönünü açıklayan bir XrVector3f'dir.maxDistance, uygulamanındirectionboyuncaoriginile arasındaki belirtilen mesafede bulunan varlıkların keşfini sınırlamak için isteğe bağlı olarak belirtebileceği metre cinsinden mesafedir.
Uygulamalar, bu yapıda tanımlanan ışınla kesişen uzamsal varlıkları keşfetmek için XrSpatialDiscoverySnapshotCreateInfoEXT :: next zincirine XrSpatialRaycastInfoANDROID'i 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ı, XrSpatialSnapshotEXT'te yalnızca XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID bileşenini destekleyen özelliklerden gelen uzamsal varlıkların bileşen verilerini ve kimliklerini içermelidir.
Bir uygulama maxDistance değerini pozitif bir değere ayarlarsa çalışma zamanı, anlık görüntüye direction boyunca panme:origin'den maxDistance uzaklıkta olan herhangi bir isabetli uzamsal varlığı dahil etmemelidir. maxDistance 0 veya negatif bir değere ayarlanırsa çalışma zamanı, ışını sınırsız olarak değerlendirmelidir.
Geçerli Kullanım (Dolaylı)
- XrSpatialRaycastInfoANDROID kullanılmadan önce
XR_ANDROID_spatial_discovery_raycastuzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
spacegeçerli bir XrSpace hesabı olmalıdır
Raycast Sonucu 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 mesafenin karesidir.
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID bileşeni yalnızca XrSpatialDiscoverySnapshotCreateInfoEXT :: next zincirine XrSpatialRaycastInfoANDROID'in dahil edildiği xrCreateSpatialDiscoverySnapshotAsyncEXT'ten oluşturulan bir XrSpatialSnapshotEXT'te veya xrCreateSpatialRaycastSnapshotANDROID'ten oluşturulan bir XrSpatialSnapshotEXT'te bulunur.
Çalışma zamanı, xrCreateSpatialUpdateSnapshotEXT kullanılarak oluşturulan hiçbir XrSpatialSnapshotEXT'te bu bileşeni içermemelidir.
Uygulama, XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes içinde XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID içeriyorsa çalışma zamanı, xrCreateSpatialUpdateSnapshotEXT'ten 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 varlıkları 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 algılanır.
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID öğesinin hitPose, XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace içinde, XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time konumunda bulunur. Pozitif Z ekseni, isabet yüzeyinin normalidir ve negatif Y ekseni kabaca ışın kaynağına doğru işaret eder.
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 değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.raycastResultCount,raycastResultsdizisindeki öğe sayısını açıklayan biruint32_tdeğeridir.raycastResults, XrSpatialRaycastResultDataANDROID dizisidir.
XrSpatialSnapshotEXT içindeki uzamsal varlıkların ışın dökümü sonuç bileşenini sorgulamak için XrSpatialComponentDataQueryConditionEXT :: componentTypes içine XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID ekleyin ve XrSpatialComponentDataQueryResultEXT :: next zincirine XrSpatialComponentRaycastResultListANDROID ekleyin.
XrSpatialComponentRaycastResultListANDROID, XrSpatialComponentDataQueryResultEXT :: next zincirindeyse ancak XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir (must).
raycastResultCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.
Döndürülen raycastResults sıralanmamış. Uygulamalar, sonuçları mesafeye göre sıralamak için XrSpatialRaycastResultDataANDROID :: distanceSquared kullanabilir.
Geçerli Kullanım (Dolaylı)
- XrSpatialComponentRaycastResultListANDROID kullanılmadan önce
XR_ANDROID_spatial_discovery_raycastuzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
raycastResults,raycastResultCountXrSpatialRaycastResultDataANDROID yapılarından oluşan bir diziye işaretçi olmalıdır. -
raycastResultCountparametresi0değerinden büyük olmalıdır.
Yapılandırma
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, enum değerini XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine ekleyerek bu özelliği etkinleştirebilir. Bu bileşenin, 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'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir. Bu bileşen, keşif anlık görüntülerine özeldir.
Derinlik Işın Atma Uzamsal Özelliğ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 değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.capability, bir XrSpatialCapabilityEXT'tir veXR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROIDolmalıdır.enabledComponentCount,enabledComponentsdizisindeki öğe sayısını açıklayan biruint32_tdeğeridir. 0'dan büyük olmalıdır.enabledComponents, XrSpatialComponentTypeEXT dizisine işaret eden bir göstergedir.
Uygulamalar, XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationDepthRaycastANDROID yapısına işaretçi ekleyerek XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID uzamsal özelliğini etkinleştirebilir.
capability, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.
Bu özellik aracılığıyla keşfedilen varlıkların kimliği her zaman XR_NULL_SPATIAL_ENTITY_ID_EXT olur. Bu aynı zamanda uygulamanın bu varlıklar için bir XrSpatialEntityEXT herkese açık kullanıcı adı oluşturamayacağı ve bu nedenle güncelleme anlık görüntüsü oluşturmak için XrSpatialUpdateSnapshotCreateInfoEXT :: entities dosyasına eklenemeyeceği anlamına gelir.
Geçerli Kullanım (Dolaylı)
- XrSpatialCapabilityConfigurationDepthRaycastANDROID kullanılmadan önce
XR_ANDROID_spatial_discovery_raycastuzantısı etkinleştirilmelidir -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır -
enabledComponents,enabledComponentCountgeçerli XrSpatialComponentTypeEXT değerinden oluşan bir diziye işaretçi olmalıdır -
enabledComponentCountparametresi0değerinden büyük olmalıdır.
Garantili Bileşenler
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID özelliğini destekleyen bir çalışma zamanı, bu özellik tarafından keşfedilen varlıkların garantili bileşenleri olarak aşağıdaki uzamsal bileşenleri desteklemeli (must) ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT içinde listelemelidir (must):
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'tir.createInfo, bir XrSpatialRaycastSnapshotCreateInfoANDROID işaretçisidir.snapshot, bir XrSpatialSnapshotEXT işaretçisidir.
xrCreateSpatialDiscoverySnapshotAsyncEXT çoğu kullanım alanı için yeterli olsa da anında ışın dökümü sonuçları gerektiren uygulamalar için yavaş kabul edilir. xrCreateSpatialRaycastSnapshotANDROID, anlık görüntü oluşturmak için eşzamanlı bir ışın dökümü başlatır. Bu sayede uygulamalar, ışın dökümü sonuçlarını hemen sorgulamaya başlayabilir.
XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes içindeki XrSpatialComponentTypeEXT öğelerinden herhangi biri, spatialContext oluşturulurken XrSpatialContextCreateInfoEXT :: capabilityConfigs öğesine iletilen uzamsal özellikler için etkinleştirilmemişse çalışma zamanı XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT değerini döndürmelidir (must).
Uygulama, XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes içinde uzamsal bileşen türlerinin listesini sağlamazsa çalışma zamanı, spatialContext için yapılandırılmış ışın yayma destekli özellikler için XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents içinde listelenen bileşen grubuna sahip olan anlık görüntüdeki tüm uzamsal varlıkları içermelidir . Çalışma zamanı, spatialContext için yapılandırılan ışın dökümü destekli özelliklerin tüm etkin bileşenlerine ait verileri içermelidir.
Geçerli Kullanım (Dolaylı)
-
XR_ANDROID_spatial_discovery_raycastuzantısı, xrCreateSpatialRaycastSnapshotANDROID çağrılmadan önce etkinleştirilmelidir. -
spatialContext, geçerli bir XrSpatialContextEXT herkese açık kullanıcı adı olmalıdır -
createInfo, geçerli bir XrSpatialRaycastSnapshotCreateInfoANDROID yapısına işaret eden bir işaretçi olmalıdır. -
snapshot, bir XrSpatialSnapshotEXT herkese açık adına 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 değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir. Temel OpenXR'da veya bu uzantıda bu tür yapılar tanımlanmamıştır.componentTypeCount,componentTypesdizisindeki öğe sayısını açıklayan biruint32_tdeğeridir.componentTypes, XrSpatialComponentTypeEXT dizisidir.raycastInfo, bir ışının bilgilerini açıklayan XrSpatialRaycastInfoANDROID yapısıdır.
Geçerli Kullanım (Dolaylı)
-
XR_ANDROID_spatial_discovery_raycastuzantısı, XrSpatialRaycastSnapshotCreateInfoANDROID kullanılmadan önce etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROIDolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
componentTypeCount,0değilsecomponentTypes,componentTypeCountgeçerli XrSpatialComponentTypeEXT değerinden oluşan bir dizinin işaretçisi olmalıdır. -
raycastInfo, geçerli bir XrSpatialRaycastInfoANDROID yapısına işaret eden bir işaretçi olmalıdır.
Örnek kod
Derinlik Işın Atma ve Düzlem İzleme Ö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ılmıştı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))
Mekansal Varlıkları Keşfetme ve Bileşen Verilerini Sorgulama
Aşağıdaki örnek kodda, XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID ve XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT ile yapılandırılmış bir bağlam için uzamsal varlıkların nasıl keşfedileceği ve bileşen verilerinin nasıl sorgulanacağı gösterilmektedir.
// 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, eşzamanlı ışı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'yi genişletme:
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
XrSpatialComponentTypeEXT'yi genişletme:
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
XrStructureType'ı genişletme:
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, 15.07.2025 (Brian Chen)
- İlk uzantı açıklaması.