XR_EXT_spatial_image_tracking

Name String

XR_EXT_spatial_image_tracking

Uzantı Türü

Örnek uzantısı

Kayıtlı Dahili Numara

783

Düzeltme

1

Onay Durumu

Onaylanmadı

Uzantı ve Sürüm Bağımlılıkları

XR_EXT_spatial_entity

Katkıda bulunanlar

Daniel Guttenberg, Qualcomm
Nihav Jain, Google
Jared Finder, Google
Zhipeng Liu, ByteDance

Genel Bakış

Bu uzantı, XR_EXT_spatial_entity uzantısı için görüntü izleme özelliği sağlar. Uygulamaların, giriş referans görseli grupları tarafından belirtilen belirli düzlemsel görselleri algılamasını ve izlemesini sağlar.

İzlenen bir resim, aşağıdaki bileşenleri içeren (veya "sahip olan") uzamsal bir varlık olarak temsil edilir:

  • XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

Uygulamalar genellikle uzamsal görüntü izleme uzantısını aşağıdaki düzende kullanır:

  • Uygulama, önceden yüklenmiş referans görsel verisi kümelerine göre bir veya daha fazla XrSpatialImageTrackingDatabaseEXT herkese açık kullanıcı adı oluşturur.
  • Uygulama daha sonra, daha önce oluşturulan XrSpatialImageTrackingDatabaseEXT tanıtıcılarına göre bir XrSpatialContextEXT tanıtıcısı oluşturur.
  • Ardından uygulama, bellek tüketimini azaltmak için referans görsel verilerini serbest bırakır.
  • Uygulama, mekansal varlık erişim kalıplarına göre görüntüleri keşfeder ve sorgular.
  • Uygulama, ek referans görsel grupları yükleyebilir ve bunlardan ek XrSpatialImageTrackingDatabaseEXT ve ardından XrSpatialContextEXT oluşturarak algılanabilir ve izlenebilir görsel grubunu çalışma zamanında dinamik olarak genişletebilir.
  • Uygulama, çalışma zamanında algılanabilir ve izlenebilir görüntü kümesini dinamik olarak azaltmak için XrSpatialImageTrackingDatabaseEXT tanıtıcılarını yok edebilir.
  • Uygulama, çalışma zamanında algılanabilir ve izlenebilir resim grubunu dinamik olarak azaltmak için XrSpatialContextEXT herkese açık kullanıcı adlarını yok edebilir.

Çalışma Zamanı Desteği

Çalışma zamanı, aşağıdaki özelliği listeleyerek xrEnumerateSpatialCapabilitiesEXT kullanarak görüntü izleme özelliğini desteklediğini bildirmelidir :

  • XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT

Yapılandırma

Uygulama, düzlemsel görüntülerin algılanmasını ve izlenmesini etkinleştirmek için xrCreateSpatialContextAsyncEXT işlevini çağırırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde XrSpatialCapabilityConfigurationImageTrackingEXT yapılarını iletebilir ve her XrSpatialCapabilityConfigurationImageTrackingEXT :: imageTrackingDatabases içinde< XrSpatialImageTrackingDatabaseEXT yapılarının dizilerini iletebilir.

Giriş Görüntü Seti Oluşturma

Algılanacak ve izlenecek referans görselleri belirtmek için uygulamanın en az bir giriş referans görseli grubu oluşturması gerekir. Bir giriş referans görseli grubu, XrSpatialImageTrackingDatabaseEXT herkese açık kullanıcı adı ile temsil edilir ve en az bir görsel içerir.

XR_DEFINE_HANDLE(XrSpatialImageTrackingDatabaseEXT)

XrSpatialImageTrackingDatabaseEXT herkese açık kullanıcı adı, kullanıcının ortamındaki belirli sayıda uzamsal görüntüyü keşfetme ve güncelleme kaynaklarını temsil eder. Uygulamalar, bu uzantıdaki diğer işlevleri kullanarak uzamsal görüntüleri keşfetmek ve güncellemek için bu herkese açık adı kullanabilir.

Uzamsal Görüntü İzleme Veritabanı oluşturma

xrCreateSpatialImageTrackingDatabaseAsyncEXT işlevi şu şekilde tanımlanır:

XrResult xrCreateSpatialImageTrackingDatabaseAsyncEXT(
    XrSession                                   session,
    const XrSpatialImageTrackingDatabaseCreateInfoEXT* createInfo,
    XrFutureEXT*                                future);

Parametre Açıklamaları

  • session, üç boyutlu görüntü izleme veritabanının etkin olacağı bir XrSession'dır.
  • createInfo, uzamsal görüntü izleme veritabanı parametrelerini belirtmek için kullanılan XrSpatialImageTrackingDatabaseCreateInfoEXT'tir.
  • future, bir XrFutureEXT işaretçisidir.

Uygulamalar, xrCreateSpatialImageTrackingDatabaseAsyncEXT işlevini kullanarak XrSpatialImageTrackingDatabaseEXT herkese açık anahtarı oluşturabilir ve görüntü izleme veritabanının giriş referans görüntüleri kümelerini createInfo ile yapılandırabilir.

Giriş referans görsellerinden herhangi birinin XrSpatialReferenceImageEXT :: format değeri xrEnumerateSpatialReferenceImageFormatsEXT tarafından numaralandırılmamışsa çalışma zamanı XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXT değerini döndürmelidir .

