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_EXTXR_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, birXrFutureEXTiş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ı)
-
XR_EXT_spatial_image_trackinguzantısı, xrCreateSpatialImageTrackingDatabaseAsyncEXT çağrılmadan önce etkinleştirilmelidir. -
sessiongeçerli bir XrSession herkese açık kullanıcı adı olmalıdır -
createInfo, geçerli bir XrSpatialImageTrackingDatabaseCreateInfoEXT yapısına işaretçi olmalıdır. -
future, birXrFutureEXTdeğerine 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_PERMISSION_INSUFFICIENTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_ERROR_SPATIAL_IMAGE_SIZE_MISSING_EXTXR_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,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.spatialReferenceImageCount,spatialReferenceImagesdizisindeki öğ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ı)
- XrSpatialImageTrackingDatabaseCreateInfoEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir -
typeXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. Ayrıca bkz: XrSpatialImageSizeEXT , XrSpatialImageStaticOptimizationEXT -
spatialReferenceImages,spatialReferenceImageCountgeçerli XrSpatialReferenceImageEXT yapısından oluşan bir dizinin işaretçisi olmalıdır -
spatialReferenceImageCountparametresi0değerinden büyük olmalıdır.
xrCreateSpatialImageTrackingDatabaseCompleteEXT işlevi şu şekilde tanımlanır:
XrResult xrCreateSpatialImageTrackingDatabaseCompleteEXT(
XrSession session,
XrFutureEXT future,
XrCreateSpatialImageTrackingDatabaseCompletionEXT* completion);
Parametre Açıklamaları
session, daha önce xrCreateSpatialContextAsyncEXT ::sessionparametresine iletilen XrSession değeridir.future, xrCreateSpatialContextAsyncEXT'ten alınanXrFutureEXTdeğeridir.completion, bir XrCreateSpatialImageTrackingDatabaseCompletionEXT işaretçisidir.
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ı)
-
XR_EXT_spatial_image_trackinguzantısı, xrCreateSpatialImageTrackingDatabaseCompleteEXT çağrılmadan önce etkinleştirilmelidir -
sessiongeçerli bir XrSession herkese açık kullanıcı adı olmalıdır -
completion, bir XrCreateSpatialImageTrackingDatabaseCompletionEXT yapısına işaretçi olmalıdır
Dönüş Kodları
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_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ı
type, bu yapının XrStructureType değeridir.next,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.futureResult, üç boyutlu görüntü izleme veritabanı oluşturma işleminin XrResult değeridir.database, xrCreateSpatialImageTrackingDatabaseAsyncEXT ::createInfoiçindeki veriler ve yapılandırma kullanılarak oluşturulan bir XrSpatialImageTrackingDatabaseEXT nesnesidir.
Gelecekteki İade Kodları
futureResult değer:
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_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ı)
- XrCreateSpatialImageTrackingDatabaseCompletionEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir -
typeXR_TYPE_CREATE_SPATIAL_IMAGE_TRACKING_DATABASE_COMPLETION_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
futureResultgeçerli bir XrResult değeri olmalıdır -
databasegeçerli bir XrSpatialImageTrackingDatabaseEXT tanıtıcısı olmalıdır
Üç Boyutlu Resim İzleme Veritabanı'nı silme
xrDestroySpatialImageTrackingDatabaseEXT işlevi şu şekilde tanımlanır:
XrResult xrDestroySpatialImageTrackingDatabaseEXT(
XrSpatialImageTrackingDatabaseEXT database);
Parametre Açıklamaları
database, daha önce xrCreateSpatialImageTrackingDatabaseAsyncEXT tarafından oluşturulmuş bir XrSpatialImageTrackingDatabaseEXT'tir.
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ı)
-
XR_EXT_spatial_image_trackinguzantısı, xrDestroySpatialImageTrackingDatabaseEXT çağrılmadan önce etkinleştirilmelidir. -
databasegeçerli bir XrSpatialImageTrackingDatabaseEXT tanıtıcısı olmalıdır
İleti Dizisi Güvenliği
databaseve tüm alt herkese açık kullanıcı adlarına erişim harici olarak senkronize edilmelidir.
Dönüş Kodları
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_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ılacakXrSystemIddeğeridir.capability, giriş referans görsel biçimlerinin numaralandırılacağı XrSpatialCapabilityEXT'tir.formatCapacityInput,formatsdizisinin kapasitesidir veya gerekli kapasiteyi alma isteğini belirtmek için 0'dır.formatCountOutput, biçimlerin sayısı veyaformatCapacityInputyetersiz olduğunda gereken kapasitedir.formats, XrSpatialReferenceImageFormatEXT dizisidir.formatCapacityInput0 iseNULLolabilir.- Gerekli
formatsboyutunu 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ı)
- xrEnumerateSpatialReferenceImageFormatsEXT çağrılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir. -
instancegeçerli bir XrInstance herkese açık kullanıcı adı olmalıdır -
capabilitygeçerli bir XrSpatialCapabilityEXT değeri olmalıdır -
formatCountOutput, biruint32_tdeğerine işaretçi olmalıdır -
formatCapacityInput,0değilseformats,formatCapacityInputXrSpatialReferenceImageFormatEXT değerlerinden oluşan bir diziye işaretçi olmalıdır.
Dönüş Kodları
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXTXR_ERROR_SYSTEM_INVALIDXR_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,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.optimizeForStaticImage, resimlerin hareket edip etmediğini gösteren birXrBool32.XR_TRUEdeğ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ı)
- XrSpatialImageStaticOptimizationEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır.
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,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.physicalWidth, ayarlanacak fiziksel genişliği metre cinsinden temsil eden birfloatdeğ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ı)
- XrSpatialImageSizeEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir -
typeXR_TYPE_SPATIAL_IMAGE_SIZE_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır.
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,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.capability, bir XrSpatialCapabilityEXT'tir veXR_SPATIAL_CAPABILITY_IMAGE_TRACKING_EXTolmalıdır.enabledComponentCount,enabledComponentsiçindeki öğe sayısını belirten biruint32_tdeğeridir.enabledComponents, bu özellik için etkinleştirilecek bileşenleri belirten bir XrSpatialComponentTypeEXT dizisidir.imageTrackingDatabaseCount,imageTrackingDatabasesiçindeki öğe sayısını belirten birunint32_tdeğ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ı)
- XrSpatialCapabilityConfigurationImageTrackingEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXTolmalı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 -
imageTrackingDatabases,imageTrackingDatabaseCountgeçerli XrSpatialImageTrackingDatabaseEXT tutma yerinden oluşan bir diziye işaretçi olmalıdır -
enabledComponentCountparametresi0değerinden büyük olmalıdır. -
imageTrackingDatabaseCountparametresi0değerinden büyük olmalıdır.
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,bufferdizisinin boyutudur.buffer, düzlem verilerini temsil eden biruint8_tveri 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_trackinguzantısı, XrSpatialReferenceImagePlaneEXT kullanılmadan önce etkinleştirilmelidir -
buffer,bufferSizeuint8_tdeğerlerinden oluşan bir dizinin işaretçisi olmalıdır -
bufferSizeparametresi0değ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,NULLveya 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,planesdizisindeki öğ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ı)
- XrSpatialReferenceImageEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_REFERENCE_IMAGE_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. Ayrıca bkz: XrSpatialAnnotationQuadReferenceANDROID , XrSpatialImageSizeEXT , XrSpatialImageStaticOptimizationEXT -
formatgeçerli bir XrSpatialReferenceImageFormatEXT değeri olmalıdır -
planes,planeCountgeçerli XrSpatialReferenceImagePlaneEXT yapısından oluşan bir dizinin işaretçisi olmalıdır -
planeCountparametresi0değerinden büyük olmalıdır.
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_EXTXR_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,NULLveya bir yapı zincirindeki sonraki yapıya işaret eden bir göstergedir.imageCount,imagesdizisindeki öğ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ı)
- XrSpatialComponentImage2DListEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmiş olmalıdır. -
typeXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
images,imageCountXrSpatialImage2DDataEXT yapılarından oluşan bir dizinin işaretçisi olmalıdır -
imageCountparametresi0değerinden büyük olmalıdır.
Bileşen Verileri
XrSpatialImage2DDataEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialImage2DDataEXT {
XrSpatialImageTrackingDatabaseEXT imageTrackingDatabase;
uint32_t referenceImageIndex;
} XrSpatialImage2DDataEXT;
Parametre Açıklamaları
imageTrackingDatabase, resmi algılayan veya takip eden XrSpatialImageTrackingDatabaseEXT'tir.referenceImageIndex,imageTrackingDatabaseöğesinin oluşturulduğu giriş referans görsellerinin XrSpatialImageTrackingDatabaseCreateInfoEXT ::spatialReferenceImagesdizisiyle eşlenen dizindir.
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ı)
- XrSpatialImage2DDataEXT kullanılmadan önce
XR_EXT_spatial_image_trackinguzantısı etkinleştirilmelidir -
imageTrackingDatabasegeçerli bir XrSpatialImageTrackingDatabaseEXT tanıtıcısı olmalıdır
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
- xrCreateSpatialImageTrackingDatabaseAsyncEXT
- xrCreateSpatialImageTrackingDatabaseCompleteEXT
- xrDestroySpatialImageTrackingDatabaseEXT
- xrEnumerateSpatialReferenceImageFormatsEXT
Yeni Yapılar
- XrCreateSpatialImageTrackingDatabaseCompletionEXT
- XrSpatialCapabilityConfigurationImageTrackingEXT
- XrSpatialImage2DDataEXT
- XrSpatialImageTrackingDatabaseCreateInfoEXT
- XrSpatialReferenceImageEXT
- XrSpatialReferenceImagePlaneEXT
XrSpatialComponentDataQueryResultEXT'yi genişletme:
XrSpatialReferenceImageEXT , XrSpatialImageTrackingDatabaseCreateInfoEXT'i genişletme:
Yeni Enum Veri Türleri
Yeni Enum Sabitleri
XR_EXT_SPATIAL_IMAGE_TRACKING_EXTENSION_NAMEXR_EXT_spatial_image_tracking_SPEC_VERSIONXrObjectType'i genişletme:
XR_OBJECT_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_EXT
XrResult'ı genişletme:
XR_ERROR_SPATIAL_IMAGE_FORMAT_UNSUPPORTED_EXTXR_ERROR_SPATIAL_IMAGE_INVALID_EXTXR_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_EXTXR_SPATIAL_CAPABILITY_FEATURE_IMAGE_TRACKING_FIXED_SIZE_IMAGES_EXTXR_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_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_IMAGE_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_IMAGE_2D_LIST_EXTXR_TYPE_SPATIAL_IMAGE_SIZE_EXTXR_TYPE_SPATIAL_IMAGE_STATIC_OPTIMIZATION_EXTXR_TYPE_SPATIAL_IMAGE_TRACKING_DATABASE_CREATE_INFO_EXTXR_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ı