XR_EXT_spatial_object_tracking
Name String
XR_EXT_spatial_object_tracking
Typ rozszerzenia
Rozszerzenie instancji
Zarejestrowany numer wewnętrzny
745
Wersja
1
Stan ratyfikacji
Nie ratyfikowano
Zależności rozszerzeń i wersji
XR_EXT_spatial_entity
Stan IP
Brak znanych roszczeń dotyczących własności intelektualnej.
Twórcy
Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance
Andy Biar, Unity Technologies
Rebecca Nordhauser, Unity Technologies
Przegląd
To rozszerzenie opiera się na XR_EXT_spatial_entity i definiuje funkcję przestrzenną do śledzenia zestawu wstępnie zdefiniowanych obiektów bez konieczności podawania wejściowego zbioru danych z aplikacji.
Obsługa środowiska wykonawczego
Jeśli środowisko wykonawcze obsługuje śledzenie obiektów, musi to wskazywać, wyliczając XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT w xrEnumerateSpatialCapabilitiesEXT .
Konfiguracja
Struktura XrSpatialCapabilityConfigurationObjectTrackingEXT jest zdefiniowana w ten sposób:
typedef struct XrSpatialCapabilityConfigurationObjectTrackingEXT {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationObjectTrackingEXT;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur.capabilityto XrSpatialCapabilityEXT i musi mieć wartośćXR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT.enabledComponentCounttouint32_topisujący liczbę elementów w tablicyenabledComponents.enabledComponentsto wskaźnik do tablicy XrSpatialComponentTypeEXT .
Aplikacje mogą włączyć funkcję przestrzenną XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, dodając wskaźnik do struktury XrSpatialCapabilityConfigurationObjectTrackingEXT w XrSpatialContextCreateInfoEXT :: capabilityConfigs .
Środowisko wykonawcze musi zwrócić XR_ERROR_VALIDATION_FAILURE, jeśli capability nie jest XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT .
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_EXT_spatial_object_trackingmusi być włączone przed użyciem XrSpatialCapabilityConfigurationObjectTrackingEXT. -
typemusi mieć wartośćXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur . Zobacz też: XrSpatialFeatureObjectSemanticLabelSubsetEXT -
capabilitymusi być prawidłową wartością XrSpatialCapabilityEXT -
enabledComponentsmusi być wskaźnikiem do tablicy zenabledComponentCountprawidłowymi wartościami XrSpatialComponentTypeEXT - Parametr
enabledComponentCountmusi być większy niż0
Komponenty gwarantowane
Środowisko wykonawcze, które obsługuje XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, musi obsługiwać te komponenty przestrzenne jako gwarantowane komponenty elementów wykrytych przez tę funkcję i musi je wyliczać w xrEnumerateSpatialCapabilityComponentTypesEXT :
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT- Co najmniej 1 typ komponentu, który udostępnia zestaw etykiet semantycznych dla śledzonych obiektów. Funkcja śledzenia obiektów jest bezużyteczna bez komponentu etykiety semantycznej. To rozszerzenie definiuje
XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXTiXR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXTjako możliwe komponenty etykiet semantycznych, które mogą być obsługiwane przez środowiska wykonawcze, ale inne rozszerzenia mogą definiować nowe typy komponentów, aby udostępniać różne klasy etykiet semantycznych opisujących śledzony obiekt. Szczegółowe informacje o zestawach etykiet semantycznych i typach komponentów znajdziesz w artykule [ext_spatial_semantic_labels_guidelines]. Środowiska wykonawcze mogą nie obsługiwaćXR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXTaniXR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXTw przypadku funkcji śledzenia obiektów, ale muszą obsługiwać co najmniej 1 typ komponentu, który udostępnia etykietę semantyczną.
Ograniczony komponent 3D
Komponent ograniczony 3D określa środek i zakres obiektu reprezentowanego przez element, na którym się znajduje. Więcej informacji znajdziesz w sekcji Ograniczony widok 3D.
Komponenty opcjonalne
Środowisko wykonawcze, które obsługuje XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, może obsługiwać komponenty przestrzenne oprócz tych wymienionych w sekcji Gwarantowane komponenty. Aplikacja może używać funkcji xrEnumerateSpatialCapabilityComponentTypesEXT, aby uzyskać pełną listę komponentów obsługiwanych przez środowisko wykonawcze, a następnie może skonfigurować te, które ją interesują, podczas tworzenia kontekstu przestrzennego.
Etykieta semantyczna obiektu
Dane komponentu
typedef enum XrSpatialObjectSemanticLabelEXT {
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT = 2,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT = 3,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT = 4,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT = 5,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT = 6,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT = 7,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT = 8,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT = 9,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT = 10,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialObjectSemanticLabelEXT;
Wyliczenie XrSpatialObjectSemanticLabelEXT opisuje zestaw etykiet semantycznych obiektów.
W przypadku elementów z etykietą XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT oś +Z komponentu Bounded 3D musi mniej więcej odpowiadać wektorowi normalnemu powierzchni ekranu.
W przypadku elementów z etykietą XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT oś +Z komponentu Bounded 3D musi odpowiadać wektorowi normalnemu powierzchni ściany, na której znajduje się dzieło sztuki.
W przypadku elementów z etykietą XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT oś +Z komponentu Bounded 3D musi odpowiadać wektorowi normalnemu powierzchni stołu.
W przypadku wszystkich innych etykiet w XrSpatialObjectSemanticLabelEXT aplikacja nie może zakładać, że XrBoxf :: center :: orientation dostarczany przez komponent Bounded 3D w encji jest zgodny z atrybutami fizycznymi tego obiektu.
Wartości typu wyliczeniowego mają następujące znaczenie:
Opis typu wyliczeniowego
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT
Środowisko wykonawcze nie mogło sklasyfikować tej encji.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT
Encja to sofa.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT
Encja to łóżko.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT
Encja to krzesło.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT
Encja jest tabelą.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT
Encja to lampa.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT
Encja jest rośliną.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT
Encja jest ekranem, np. monitorem lub telewizorem.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT
Encja to dekoracja ścienna.
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT
Encja jest szafką.
Struktura listy komponentów do wysyłania zapytań o dane
Struktura XrSpatialComponentObjectSemanticLabelListEXT jest zdefiniowana w ten sposób:
typedef struct XrSpatialComponentObjectSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialObjectSemanticLabelEXT* semanticLabels;
} XrSpatialComponentObjectSemanticLabelListEXT;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.semanticLabelCounttouint32_topisujący liczbę elementów w tablicysemanticLabels.semanticLabelsto tablica XrSpatialObjectSemanticLabelEXT .
Aby wysłać zapytanie do komponentu etykiety semantycznej obiektu encji przestrzennych w XrSpatialSnapshotEXT , uwzględnij XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT w XrSpatialComponentDataQueryConditionEXT :: componentTypes i dodaj XrSpatialComponentObjectSemanticLabelListEXT do łańcucha XrSpatialComponentDataQueryResultEXT :: next.
Środowisko wykonawcze musi zwracać XR_ERROR_VALIDATION_FAILURE z xrQuerySpatialComponentDataEXT, jeśli XrSpatialComponentObjectSemanticLabelListEXT znajduje się w łańcuchu XrSpatialComponentDataQueryResultEXT :: next, ale XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT nie jest uwzględniony w XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Środowisko wykonawcze musi zwracać XR_ERROR_SIZE_INSUFFICIENT z xrQuerySpatialComponentDataEXT, jeśli semanticLabelCount jest mniejsze niż XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_EXT_spatial_object_trackingmusi być włączone przed użyciem XrSpatialComponentObjectSemanticLabelListEXT. -
typemusi mieć wartośćXR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur -
semanticLabelsmusi być wskaźnikiem do tablicy wartościsemanticLabelCountXrSpatialObjectSemanticLabelEXT - Parametr
semanticLabelCountmusi być większy niż0
Konfiguracja
Jeśli XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT jest wymieniony w XrSpatialCapabilityComponentTypesEXT :: componentTypes dla danej funkcji, aplikacja może go włączyć, dodając element wyliczeniowy do listy XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents struktury pochodnej XrSpatialCapabilityConfigurationBaseHeaderEXT funkcji, która obsługuje ten komponent.
Ten komponent nie wymaga żadnej specjalnej konfiguracji, aby można go było uwzględnić w łańcuchu XrSpatialCapabilityConfigurationBaseHeaderEXT :: next, ale oferuje opcjonalną konfigurację, którą aplikacje mogą udostępniać.
Struktura XrSpatialFeatureObjectSemanticLabelSubsetEXT jest zdefiniowana w ten sposób:
typedef struct XrSpatialFeatureObjectSemanticLabelSubsetEXT {
XrStructureType type;
const void* next;
uint32_t semanticLabelCount;
const XrSpatialObjectSemanticLabelEXT* semanticLabels;
} XrSpatialFeatureObjectSemanticLabelSubsetEXT;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur.semanticLabelCounttouint32_topisujący liczbę elementów w tablicysemanticLabels.semanticLabelsto tablica XrSpatialObjectSemanticLabelEXT .
Jeśli środowisko wykonawcze wylicza XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT z xrEnumerateSpatialCapabilityComponentTypesEXT dla danej funkcji, musi też wyliczyć XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT z xrEnumerateSpatialCapabilityFeaturesEXT dla tej samej funkcji. Jeśli aplikacja włącza XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT podczas konfigurowania tej funkcji, może połączyć XrSpatialFeatureObjectSemanticLabelSubsetEXT z odpowiednią strukturą konfiguracji tej funkcji, aby zapewnić środowisku wykonawczemu podzbiór etykiet zdefiniowanych w XrSpatialObjectSemanticLabelEXT . Środowisko wykonawcze może używać tego podzbioru etykiet do optymalizacji potoków śledzenia.
Środowisko wykonawcze musi zwracać XR_ERROR_VALIDATION_FAILURE z xrCreateSpatialContextAsyncEXT, jeśli semanticLabels zawiera etykietę, która nie jest zdefiniowana w XrSpatialObjectSemanticLabelEXT, lub jeśli semanticLabels zawiera XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT .
Środowisko wykonawcze musi zwracać XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT z xrCreateSpatialContextAsyncEXT, jeśli aplikacja udostępnia prawidłową listę etykiet w semanticLabels, ale XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT nie jest uwzględniona w tablicy XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents struktury konfiguracji, z którą jest połączona XrSpatialFeatureObjectSemanticLabelSubsetEXT.
Jeśli aplikacja konfiguruje funkcję z prawidłowym obiektem XrSpatialFeatureObjectSemanticLabelSubsetEXT, środowisko wykonawcze nie może uwzględniać elementów, które mają etykiety semantyczne niewymienione w semanticLabels w żadnym zrzucie wykrywania utworzonym dla skonfigurowanego kontekstu przestrzennego.
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_EXT_spatial_object_trackingmusi być włączone przed użyciem XrSpatialFeatureObjectSemanticLabelSubsetEXT. -
typemusi mieć wartośćXR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur -
semanticLabelsmusi być wskaźnikiem do tablicy zawierającejsemanticLabelCountprawidłowe wartości XrSpatialObjectSemanticLabelEXT - Parametr
semanticLabelCountmusi być większy niż0
Etykieta semantyczna klawiatury
Dane komponentu
typedef enum XrSpatialKeyboardSemanticLabelEXT {
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT = 2,
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialKeyboardSemanticLabelEXT;
Wyliczenie XrSpatialKeyboardSemanticLabelEXT opisuje etykietę semantyczną klawiatury.
Zakres i orientacja elementu XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT reprezentowanego przez komponent Ograniczony obiekt 3D w tym samym elemencie są pokazane na poniższym obrazie (xyz = rgb) zaczynającym się w środku obiektu.
Rysunek 30. Orientacja klawiatury.
Opis typu wyliczeniowego
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT
Środowisko wykonawcze nie mogło sklasyfikować tej encji.
XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT
Encja to klawiatura.
Struktura listy komponentów do danych zapytania
Struktura XrSpatialComponentKeyboardSemanticLabelListEXT jest zdefiniowana w ten sposób:
typedef struct XrSpatialComponentKeyboardSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialKeyboardSemanticLabelEXT* semanticLabels;
} XrSpatialComponentKeyboardSemanticLabelListEXT;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.semanticLabelCounttouint32_topisujący liczbę elementów w tablicysemanticLabels.semanticLabelsto tablica XrSpatialKeyboardSemanticLabelEXT .
Aby wysłać zapytanie do komponentu etykiety semantycznej klawiatury encji przestrzennych w XrSpatialSnapshotEXT , uwzględnij XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT w XrSpatialComponentDataQueryConditionEXT :: componentTypes i dodaj XrSpatialComponentKeyboardSemanticLabelListEXT do łańcucha XrSpatialComponentDataQueryResultEXT :: next.
Środowisko wykonawcze musi zwracać XR_ERROR_VALIDATION_FAILURE z xrQuerySpatialComponentDataEXT, jeśli XrSpatialComponentKeyboardSemanticLabelListEXT znajduje się w łańcuchu XrSpatialComponentDataQueryResultEXT :: next, ale XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT nie jest uwzględniony w XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Środowisko wykonawcze musi zwracać XR_ERROR_SIZE_INSUFFICIENT z xrQuerySpatialComponentDataEXT, jeśli semanticLabelCount jest mniejsze niż XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_EXT_spatial_object_trackingmusi być włączone przed użyciem XrSpatialComponentKeyboardSemanticLabelListEXT. -
typemusi mieć wartośćXR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur -
semanticLabelsmusi być wskaźnikiem do tablicy wartościsemanticLabelCountXrSpatialKeyboardSemanticLabelEXT - Parametr
semanticLabelCountmusi być większy niż0
Konfiguracja
Jeśli XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT jest wymieniony w XrSpatialCapabilityComponentTypesEXT :: componentTypes dla danej funkcji, aplikacja może go włączyć, dodając element wyliczeniowy do listy XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents struktury pochodnej XrSpatialCapabilityConfigurationBaseHeaderEXT funkcji, która obsługuje ten komponent.
Ten komponent nie wymaga żadnej specjalnej konfiguracji, aby można go było uwzględnić w łańcuchu XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
Etykieta semantyczna myszy
Dane komponentu
typedef enum XrSpatialMouseSemanticLabelEXT {
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT = 2,
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMouseSemanticLabelEXT;
Wyliczenie XrSpatialMouseSemanticLabelEXT opisuje etykietę semantyczną myszy.
Opis typu wyliczeniowego
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT
Środowisko wykonawcze nie mogło sklasyfikować tej encji.
XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT
Encja to mysz.
Struktura listy komponentów do danych zapytania
Struktura XrSpatialComponentMouseSemanticLabelListEXT jest zdefiniowana w ten sposób:
typedef struct XrSpatialComponentMouseSemanticLabelListEXT {
XrStructureType type;
void* next;
uint32_t semanticLabelCount;
XrSpatialMouseSemanticLabelEXT* semanticLabels;
} XrSpatialComponentMouseSemanticLabelListEXT;
Opisy członków
typeto XrStructureType tej struktury.nexttoNULLlub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.semanticLabelCounttouint32_topisujący liczbę elementów w tablicysemanticLabels.semanticLabelsto tablica obiektów XrSpatialMouseSemanticLabelEXT .
Aby wysłać zapytanie o komponent etykiety semantycznej myszy elementów przestrzennych w XrSpatialSnapshotEXT , uwzględnij XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT w XrSpatialComponentDataQueryConditionEXT :: componentTypes i dodaj XrSpatialComponentMouseSemanticLabelListEXT do łańcucha XrSpatialComponentDataQueryResultEXT :: next.
Środowisko wykonawcze musi zwracać XR_ERROR_VALIDATION_FAILURE z xrQuerySpatialComponentDataEXT, jeśli XrSpatialComponentMouseSemanticLabelListEXT znajduje się w łańcuchu XrSpatialComponentDataQueryResultEXT :: next, ale XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT nie jest uwzględniony w XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Środowisko wykonawcze musi zwracać XR_ERROR_SIZE_INSUFFICIENT z xrQuerySpatialComponentDataEXT, jeśli semanticLabelCount jest mniejsze niż XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Prawidłowe użycie (pośrednie)
- Rozszerzenie
XR_EXT_spatial_object_trackingmusi być włączone przed użyciem XrSpatialComponentMouseSemanticLabelListEXT. -
typemusi mieć wartośćXR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT -
nextmusi mieć wartośćNULLlub być prawidłowym wskaźnikiem do następnej struktury w łańcuchu struktur -
semanticLabelsmusi być wskaźnikiem do tablicy wartościsemanticLabelCountXrSpatialMouseSemanticLabelEXT - Parametr
semanticLabelCountmusi być większy niż0
Konfiguracja
Jeśli XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT jest wymieniony w XrSpatialCapabilityComponentTypesEXT :: componentTypes dla danej funkcji, aplikacja może go włączyć, dodając element wyliczeniowy do listy XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents struktury pochodnej XrSpatialCapabilityConfigurationBaseHeaderEXT funkcji, która obsługuje ten komponent.
Ten komponent nie wymaga żadnej specjalnej konfiguracji, aby można go było uwzględnić w łańcuchu XrSpatialCapabilityConfigurationBaseHeaderEXT :: next.
Przykładowy kod
Konfigurowanie funkcji śledzenia obiektów
Poniższy przykładowy kod pokazuje, jak skonfigurować funkcję śledzenia obiektów podczas tworzenia kontekstu przestrzennego.
// Check if object tracking capability is supported
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT) == capabilities.end()) {
return;
}
// Enumerate supported components for object tracking capability
XrSpatialCapabilityComponentTypesEXT objectComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));
std::vector<XrSpatialComponentTypeEXT> objectCapabilityComponents(objectComponents.componentTypeCountOutput);
objectComponents.componentTypeCapacityInput = objectCapabilityComponents.size();
objectComponents.componentTypes = objectCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));
// Check if the object & keyboard semantic labels component is supported
const auto supportsComponent = [&objectCapabilityComponents](XrSpatialComponentTypeEXT component) {
return std::find(objectCapabilityComponents.begin(), objectCapabilityComponents.end(), component) != objectCapabilityComponents.end();
};
const bool supportsObjectSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
const bool supportsKeyboardSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
// Enumerate supported features for object tracking capability
uint32_t featureCount;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> features(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, featureCount, &featureCount, features.data()));
const bool supportsObjectSemanticLabelSubsetFeature = std::find(features.begin(), features.end(), XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT) != features.end();
// Create a spatial context
XrSpatialContextEXT spatialContext{};
// Enable the guaranteed components of the object tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
// Optionally enable the supported semantic labels
if (supportsObjectSemanticLabel) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
}
if (supportsKeyboardSemanticLabel) {
enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}
// We only want to track sofa and table.
std::vector<XrSpatialObjectSemanticLabelEXT> objectSemanticLabelSubset = {
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT,
XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT
};
XrSpatialFeatureObjectSemanticLabelSubsetEXT subsetFeature{XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT};
subsetFeature.semanticLabelCount = objectSemanticLabelSubset.size();
subsetFeature.semanticLabels = objectSemanticLabelSubset.data();
XrSpatialCapabilityConfigurationObjectTrackingEXT objectTrackingConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT};
objectTrackingConfig.capability = XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT;
objectTrackingConfig.enabledComponentCount = enabledComponents.size();
objectTrackingConfig.enabledComponents = enabledComponents.data();
if (supportsObjectSemanticLabelSubsetFeature) {
objectTrackingConfig.next = &subsetFeature;
}
std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&objectTrackingConfig),
};
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;
// ...
// Discovery entities with the spatial context
// ...
CHK_XR(xrDestroySpatialContextEXT(spatialContext));
Odkrywanie elementów przestrzennych i wykonywanie zapytań o dane komponentów
Poniższy przykładowy kod pokazuje, jak wykrywać elementy przestrzenne w kontekście skonfigurowanym za pomocą XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT i wykonywać zapytania dotyczące danych komponentu.
XrFutureEXT future = XR_NULL_FUTURE_EXT;
// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
if (supportsKeyboardSemanticLabel) {
snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}
auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
snapshotCreateInfo.componentTypes = snapshotComponents.data();
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));
waitUntilReady(future);
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
completionInfo.baseSpace = localSpace;
completionInfo.time = time;
completionInfo.future = future;
XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
if (completion.futureResult == XR_SUCCESS) {
// Query for the semantic label component data
XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
queryCond.componentTypeCount = snapshotComponents.size();
queryCond.componentTypes = snapshotComponents.data();
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.entityIdCountOutput);
queryResult.entityIdCapacityInput = entityIds.size();
queryResult.entityIds = entityIds.data();
queryResult.entityStateCapacityInput = entityStates.size();
queryResult.entityStates = entityStates.data();
std::vector<XrBoxf> bounded3D(queryResult.entityIdCountOutput);
XrSpatialComponentBounded3DListEXT bounded3DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXT};
bounded3DList.boundCount = bounded3D.size();
bounded3DList.bounds = bounded3D.data();
queryResult.next = &bounded3DList;
std::vector<XrSpatialKeyboardSemanticLabelEXT> semanticLabels;
XrSpatialComponentKeyboardSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT};
if (supportsKeyboardSemanticLabel) {
semanticLabels.resize(queryResult.entityIdCountOutput);
semanticLabelsList.semanticLabelCount = semanticLabels.size();
semanticLabelsList.semanticLabels = semanticLabels.data();
semanticLabelsList.next = queryResult.next;
queryResult.next = &semanticLabelsList;
}
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) {
continue;
}
// 3D bounds for entity entityIds[i] is bounded3D[i].extents centered on bounded3D[i].center.
if (supportsKeyboardSemanticLabel) {
// semantic label for entity entityIds[i] is semanticLabels[i].
}
}
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
// ...
}
Nowe domy
- XrSpatialCapabilityConfigurationObjectTrackingEXT
Rozszerzenie XrSpatialCapabilityConfigurationObjectTrackingEXT :
Rozszerzenie XrSpatialComponentDataQueryResultEXT :
Nowe wartości w polu enum
Nowe stałe typu wyliczeniowego
XR_EXT_SPATIAL_OBJECT_TRACKING_EXTENSION_NAMEXR_EXT_spatial_object_tracking_SPEC_VERSIONRozszerzenie XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
Rozszerzenie XrSpatialCapabilityFeatureEXT :
XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
Rozszerzenie XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
Rozszerzanie XrStructureType :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
Problemy
Historia zmian
Wersja 1, 3 czerwca 2025 r. (Nihav Jain, Google)
- Początkowy opis rozszerzenia