Giriş referans görsellerinden herhangi birinin XrSpatialReferenceImageEXT :: planes dizisi, XrSpatialReferenceImageEXT'in referans görsel meta verilerine göre değerlendirilemiyorsa çalışma zamanı XR_ERROR_SPATIAL_IMAGE_INVALID_EXT değerini döndürmelidir (must).

Giriş referans görsellerinden herhangi birinin XrSpatialReferenceImageEXT :: planes dizisi, XrSpatialReferenceImageEXT :: format kadar renk kanalı sağlamıyorsa çalışma zamanı XR_ERROR_SPATIAL_IMAGE_INVALID_EXT değerini döndürmelidir.

Çalışma zamanı, uygulama erişimini görüntü izleme özelliğine göre kontrol etmek için bir izin sistemi uyguluyorsa bu izinler uygulamaya verilmediğinde çalışma zamanı XR_ERROR_PERMISSION_INSUFFICIENT değerini döndürmelidir.

Bu işlev, eşzamansız bir işlem başlatır ve xrPollFutureEXT ve ilgili işlevlerle kullanılabilen karşılık gelen bir XrFutureEXT oluşturur. Bu işlevin döndürdüğü değer, yalnızca parametrelerin eşzamansız işlemi planlamak için kabul edilebilir olup olmadığını gösterir. İlgili tamamlama işlevi xrCreateSpatialImageTrackingDatabaseCompleteEXT'tir. Bu işlevden elde edilen bir gelecek READY durumundayken kullanılabilir. Çıkışlar, tamamlama yapısında XrCreateSpatialImageTrackingDatabaseCompletionEXT bu işlev tarafından doldurulur.

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_PERMISSION_INSUFFICIENT
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXT
  • XR_ERROR_SPATIAL_IMAGE_INVALID_EXT
  • XR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialImageTrackingDatabaseCreateInfoEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialImageTrackingDatabaseCreateInfoEXT {
    XrStructureType                      type;
    const void*                          next;
    uint32_t                             spatialReferenceImageCount;
    const XrSpatialReferenceImageEXT*    spatialReferenceImages;
} XrSpatialImageTrackingDatabaseCreateInfoEXT;

Ü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.
  • spatialReferenceImageCount, spatialReferenceImages dizisindeki öğe sayısıdır.
  • spatialReferenceImages, XrSpatialReferenceImageEXT dizisidir.

XrSpatialImageTrackingDatabaseCreateInfoEXT yapısı, XrSpatialImageTrackingDatabaseEXT herkese açık kullanıcı adını oluşturmak için gereken bilgileri açıklar.

Her XrSpatialImageTrackingDatabaseEXT, XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages dizisinde en az bir XrSpatialReferenceImageEXT ile oluşturulmalıdır.

Geçerli Kullanım (Dolaylı)

xrCreateSpatialImageTrackingDatabaseCompleteEXT işlevi şu şekilde tanımlanır:

XrResult xrCreateSpatialImageTrackingDatabaseCompleteEXT(
    XrSession                                   session,
    XrFutureEXT                                 future,
    XrCreateSpatialImageTrackingDatabaseCompletionEXT* completion);

Parametre Açıklamaları

xrCreateSpatialImageTrackingDatabaseCompleteEXT, xrCreateSpatialImageTrackingDatabaseAsyncEXT tarafından başlatılan eşzamansız işlemi tamamlar.

Çalışma zamanı, tamamlandıktan sonra bu xrCreateSpatialImageTrackingDatabaseAsyncEXT çağrısı için XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages giriş dizisi tarafından sağlanan hiçbir XrSpatialReferenceImagePlaneEXT :: buffer işaretçisine erişmemelidir. Uygulama, bellekte kapladığı yeri azaltmak için xrCreateSpatialImageTrackingDatabaseAsyncEXT tamamlandıktan sonra tüm XrSpatialReferenceImagePlaneEXT :: buffer verilerini serbest bırakabilir.

future hazır durumda değilse çalışma zamanı XR_ERROR_FUTURE_PENDING_EXT değerini döndürmelidir (must). future zaten tamamlanmış veya iptal edilmişse çalışma zamanı XR_ERROR_FUTURE_INVALID_EXT değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

Dönüş Kodları

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_FUTURE_INVALID_EXT
  • XR_ERROR_FUTURE_PENDING_EXT
  • 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_VALIDATION_FAILURE

XrCreateSpatialImageTrackingDatabaseCompletionEXT yapısı şu şekilde tanımlanır:

typedef struct XrCreateSpatialImageTrackingDatabaseCompletionEXT {
    XrStructureType                      type;
    void*                                next;
    XrResult                             futureResult;
    XrSpatialImageTrackingDatabaseEXT    database;
} XrCreateSpatialImageTrackingDatabaseCompletionEXT;

Üye Açıklamaları

Gelecekteki İade Kodları

futureResult değer:

Başarılı

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Hata

  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXT
  • XR_ERROR_SPATIAL_IMAGE_INVALID_EXT

futureResult bir başarı koduysa database geçerli bir herkese açık kullanıcı adı olmalıdır. database geçerliyse yalnızca xrCreateSpatialImageTrackingDatabaseAsyncEXT :: session yaşam döngüsü içinde veya uygulama xrDestroySpatialImageTrackingDatabaseEXT ile database öğesini yok edene kadar (hangisi önce gerçekleşirse) geçerli kalır.

Geçerli Kullanım (Dolaylı)

