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

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

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, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • raycastResultCount, raycastResults dizisindeki öğe sayısını açıklayan bir uint32_t değ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ı)

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, NULL veya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.
  • capability, bir XrSpatialCapabilityEXT'tir ve XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID olmalıdır.
  • enabledComponentCount, enabledComponents dizisindeki öğe sayısını açıklayan bir uint32_t değ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ı)

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ı

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

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

Geçerli Kullanım (Dolaylı)

Ö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

Yeni Enum Sabitleri

  • XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAME
  • XR_ANDROID_spatial_discovery_raycast_SPEC_VERSION
  • XrSpatialCapabilityEXT'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_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, 15.07.2025 (Brian Chen)

    • İlk uzantı açıklaması.