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

  • type to XrStructureType tej struktury.
  • next to NULL lub wskaźnik do następnej struktury w łańcuchu struktur.
  • capability to XrSpatialCapabilityEXT i musi mieć wartość XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT .
  • enabledComponentCount to uint32_t opisujący liczbę elementów w tablicy enabledComponents.
  • enabledComponents to 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)

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_EXT i XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT jako 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_EXT ani XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT w 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

  • type to XrStructureType tej struktury.
  • next to NULL lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
  • semanticLabelCount to uint32_t opisujący liczbę elementów w tablicy semanticLabels.
  • semanticLabels to 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)

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

  • type to XrStructureType tej struktury.
  • next to NULL lub wskaźnik do następnej struktury w łańcuchu struktur.
  • semanticLabelCount to uint32_t opisujący liczbę elementów w tablicy semanticLabels.
  • semanticLabels to 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)

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.

ext spatial object tracking keyboard orientation

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

  • type to XrStructureType tej struktury.
  • next to NULL lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
  • semanticLabelCount to uint32_t opisujący liczbę elementów w tablicy semanticLabels.
  • semanticLabels to 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)

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

  • type to XrStructureType tej struktury.
  • next to NULL lub wskaźnik do następnej struktury w łańcuchu struktur. W podstawowym interfejsie OpenXR ani w tym rozszerzeniu nie zdefiniowano takich struktur.
  • semanticLabelCount to uint32_t opisujący liczbę elementów w tablicy semanticLabels.
  • semanticLabels to 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)

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

Nowe wartości w polu enum

Nowe stałe typu wyliczeniowego

  • XR_EXT_SPATIAL_OBJECT_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_object_tracking_SPEC_VERSION
  • Rozszerzenie 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_EXT
    • XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
  • Rozszerzanie XrStructureType :

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT
    • XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT

Problemy

Historia zmian

  • Wersja 1, 3 czerwca 2025 r. (Nihav Jain, Google)

    • Początkowy opis rozszerzenia