Üç Boyutlu Resim İzleme Veritabanı'nı silme

xrDestroySpatialImageTrackingDatabaseEXT işlevi şu şekilde tanımlanır:

XrResult xrDestroySpatialImageTrackingDatabaseEXT(
    XrSpatialImageTrackingDatabaseEXT           database);

Parametre Açıklamaları

Uygulama, uzamsal görüntü keşfi ve güncelleme görevleri tamamlandığında database tutamacını ve temel kaynakları serbest bırakmak için xrDestroySpatialImageTrackingDatabaseEXT işlevini çağırabilir.

Uygulama, xrDestroySpatialContextEXT işlevini çağırmadan önce xrDestroySpatialImageTrackingDatabaseEXT işlevini çağırabilir. Çalışma zamanı, bu imha edilmiş XrSpatialImageTrackingDatabaseEXT tarafından yönetilen görüntüleri artık raporlamamalıdır (must). Çalışma zamanı, diğer veritabanları tarafından yönetilen görüntüleri raporlamaya devam etmelidir.

Çalışma zamanı, xrCreateSpatialDiscoverySnapshotCompleteEXT tarafından döndürülen keşif anlık görüntülerinin, uygulama xrCreateSpatialDiscoverySnapshotAsyncEXT'yi çağırdıktan sonra yok edilmiş olsa bile yok edilmiş veya başka bir şekilde geçersiz XrSpatialImageTrackingDatabaseEXT herkese açık kullanıcı adlarıyla ilgili resimler içermediğinden emin olmalıdır. Uzamsal anlık görüntüdeki veriler değiştirilemez olduğundan uygulama, database öğesini yok etmeden önce oluşturulan tüm XrSpatialSnapshotEXT tanıtıcılarını yok etmelidir. Aksi takdirde uygulama, xrQuerySpatialComponentDataEXT kullanırken geçersiz XrSpatialImageTrackingDatabaseEXT tanıtıcıları alabilir.

Uygulama, XrSpatialContextEXT'nin oluşturulduğu XrSpatialImageTrackingDatabaseEXT tanıtıcılarından herhangi birini yok etmeden önce XrSpatialContextEXT tanıtıcısını serbest bırakmak için xrDestroySpatialContextEXT işlevini çağırabilir. Çalışma zamanı, XrSpatialContextEXT yok edildiğinde bu XrSpatialImageTrackingDatabaseEXT tanıtıcılarını dolaylı olarak yok etmemelidir.

XrSpatialContextEXT ve XrSpatialImageTrackingDatabaseEXT'nin kullanım ömrünü bağımsız olarak yönetmek, uygulamaların daha önce oluşturulmuş XrSpatialImageTrackingDatabaseEXT tanıtıcılarını, maliyetli oluşturma prosedürünü yeniden uygulamaya gerek kalmadan tekrar kullanmasına olanak tanır.

Örneğin, bir XrSpatialContextEXT'i yok edip daha sonra aynı XrSpatialImageTrackingDatabaseEXT ile başka bir XrSpatialContextEXT oluşturmak, başka bir başlatma prosedürü uygulamaya gerek kalmadan görüntü izlemeyi duraklatıp devam ettirmeyi sağlar.

Geçerli Kullanım (Dolaylı)

İleti Dizisi Güvenliği

  • database ve tüm alt herkese açık kullanıcı adlarına erişim harici olarak senkronize edilmelidir.

Dönüş Kodları

Başarılı

  • XR_SUCCESS

Hata

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_RUNTIME_FAILURE

Giriş Resmi Biçimi Desteği

Uygulamalar, desteklenen giriş referans görsel biçimlerinin listesini almak için xrEnumerateSpatialReferenceImageFormatsEXT'i çağırmalıdır (should).

xrEnumerateSpatialReferenceImageFormatsEXT işlevi şu şekilde tanımlanır:

XrResult xrEnumerateSpatialReferenceImageFormatsEXT(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    XrSpatialCapabilityEXT                      capability,
    uint32_t                                    formatCapacityInput,
    uint32_t*                                   formatCountOutput,
    XrSpatialReferenceImageFormatEXT*           formats);

Parametre Açıklamaları

  • instance, bir XrInstance için herkese açık kullanıcı adıdır.
  • systemId, giriş referans görseli biçimleri numaralandırılacak XrSystemId değeridir.
  • capability, giriş referans görsel biçimlerinin numaralandırılacağı XrSpatialCapabilityEXT'tir.
  • formatCapacityInput, formats dizisinin kapasitesidir veya gerekli kapasiteyi alma isteğini belirtmek için 0'dır.
  • formatCountOutput, biçimlerin sayısı veya formatCapacityInput yetersiz olduğunda gereken kapasitedir.
  • formats, XrSpatialReferenceImageFormatEXT dizisidir. formatCapacityInput 0 ise NULL olabilir.
  • Gerekli formats boyutunu alma hakkında ayrıntılı açıklama için Arabellek Boyutu Parametreleri bölümüne bakın.

Uygulama, xrEnumerateSpatialReferenceImageFormatsEXT kullanarak belirli bir XrSpatialCapabilityEXT için belirli bir XrSystemId tarafından desteklenen giriş referans görsel biçimlerinin listesini numaralandırabilir.

Çalışma zamanı, instance için etkinleştirilmemiş uzantıların biçimlerini listelememelidir.

Geçerli Kullanım (Dolaylı)

