XR_EXT_spatial_anchor
Name String
XR_EXT_spatial_anchor
Uzantı Türü
Örnek uzantısı
Kayıtlı Dahili Numara
763
Düzeltme
1
Onay Durumu
Onaylandı
Uzantı ve Sürüm Bağımlılıkları
XR_EXT_spatial_entity
Katkıda bulunanlar
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Genel Bakış
Bu uzantı, XR_EXT_spatial_entity üzerine kuruludur ve uygulamaların uzamsal yer işaretleri oluşturmasına olanak tanır. Bu yer işaretleri, kullanıcının fiziksel ortamındaki rastgele noktalardır ve daha sonra çalışma zamanı tarafından izlenir. Çalışma zamanı, gerçek dünyadaki orijinal eşlemesini korumasını sağlamak için diğer tüm alanlardan ve sabitleyicilerden bağımsız olarak sabitleyicinin başlangıç noktasının konumunu ve yönünü zaman içinde gerektiği gibi ayarlamalıdır (should).
XrSpatialContextEXT içinde belirli bir konumu ve yönü izleyen bir sabitleyici, XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT bileşenine sahip (veya "sahip olan") uzamsal bir varlık olarak temsil edilir.
Sabitleri kullanmanın avantajı
Çalışma zamanının, kullanıcının fiziksel ortamıyla ilgili bilgileri XrSpatialContextEXT'in kullanım ömrü boyunca güncellenir. Bu süreçte sanal nesneler, uygulama tarafından yerleştirildikleri yerden uzaklaşıyor gibi görünebilir. Bu durum, uygulamanın gerçekçiliğini ve kullanıcı deneyiminin kalitesini etkiler. Uygulama, sanal bir nesnenin yerleştirildiği yerin yakınına bir sabitleyici oluşturup bu sanal nesneyi her zaman sabitleyicisine göre oluşturarak her sanal nesnenin fiziksel ortamda aynı konumda ve yönde kalmasını sağlayabilir. Ayrıca, belirli referans alanlarının aksine, sabit noktalar sistem düzeyinde yeniden ortalamadan etkilenmez.
Çalışma zamanı desteği
Çalışma zamanı, uzamsal sabitleyicileri destekliyorsa bunu xrEnumerateSpatialCapabilitiesEXT içinde XR_SPATIAL_CAPABILITY_ANCHOR_EXT değerini numaralandırarak belirtmesi gerekir.
Yapılandırma
XrSpatialCapabilityConfigurationAnchorEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialCapabilityConfigurationAnchorEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationAnchorEXT;
Ü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.enabledComponentCount,enabledComponentsdizisindeki öğe sayısını açıklayan biruint32_tdeğeridir.enabledComponents, XrSpatialComponentTypeEXT dizisine işaret eden bir göstergedir.
Uygulamalar, XrSpatialContextCreateInfoEXT :: capabilityConfigs içinde bir XrSpatialCapabilityConfigurationAnchorEXT yapısına işaretçi ekleyerek XR_SPATIAL_CAPABILITY_ANCHOR_EXT uzamsal özelliğini etkinleştirebilir.
capability, XR_SPATIAL_CAPABILITY_ANCHOR_EXT değilse çalışma zamanı XR_ERROR_VALIDATION_FAILURE değerini döndürmelidir.
Geçerli Kullanım (Dolaylı)
- XrSpatialCapabilityConfigurationAnchorEXT kullanılmadan önce
XR_EXT_spatial_anchoruzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_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 -
enabledComponentCountparametresi0değerinden büyük olmalıdır.
Garantili Bileşenler
XR_SPATIAL_CAPABILITY_ANCHOR_EXT özelliğini destekleyen bir çalışma zamanı, bu özellik tarafından oluşturulan veya keşfedilen tüm varlıkların garantili bileşenleri olarak aşağıdaki uzamsal bileşenleri sağlamalı ve bunları xrEnumerateSpatialCapabilityComponentTypesEXT içinde listelemelidir:
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT
Sabit Bileşen
Bileşen Verileri
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT, verileri için sabitleyicinin konumunu ve yönünü sağlayan XrPosef'i kullanır.
Verileri Sorgulamak İçin Bileşen Listesi Yapısı
XrSpatialComponentAnchorListEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialComponentAnchorListEXT {
XrStructureType type;
void* next;
uint32_t locationCount;
XrPosef* locations;
} XrSpatialComponentAnchorListEXT;
Ü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.locationCount,locationsdizisindeki öğe sayısını açıklayan biruint32_tdeğeridir.locations, XrPosef dizisidir.
XrSpatialComponentDataQueryResultEXT :: next zincirinde XrSpatialComponentAnchorListEXT varsa ancak XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT, XrSpatialComponentDataQueryConditionEXT :: componentTypes içinde yer almıyorsa çalışma zamanı, xrQuerySpatialComponentDataEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir.
locationCount, 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ı)
- XrSpatialComponentAnchorListEXT kullanılmadan önce
XR_EXT_spatial_anchoruzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXTolmalıdır -
next,NULLveya yapı zincirindeki bir sonraki yapıya geçerli bir işaretçi olmalıdır. -
locations,locationCountXrPosef yapılarından oluşan bir diziye işaretçi olmalıdır -
locationCountparametresi0değerinden büyük olmalıdır.
Yapılandırma
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT, bir özellik için XrSpatialCapabilityComponentTypesEXT :: componentTypes içinde listeleniyorsa uygulama, bu bileşeni destekleyen özelliğin XrSpatialCapabilityConfigurationBaseHeaderEXT türetilmiş yapısının XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents listesine numaralandırıcıyı ekleyerek bu özelliği etkinleştirebilir.
Bu bileşenin XrSpatialCapabilityConfigurationBaseHeaderEXT :: next zincirine dahil edilmesi için özel bir yapılandırma gerekmez.
Uzamsal yer işareti oluşturma
xrCreateSpatialAnchorEXT işlevi şu şekilde tanımlanır:
XrResult xrCreateSpatialAnchorEXT(
XrSpatialContextEXT spatialContext,
const XrSpatialAnchorCreateInfoEXT* createInfo,
XrSpatialEntityIdEXT* anchorEntityId,
XrSpatialEntityEXT* anchorEntity);
Parametre Açıklamaları
spatialContext, daha önce xrCreateSpatialContextAsyncEXT kullanılarak oluşturulmuş bir XrSpatialContextEXT'tir.createInfo, XrSpatialAnchorCreateInfoEXT'ye işaret eden bir işaretçidir.anchorEntityId, sabitleme varlığının kimliğinin döndürüldüğü birXrSpatialEntityIdEXTişaretçisidir.anchorEntity, sabitleyici öğenin herkese açık kullanıcı adının döndürüldüğü bir XrSpatialEntityEXT işaretçisidir.
Uygulama, xrCreateSpatialAnchorEXT kullanarak uzamsal yer işareti oluşturabilir.
Bir sabitleme noktası için güncellenmiş bileşen verilerini almak istiyorsanız anlık görüntü oluştururken anchorEntity içinde doldurulan değeri XrSpatialUpdateSnapshotCreateInfoEXT :: entities içine iletin. Uygulama, xrQuerySpatialComponentDataEXT kullanırken XrSpatialComponentDataQueryResultEXT :: entityIds dizisinde bu sabitleyiciyi benzersiz şekilde tanımlamak için anchorEntityId değerini kullanabilir .
XR_SPATIAL_CAPABILITY_ANCHOR_EXT, spatialContext için yapılandırılmadıysa çalışma zamanı, xrCreateSpatialAnchorEXT'ten XR_ERROR_VALIDATION_FAILURE döndürmelidir. XR_SPATIAL_CAPABILITY_ANCHOR_EXT özelliği için XrSpatialContextEXT'yi nasıl yapılandıracağınızı öğrenmek üzere Yapılandırma bölümüne bakın.
anchorEntity ile temsil edilen sabitleyici, yalnızca spatialContext kullanım ömrü boyunca veya uygulama, sabitleyici üzerinde xrDestroySpatialEntityEXT işlevini çağırana kadar (hangisi önce gerçekleşirse) geçerlidir. Diğer uzantılar, yeni oluşturulan bu sabitleyiciyi birden fazla XrSession'da kalıcı hale getirmek veya işlem sınırları genelinde diğer uygulamalarla paylaşmak için işlevler sunabilir.
Yeni oluşturulan bir sabitleyici, yok edilene kadar üst uzamsal bağlamında bulunabilir olmalıdır. Bu, çalışma zamanının, yer işareti XrSpatialDiscoverySnapshotCreateInfoEXT içinde ayarlanan keşif ölçütleriyle eşleşiyorsa spatialContext için xrCreateSpatialDiscoverySnapshotAsyncEXT kullanılarak oluşturulan anlık görüntüye anchorEntityId öğesini eklemesi gerektiği anlamına gelir. Yeni oluşturulan sabitleyici, XR_SPATIAL_CAPABILITY_ANCHOR_EXT ile yapılandırılmış diğer uzamsal bağlamlarda da keşfedilebilir olabilir. Ancak belirli bir XrSpatialEntityIdEXT, XrSpatialContextEXT'e özgü olduğundan farklı bir XrSpatialEntityIdEXT ile keşfedilebilir.
Geçerli Kullanım (Dolaylı)
-
XR_EXT_spatial_anchoruzantısı, xrCreateSpatialAnchorEXT çağrılmadan önce etkinleştirilmelidir -
spatialContext, geçerli bir XrSpatialContextEXT herkese açık kullanıcı adı olmalıdır -
createInfo, geçerli bir XrSpatialAnchorCreateInfoEXT yapısına işaret eden bir işaretçi olmalıdır. -
anchorEntityId, birXrSpatialEntityIdEXTdeğerine işaretçi olmalıdır -
anchorEntity, bir XrSpatialEntityEXT tutamacına işaretçi olmalıdır.
Dönüş Kodları
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_POSE_INVALIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILUREXR_ERROR_SPATIAL_ANCHOR_ATTACHABLE_COMPONENT_NOT_FOUND_ANDROID(XR_ANDROID_spatial_entity_bound_anchoretkinse)XR_ERROR_SPATIAL_ENTITY_ID_INVALID_EXT(XR_ANDROID_spatial_entity_bound_anchoretkinse)
XrSpatialAnchorCreateInfoEXT yapısı şu şekilde tanımlanır:
typedef struct XrSpatialAnchorCreateInfoEXT {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
XrPosef pose;
} XrSpatialAnchorCreateInfoEXT;
Ü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.baseSpace,poseöğesinin uygulandığı XrSpace'tir.time,baseSpace'nin bulunduğu (vepose'nin uygulandığı)XrTimedeğeridir.pose, sabitleme varlığının konumudur.
Geçerli Kullanım (Dolaylı)
- XrSpatialAnchorCreateInfoEXT kullanılmadan önce
XR_EXT_spatial_anchoruzantısı etkinleştirilmelidir. -
typeXR_TYPE_SPATIAL_ANCHOR_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. XrSpatialAnchorParentANDROID -
baseSpacegeçerli bir XrSpace hesabı olmalıdır
Sorgu Sabit Noktası Pozu
Sabit nokta oluşturulduktan sonra çalışma zamanı, sabit noktanın orijinal gerçek dünya konumuna mümkün olan en iyi şekilde hizalanmasını sağlamak için zaman içinde diğer alanlara göre konumunu ve yönünü ayarlamalıdır (should). Bu işlem, sabit noktanın başlatmak için kullanılan orijinal XrSpatialAnchorCreateInfoEXT :: baseSpace ile ilişkisini değiştirse bile geçerlidir.
Uygulama, yeni bir XrSpatialSnapshotEXT oluşturmak için sabitleyicinin XrSpatialEntityEXT ile xrCreateSpatialUpdateSnapshotEXT'yi kullanabilir ve ardından xrQuerySpatialComponentDataEXT kullanarak bu anlık görüntüden XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT bileşenini sorgulayabilir. Uygulama, bağlantı noktalarının en son konum verilerini almak için XrSpatialComponentDataQueryResultEXT :: next öğesine XrSpatialComponentAnchorListEXT ekleyebilir.
Çalışma zamanı, yeni oluşturulan bir sabitin izleme durumunu XR_SPATIAL_ENTITY_TRACKING_STATE_PAUSED_EXT olarak ayarlayabilir. Uygulama, yalnızca XrSpatialComponentDataQueryResultEXT :: entityStates içinde sağlanan sabitleme öğesinin durumunu ve izleme durumu XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT ise öğenin sabitleme bileşeni verilerini okumalıdır (must).
Sabit reklamları kullanmayla ilgili yönergeler
- Her bir sabitleyicinin pozu, diğer sabitleyicilerden veya alanlardan bağımsız olarak ayarlanır. Ayrı ayrı sabitlenmiş sanal nesneler birbirlerine göre kayabilir veya dönebilir. Bu durum, sanal nesnelerin birbirlerine göre yerinde kalması beklenen durumlarda uzamsal hiyerarşiyi bozabilir. Bu gibi durumlarda uygulama, birbirine göre hareket etmeyen tüm sanal nesneler için aynı sabitleyiciyi yeniden kullanmalıdır.
- Uygulama, artık kullanılmayan sabitleyiciler için tüm XrSpatialEntityEXT tutamaçlarını yok etmelidir. Böylece çalışma zamanının bu sabitleyicileri izlemek için kullanabileceği kaynaklar serbest bırakılır.
Örnek Kod
Sabit Reklam Özelliğini Yapılandırma
Aşağıdaki örnekte, uzamsal bağlam oluştururken sabitleme özelliğinin nasıl yapılandırılacağı gösterilmektedir.
// Create a spatial spatial context
XrSpatialContextEXT spatialContext{};
{
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT,
};
XrSpatialCapabilityConfigurationAnchorEXT anchorConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXT};
anchorConfig.capability = XR_SPATIAL_CAPABILITY_ANCHOR_EXT;
anchorConfig.enabledComponentCount = enabledComponents.size();
anchorConfig.enabledComponents = enabledComponents.data();
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&anchorConfig),
};
XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
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) {
return;
}
spatialContext = completion.spatialContext;
}
// ...
// Create spatial anchors and get their latest pose in the frame loop.
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
Uzamsal yer işareti oluşturma ve konumunu alma
Aşağıdaki örnekte, uzamsal yer işaretinin nasıl oluşturulacağı ve her karede pozunun nasıl alınacağı gösterilmektedir.
XrSpatialAnchorCreateInfoEXT createInfo{XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXT};
createInfo.baseSpace = localSpace;
createInfo.time = predictedDisplayTime;
createInfo.pose = {{0, 0, 0, 1}, {1, 1, 1}};
XrSpatialEntityIdEXT spatialAnchorEntityId;
XrSpatialEntityEXT spatialAnchorEntity;
CHK_XR(xrCreateSpatialAnchorEXT(spatialContext, &createInfo, &spatialAnchorEntityId, &spatialAnchorEntity));
auto updateAnchorLocation = [&](XrTime time) {
// We want to get updated data for all components of the entities, so skip specifying componentTypes.
XrSpatialUpdateSnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_UPDATE_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.entityCount = 1;
snapshotCreateInfo.entities = &spatialAnchorEntity;
snapshotCreateInfo.baseSpace = localSpace;
snapshotCreateInfo.time = time;
XrSpatialSnapshotEXT snapshot;
CHK_XR(xrCreateSpatialUpdateSnapshotEXT(spatialContext, &snapshotCreateInfo, &snapshot));
// Query for the entities that have the anchor component on them.
std::array<XrSpatialComponentTypeEXT, 1> componentsToQuery {XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT};
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = componentsToQuery.size();
queryCond.componentTypes = componentsToQuery.data();
XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
CHK_XR(xrQuerySpatialComponentDataEXT(snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
// query for the pose data
std::vector<XrPosef> locations(queryResult.entityIdCountOutput);
XrSpatialComponentAnchorListEXT locationList{XR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT};
locationList.locationCount = locations.size();
locationList.locations = locations.data();
queryResult.next = &locationList;
CHK_XR(xrQuerySpatialComponentDataEXT(snapshot, &queryCond, &queryResult));
for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
// Pose for entity entityIds[i] is locations[i].
}
}
CHK_XR(xrDestroySpatialSnapshotEXT(snapshot));
};
while (1) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
updateAnchorLocation(time);
// ...
// Finish frame loop
// ...
}
CHK_XR(xrDestroySpatialEntityEXT(spatialAnchorEntity));
Yeni Komutlar
Yeni Yapılar
- XrSpatialAnchorCreateInfoEXT
- XrSpatialCapabilityConfigurationAnchorEXT
XrSpatialComponentDataQueryResultEXT'yi genişletme:
Yeni Enum Sabitleri
XR_EXT_SPATIAL_ANCHOR_EXTENSION_NAMEXR_EXT_spatial_anchor_SPEC_VERSIONXrSpatialCapabilityEXT'yi genişletme:
XR_SPATIAL_CAPABILITY_ANCHOR_EXT
XrSpatialComponentTypeEXT'yi genişletme:
XR_SPATIAL_COMPONENT_TYPE_ANCHOR_EXT
XrStructureType'ı genişletme:
XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_EXTXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANCHOR_EXTXR_TYPE_SPATIAL_COMPONENT_ANCHOR_LIST_EXT
Sayılar
xrCreateSpatialAnchorEXT neden bir varlık kimliğinin yanı sıra bir varlık herkese açık kullanıcı adı da döndürür?
- Çözüldü
- Cevap: xrCreateSpatialAnchorEXT işlevi, çıkış olarak yalnızca varlık kimliğini sağlayabilir ve uygulamalar, xrCreateSpatialEntityFromIdEXT işlevini kullanarak bu kimlik için bir varlık tutma yeri oluşturabilir. Ancak uygulamaların her karede sabitleyici pozunu sorguladığı tipik bir sabitleyici kullanımı göz önüne alındığında, giriş olarak varlık tutamaçları gerektiren bir "güncelleme anlık görüntüsünde" kullanılmak için iyi bir aday haline gelir. Bu tipik kullanım alanını öngören xrCreateSpatialAnchorEXT, uygulama adına xrCreateSpatialEntityFromIdEXT işlemini gerçekleştirir ve xrCreateSpatialUpdateSnapshotEXT ile kullanılacak varlık tutma yerini sağlar.
Sürüm Geçmişi
1. düzeltme, 10.07.2024 (Nihav Jain, Google)
- İlk uzantı açıklaması