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, NULL veya 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ığı bir XrTime'dir.
  • origin, ışının kaynağını açıklayan bir XrVector3f'dir.
  • direction, ışının yönünü açıklayan bir XrVector3f'dir.
  • maxDistance , uygulamanın origin konumundan belirtilen mesafedeki öğelerin direction boyunca 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ı)

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ı)

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, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir.
  • raycastResultCount, raycastResults dizisindeki öğelerin sayısını açıklayan bir uint32_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ı)

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, NULL veya bir yapı zincirindeki sonraki yapının işaretçisidir.
  • capability, XrSpatialCapabilityEXT ve zorunlu olmalıdır XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID .
  • enabledComponentCount, enabledComponents dizisindeki öğelerin sayısını açıklayan bir uint32_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ı)

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ı

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ı)

Dönüş Kodları

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

  • 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 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, NULL veya 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, componentTypes dizisindeki öğelerin sayısını açıklayan bir uint32_t'dir.
  • componentTypes, XrSpatialComponentTypeEXT dizisidir .
  • raycastInfo, bir ışının bilgilerini açıklayan XrSpatialRaycastInfoANDROID yapısıdır.

Geçerli Kullanım (Dolaylı)

Ö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

Yeni Enum Sabitleri

  • XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAME
  • XR_ANDROID_spatial_discovery_raycast_SPEC_VERSION
  • XrSpatialCapabilityEXT 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_ANDROID
    • XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID
    • XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID
    • XR_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ı.