Dönüş Kodları

Başarılı

  • XR_SUCCESS

Hata

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

Herhangi bir uzantı tarafından desteklenen tüm referans görsel biçimlerinin tam listesi için XrSpatialReferenceImageFormatEXT sayfasına bakın.

typedef enum XrSpatialReferenceImageFormatEXT {
    XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT = 1,
    XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT = 2,
    XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT = 3,
    XR_SPATIAL_REFERENCE_IMAGE_FORMAT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialReferenceImageFormatEXT;

XrSpatialReferenceImageFormatEXT numaralandırması, çalışma zamanının destekleyebileceği giriş referans görsel biçimlerini tanımlar.

En azından XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT değeri ve XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT değeri desteklenmelidir.

Numaralandırıcılar aşağıdaki anlamlara sahiptir:

Numaralandırma Açıklamaları

  • XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT: RGBA arabelleği. Biçim, bellekteki piksel verilerinin düzeniyle ilgili herhangi bir garanti vermez. Piksellere, ilgili XrSpatialReferenceImagePlaneEXT yapıları tarafından sağlanan meta veriler kullanılarak erişilmesi gerekir. Her piksel renk kanalı 8 bit boyutundadır ve her pikselin boyutu 32 bit olur.
  • XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGB_888_EXT: RGB arabelleği. Biçim, bellekteki piksel verilerinin düzeniyle ilgili herhangi bir garanti vermez. Piksellere, ilgili XrSpatialReferenceImagePlaneEXT yapıları tarafından sağlanan meta veriler kullanılarak erişilmesi gerekir. Her piksel renk kanalı 8 bit boyutundadır ve her pikselin boyutu 24 bit olur.
  • XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT: 4:2:0 kalıbında renk alt örneklemesi yapılmış bir YUV arabelleği. Biçim, bellekteki piksel verilerinin düzeniyle ilgili herhangi bir garanti vermez. Piksellere, ilgili XrSpatialReferenceImagePlaneEXT yapıları tarafından sağlanan meta veriler kullanılarak erişilmesi gerekir. Kodu çözülen her RGB piksel renk kanalının boyutu 8 bittir. Bu da her pikselin boyutunu 24 bit yapar.

Uzamsal Görüntü İzleme Ayarları

Bu uzantı, uygulamanın görüntü izleme özelliğini yapılandırmak için kullanabileceği isteğe bağlı yapılar sağlar.

Statik Resim Optimizasyonu

XrSpatialImageStaticOptimizationEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialImageStaticOptimizationEXT {
    XrStructureType    type;
    const void*        next;
    XrBool32           optimizeForStaticImage;
} XrSpatialImageStaticOptimizationEXT;

Ü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.
  • optimizeForStaticImage, resimlerin hareket edip etmediğini gösteren bir XrBool32. XR_TRUE değeri, resimlerin hareket etmediğini gösterir.

XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT özelliği için xrEnumerateSpatialCapabilityFeaturesEXT tarafından numaralandırılıyorsa uygulama, XrSpatialImageStaticOptimizationEXT'i XrSpatialImageTrackingDatabaseCreateInfoEXT :: next zincirine veya XrSpatialReferenceImageEXT :: next zincirine zincirleyebilir.

Uygulama, XrSpatialImageStaticOptimizationEXT'yi XrSpatialImageTrackingDatabaseCreateInfoEXT yapısına zincirlerse optimizeForStaticImage, XR_TRUE olarak ayarlandığında çalışma zamanı, ilgili XrSpatialImageTrackingDatabaseEXT'nin tüm resimlerinin statik olduğunu varsaymalıdır . Buna göre, optimizeForStaticImage XR_FALSE olarak ayarlanırsa çalışma zamanı, ilgili XrSpatialImageTrackingDatabaseEXT'nin tüm resimlerinin statik olmadığını varsaymalıdır.

Uygulama, XrSpatialImageStaticOptimizationEXT'yi XrSpatialReferenceImageEXT yapısına zincirlerse optimizeForStaticImage, XR_TRUE olarak ayarlandığında çalışma zamanı bu referans görselin statik olduğunu varsaymalıdır . Buna göre, optimizeForStaticImage değeri XR_FALSE olarak ayarlanmışsa çalışma zamanı, bu referans görüntünün statik olmadığını varsaymalıdır. XrSpatialImageStaticOptimizationEXT yapısını XrSpatialReferenceImageEXT yapısına zincirlemek, XrSpatialImageTrackingDatabaseCreateInfoEXT yapısına zincirlemeye göre önceliklidir.

XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT özelliği için xrEnumerateSpatialCapabilityFeaturesEXT tarafından listelenmiyorsa ve uygulama, geçerli sonraki zincirlerden herhangi birine bir XrSpatialImageStaticOptimizationEXT yapısı zincirliyorsa çalışma zamanı, xrCreateSpatialImageTrackingDatabaseAsyncEXT'ten XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir .

Bu, çalışma zamanının daha doğru bir poz ve boyut oluşturmasına olanak tanıyabilir.

Bu, çalışma zamanının güç tüketimini azaltmasına olanak tanıyabilir.

Geçerli Kullanım (Dolaylı)

Referans Görsel Genişliği

XrSpatialImageSizeEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialImageSizeEXT {
    XrStructureType    type;
    const void*        next;
    float              physicalWidth;
} XrSpatialImageSizeEXT;

Ü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.
  • physicalWidth, ayarlanacak fiziksel genişliği metre cinsinden temsil eden bir float değeridir.

XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT özelliği için xrEnumerateSpatialCapabilityFeaturesEXT tarafından numaralandırılıyorsa uygulama, XrSpatialImageSizeEXT'yi XrSpatialImageTrackingDatabaseCreateInfoEXT :: next veya XrSpatialReferenceImageEXT :: next ile zincirleyebilir (can).

Uygulama, XrSpatialImageSizeEXT'yi XrSpatialImageTrackingDatabaseCreateInfoEXT yapısına zincirlerse çalışma zamanı, söz konusu XrSpatialImageTrackingDatabaseEXT'nin tüm resimlerinin physicalWidth metre genişliğe ve XrSpatialReferenceImageEXT :: width ve XrSpatialReferenceImageEXT :: height aracılığıyla dolaylı olarak sağlanan en boy oranına göre bir yüksekliğe sahip olduğunu varsaymalıdır.

Uygulama, XrSpatialImageSizeEXT'yi XrSpatialReferenceImageEXT yapısına zincirlerse çalışma zamanı, bu referans görselin genişliğinin physicalWidth metre olduğunu ve yüksekliğinin XrSpatialReferenceImageEXT :: width ve XrSpatialReferenceImageEXT :: height aracılığıyla dolaylı olarak sağlanan en boy oranına göre olduğunu varsaymalıdır. XrSpatialImageSizeEXT yapısını XrSpatialReferenceImageEXT yapısına zincirlemek, XrSpatialImageTrackingDatabaseCreateInfoEXT yapısına zincirlemeye göre önceliklidir.

Bu, çalışma zamanının daha doğru bir poz ve boyut döndürmesine olanak tanıyabilir.

Çalışma zamanı, XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT veya XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT ya da her ikisini birden numaralandırmalıdır.

XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT, xrEnumerateSpatialCapabilityFeaturesEXT tarafından numaralandırılıyorsa çalışma zamanı, uygulamanın geçerli sonraki zincirlerden herhangi birinin parçası olarak XrSpatialImageSizeEXT yapıları sağlamadığı resimler için otomatik olarak resim boyutları sağlamalıdır (must).

Çalışma zamanının, yapay görüntü boyutlarını otomatik ve doğru bir şekilde oluşturabilmesi için belirli cihaz özellikleri ve ön koşullar gerekebilir (ör. stereo kameralar, doğru şekilde kalibre edilmiş kamera dış ve iç parametreleri).

XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT, xrEnumerateSpatialCapabilityFeaturesEXT tarafından listelenmiyorsa uygulama, XrSpatialImageSizeEXT yapılarını geçerli sonraki zincirlere bağlamalıdır (must). Böylece tüm resimler için açık bir boyut sağlanır. Aksi takdirde çalışma zamanı, xrCreateSpatialImageTrackingDatabaseAsyncEXT'ten XR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

XrSpatialCapabilityConfigurationImageTrackingEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialCapabilityConfigurationImageTrackingEXT {
    XrStructureType                             type;
    const void*                                 next;
    XrSpatialCapabilityEXT                      capability;
    uint32_t                                    enabledComponentCount;
    const XrSpatialComponentTypeEXT*            enabledComponents;
    uint32_t                                    imageTrackingDatabaseCount;
    const XrSpatialImageTrackingDatabaseEXT*    imageTrackingDatabases;
} XrSpatialCapabilityConfigurationImageTrackingEXT;

Ü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_IMAGE_TRACKING_EXT olmalıdır.
  • enabledComponentCount, enabledComponents içindeki öğe sayısını belirten bir uint32_t değeridir.
  • enabledComponents, bu özellik için etkinleştirilecek bileşenleri belirten bir XrSpatialComponentTypeEXT dizisidir.
  • imageTrackingDatabaseCount, imageTrackingDatabases içindeki öğe sayısını belirten bir unint32_t değeridir.
  • imageTrackingDatabases, uzamsal bağlam için etkinleştirilecek görüntü izleme veritabanlarını belirten bir XrSpatialImageTrackingDatabaseEXT tanıtıcı dizisidir.

Görüntü izleme destekleniyorsa xrCreateSpatialContextAsyncEXT çağrılırken XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationImageTrackingEXT yapısı iletilirse çalışma zamanı görüntü izlemeyi etkinleştirmelidir .

XrSpatialCapabilityConfigurationImageTrackingEXT yapısı, uygulamanın imageTrackingDatabases içindeki XrSpatialImageTrackingDatabaseEXT tanıtıcıları tarafından temsil edilen referans görselleri keşfetmesini sağlar.

XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, xrEnumerateSpatialCapabilitiesEXT tarafından numaralandırılmamışsa çalışma zamanı XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT değerini döndürmelidir (must).

Geçerli Kullanım (Dolaylı)

Uzamsal Referans Görseli

XrSpatialReferenceImagePlaneEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialReferenceImagePlaneEXT {
    uint32_t    bufferSize;
    uint8_t*    buffer;
    uint32_t    rowStride;
    uint32_t    pixelStride;
} XrSpatialReferenceImagePlaneEXT;

Parametre Açıklamaları

  • bufferSize, buffer dizisinin boyutudur.
  • buffer, düzlem verilerini temsil eden bir uint8_t veri dizisidir.
  • rowStride, ardışık piksel veri satırlarının iki başlangıç konumu arasındaki bayt cinsinden mesafedir.
  • pixelStride, birbirini takip eden iki piksel arasındaki bayt cinsinden mesafedir.

Çalışma zamanı, rowStride ve pixelStride parametrelerinin sağladığı kalıplara göre buffer erişimine sahip olmalıdır.

Uygulama, rowStride ve pixelStride değerlerini, çalışma zamanında yalnızca bu XrSpatialReferenceImagePlaneEXT'nin anlamlı pikselleri ayıklanacak şekilde ayarlamalıdır (must).

Geçerli Kullanım (Dolaylı)

  • XR_EXT_spatial_image_tracking uzantısı, XrSpatialReferenceImagePlaneEXT kullanılmadan önce etkinleştirilmelidir
  • buffer, bufferSize uint8_t değerlerinden oluşan bir dizinin işaretçisi olmalıdır
  • bufferSize parametresi 0 değerinden büyük olmalıdır.

XrSpatialReferenceImageEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialReferenceImageEXT {
    XrStructureType                           type;
    const void*                               next;
    uint32_t                                  width;
    uint32_t                                  height;
    XrSpatialReferenceImageFormatEXT          format;
    uint32_t                                  planeCount;
    const XrSpatialReferenceImagePlaneEXT*    planes;
} XrSpatialReferenceImageEXT;

Parametre 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.
  • width, referans görselin piksel cinsinden genişliğidir.
  • height, referans görselin piksel cinsinden yüksekliğidir.
  • format, görüntünün biçimini temsil eden bir XrSpatialReferenceImageFormatEXT'tir.
  • planeCount, planes dizisindeki öğe sayısıdır.
  • planes, görüntü verilerinin düzlemlerini temsil eden bir XrSpatialReferenceImagePlaneEXT yapıları dizisidir.

Uygulama, XrSpatialImageTrackingDatabaseEXT tanıtıcısı oluştururken XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages aracılığıyla xrCreateSpatialImageTrackingDatabaseAsyncEXT işlevine iletilecek tek bir giriş referans görselini temsil eden bir veya daha fazla XrSpatialReferenceImageEXT yapısı oluşturabilir.

XrSpatialReferenceImagePlaneEXT :: buffer verileri, uygulama tarafından soldan sağa ve yukarıdan aşağıya piksel sıralamasıyla sağlanmalıdır.

Uygulama, XrSpatialReferenceImageEXT :: format öğesinin her renk kanalı için XrSpatialReferenceImageEXT :: planes dizisinde bir XrSpatialReferenceImagePlaneEXT yapısı sağlamalıdır.

Geçerli Kullanım (Dolaylı)

Garantili Bileşenler

XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT özelliğini destekleyen bir çalışma zamanı, aşağıdaki uzamsal bileşenleri bu özellikler tarafından keşfedilen tüm varlıkların garantili bileşenleri olarak sağlamalı ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT içinde listelemelidir:

  • XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT

2D Resim Bileşeni

Sorgu Verileri İçin Bileşen Listesi Yapısı

XrSpatialComponentImage2DListEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialComponentImage2DListEXT {
    XrStructureType             type;
    const void*                 next;
    uint32_t                    imageCount;
    XrSpatialImage2DDataEXT*    images;
} XrSpatialComponentImage2DListEXT;

Parametre 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.
  • imageCount, images dizisindeki öğe sayısıdır.
  • images, XrSpatialImage2DDataEXT dizisidir.

XrSpatialComponentDataQueryResultEXT :: next zincirinde XrSpatialComponentImage2DListEXT varsa ancak XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT yoksa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir.

imageCount, XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput değerinden küçükse çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_SIZE_INSUFFICIENT değerini döndürmelidir.

Geçerli Kullanım (Dolaylı)

Bileşen Verileri

XrSpatialImage2DDataEXT yapısı şu şekilde tanımlanır:

typedef struct XrSpatialImage2DDataEXT {
    XrSpatialImageTrackingDatabaseEXT    imageTrackingDatabase;
    uint32_t                             referenceImageIndex;
} XrSpatialImage2DDataEXT;

Parametre Açıklamaları

Uygulama, daha önce oluşturulan hangi XrSpatialImageTrackingDatabaseEXT'nin bu XrSpatialImage2DDataEXT yapısının referans görüntüsünü içerdiğini belirlemek için imageTrackingDatabase kullanabilir. Bu XrSpatialImageTrackingDatabaseEXT için uygulama, referenceImageIndex kullanarak bu XrSpatialImage2DDataEXT yapısının XrSpatialReferenceImageEXT değerini XrSpatialImageTrackingDatabaseCreateInfoEXT :: spatialReferenceImages dizisinin giriş sırasıyla eşleştirerek tanımlayabilir.

Tüm etkin veritabanları tarafından tanımlanan referans görsel grubu, yinelenen görseller içermemelidir. Yinelenen resimlerin eklenmesi, olumsuz keşif veya izleme davranışına (ör. tutarsız veya birden fazla dizinin döndürülmesi) neden olabilir.

Geçerli Kullanım (Dolaylı)

Yapılandırma

XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT, 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.

Sınırlı 2D Bileşen

Sınırlı 2D bileşeni, üzerinde bulunduğu varlık tarafından temsil edilen uzamsal görüntünün merkezini ve kapsamını sağlar. Sınırlı 2D bileşeni hakkında daha fazla bilgi için Sınırlı 2D bölümüne bakın.

Örnek Kod

Mekansal Görüntüleri Keşfetme ve Bileşen Verilerini Sorgulama

Aşağıdaki örnek kodda, görüntü izleme özelliği için uzamsal varlıkların nasıl bulunacağı ve bileşen verilerinin nasıl sorgulanacağı gösterilmektedir.

XrInstance instance; // Previously initialized
XrSystemId systemId; // Previously initialized
XrSession session; // Previously initialized

uint32_t capabilityCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCountOutput, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCountOutput);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilities.size(), &capabilityCountOutput, capabilities.data()));

if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT) == capabilities.end()) {
  // Image tracking not supported
}

XrSpatialCapabilityComponentTypesEXT imageTrackingComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));
std::vector<XrSpatialComponentTypeEXT> imageTrackingCapabilityComponents(imageTrackingComponents.componentTypeCountOutput);
imageTrackingComponents.componentTypes = imageTrackingCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, &imageTrackingComponents));

if (std::find(imageTrackingCapabilityComponents.begin(), imageTrackingCapabilityComponents.end(), XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT) == imageTrackingCapabilityComponents.end()) {
  // The image2d component is not supported
}

uint32_t capabilityFeatureCountOutput = 0;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &capabilityFeatureCountOutput, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> capabilityFeatures(capabilityFeatureCountOutput);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, capabilityFeatures.size(), &capabilityFeatureCountOutput, capabilityFeatures.data()));

// Helper function to query optional feature support
const auto supportsFeature = [&capabilityFeatures](XrSpatialCapabilityFeatureEXT feature) {
  return std::find(capabilityFeatures.begin(), capabilityFeatures.end(), feature) != capabilityFeatures.end();
};

// supported state for optional features
const bool supportsAutomaticScaleEstimation = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT);
const bool supportsStaticImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT);
const bool supportsFixedSizeImages = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT);

uint32_t formatCountOutput = 0;
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, 0, &formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(instance, systemId, XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT, formats.size(), &formatCountOutput, formats.data()));

if (std::find(formats.begin(), formats.end(), XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT) == formats.end()) {
  // The desired format is not supported
}

// Helper function to wait for XrFutureEXT completion
auto waitUntilReady = [&](XrFutureEXT future) {
  XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
  XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
  pollInfo.future = future;
  do {
    // sleep(1);
    CHK_XR(xrPollFutureEXT(instance, &pollInfo, &pollResult));
  } while (pollResult.state != XR_FUTURE_STATE_READY_EXT);
};

// Data/metadata about reference images (identifiers, 3D models, trigger functions, etc.)
std::vector<std::string> referenceImageIdentifiers;

XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase{};
{
  uint32_t imgSize; // preloaded interleaved RGBA buffer size
  uint8_t* img; // preloaded interleaved RGBA buffer data

  // interleaved RGBA buffer memory layout and buffer positions

  // first row of pixels
  // img[0] | img[1] | img[2] | img[3] | img[0]+pStride | img[1]+pStride | ...
  //  R0    |   G0   |   B0   |   A0   |       R1       |       G1       | ...

  // second row of pixels
  // img[0]+rStride | img[1]+rStride | img[2]+rStride | img[3]+rStride | img[0]+rStride+pStride | ...
  //      R640      |      G640      |      B640      |      A640      |          R641          | ...

  XrSpatialReferenceImagePlaneEXT spatialReferenceImagePlanes[4];

  for (int i = 0; i < 4; ++i) { // for each plane (0=R, 1=G, 2=B, 3=A)
    spatialReferenceImagePlanes[i].buffer = img + i; // set each plane buffer pointer to the first pixel of the plane
    spatialReferenceImagePlanes[i].bufferSize = imgSize - i; // adjust remeinaing buffer size according to offset applied
    spatialReferenceImagePlanes[i].rowStride = 640 * 4; // set byte offset to start of next row for this plane
    spatialReferenceImagePlanes[i].pixelStride = 4; // set byte offset to next pixel for this plane
  }

  XrSpatialReferenceImageEXT spatialReferenceImage{XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
  spatialReferenceImage.width = 640;
  spatialReferenceImage.height = 480;
  spatialReferenceImage.format = XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT;
  spatialReferenceImage.planeCount = 4;
  spatialReferenceImage.planes = spatialReferenceImagePlanes;

  referenceImageIdentifiers.emplace_back("MyReferenceImage");

  // Helper function to append to the next chain
  XrBaseOutStructure* appendTo = reinterpret_cast<XrBaseOutStructure*>(&spatialReferenceImage);
  const auto appendToNextChain = [&appendTo](XrBaseOutStructure* toAppend) {
    appendTo->next = toAppend;
    appendTo = toAppend;
  };

  XrSpatialImageSizeEXT imageSize{XR_TYPE_SPATIAL_IMAGE_SIZE_EXT};
  imageSize.physicalWidth = 0.1f;

  if (!supportsAutomaticScaleEstimation) {
    if (supportsFixedSizeImages) {
      appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageSize));
    }
  }

  XrSpatialImageStaticOptimizationEXT imageStaticOptimization{XR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXT};
  imageStaticOptimization.optimizeForStaticImage = XR_TRUE;

  if (supportsStaticImages) {
    appendToNextChain(reinterpret_cast<XrBaseOutStructure*>(&imageStaticOptimization));
  }

  XrSpatialImageTrackingDatabaseCreateInfoEXT spatialImageTrackingDatabaseCreateInfo{XR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXT};
  spatialImageTrackingDatabaseCreateInfo.spatialReferenceImages = &spatialReferenceImage;
  spatialImageTrackingDatabaseCreateInfo.spatialReferenceImageCount = 1;

  XrFutureEXT createImageTrackingDatabaseFuture = XR_NULL_FUTURE_EXT;
  CHK_XR(xrCreateSpatialImageTrackingDatabaseAsyncEXT(session, &spatialImageTrackingDatabaseCreateInfo, &createImageTrackingDatabaseFuture));

  waitUntilReady(createImageTrackingDatabaseFuture);

  XrCreateSpatialImageTrackingDatabaseCompletionEXT imageTrackingCompletion{XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialImageTrackingDatabaseCompleteEXT(session, createImageTrackingDatabaseFuture, &imageTrackingCompletion));
  if (imageTrackingCompletion.futureResult != XR_SUCCESS) {
    // Error, image tracking database creation failed
  }

  imageTrackingDatabase = imageTrackingCompletion.database;
}

XrSpatialContextEXT spatialContext{};
{
  const std::array<XrSpatialComponentTypeEXT, 2> enabledComponents = {
    XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
    XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
  };

  // Configure the image tracking capability for the spatial context
  XrSpatialCapabilityConfigurationImageTrackingEXT imageTrackingCapabilityConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXT};
  imageTrackingCapabilityConfig.capability = XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT;
  imageTrackingCapabilityConfig.enabledComponentCount = enabledComponents.size();
  imageTrackingCapabilityConfig.enabledComponents = enabledComponents.data();
  imageTrackingCapabilityConfig.imageTrackingDatabaseCount = 1;
  imageTrackingCapabilityConfig.imageTrackingDatabases = &imageTrackingDatabase;

  std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
  capabilityConfigs.push_back(reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&imageTrackingCapabilityConfig));

  XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
  spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
  spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();

  XrFutureEXT createContextFuture = XR_NULL_FUTURE_EXT;
  CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

  waitUntilReady(createContextFuture);

  XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
  if (completion.futureResult != XR_SUCCESS) {
    // Error, spatial context creation failed
  }

  spatialContext = completion.spatialContext;
}

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  // We want to look for entities that have the following components
  std::array<XrSpatialComponentTypeEXT, 2> snapshotComponents {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};

  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  XrFutureEXT discoveryFuture = XR_NULL_FUTURE_EXT;
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &discoveryFuture));

  waitUntilReady(discoveryFuture);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = localSpace;
  completionInfo.time = time;
  completionInfo.future = discoveryFuture;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {
    // Query for the bounded2d component data
    XrSpatialComponentTypeEXT componentsToQuery[] = {XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT, XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT};
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypes = componentsToQuery;

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityStateCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialBounded2DDataEXT> bounded2d(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded2DListEXT boundsList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
    boundsList.boundCount = bounded2d.size();
    boundsList.bounds = bounded2d.data();
    queryResult.next = &boundsList;

    std::vector<XrSpatialImage2DDataEXT> image2d(queryResult.entityIdCountOutput);
    XrSpatialComponentImage2DListEXT imagesList{XR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXT};
    imagesList.imageCount = image2d.size();
    imagesList.images = image2d.data();
    queryResult.next = &imagesList;

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
        const XrSpatialImage2DDataEXT& currentImage2d = image2d[i];
        const std::string& currentReferenceImageIdentifier = referenceImageIdentifiers[currentImage2d.referenceImageIndex];
        std::cout << currentReferenceImageIdentifier << std::endl; // Outputs the "MyReferenceImage" string the app defined previously; could be any other assocatied data or action.

        // Access bounded2d[i] for image bounds
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // For every frame in frame loop

  XrFrameState frameState;  // Previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata = *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // Finish frame loop
}

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

// Unload spatial image tracking resources internally
CHK_XR(xrDestroySpatialImageTrackingDatabaseEXT(imageTrackingDatabase));

Yeni nesne türleri

Yeni Komutlar

Yeni Yapılar

Yeni Enum Veri Türleri

Yeni Enum Sabitleri

  • XR_EXT_SPATIAL_IMAGE_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_image_tracking_SPEC_VERSION
  • XrObjectType'i genişletme:

    • XR_OBJECT_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_EXT
  • XrResult'ı genişletme:

    • XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXT
    • XR_ERROR_SPATIAL_IMAGE_INVALID_EXT
    • XR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXT
  • XrSpatialCapabilityEXT'yi genişletme:

    • XR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXT
  • XrSpatialCapabilityFeatureEXT'yi genişletme:

    • XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_AUTOMATIC_SIZE_IMAGES_EXT
    • XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXT
    • XR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_STATIC_IMAGES_EXT
  • XrSpatialComponentTypeEXT'yi genişletme:

    • XR_SPATIAL_COMPONENT_TYPE_IMAGE_2D_EXT
  • XrStructureType'ı genişletme:

    • XR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXT
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXT
    • XR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXT
    • XR_TYPE_SPATIAL_IMAGE_SIZE_EXT
    • XR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXT
    • XR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXT
    • XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT

Sayılar

Sürüm Geçmişi

  • Düzeltme 1, 22.04.2025 (Daniel Guttenberg, Qualcomm)

    • İlk uzantı açıklaması