XR_ANDROID_trackables Расширение OpenXR

Строка имени

XR_ANDROID_trackables

Тип расширения

Расширение экземпляра

Зарегистрированный внутренний номер

456

Редакция

1

Зависимости расширений и версий

ОпенXR 1.0

Дата последнего изменения

2024-09-30

IP-статус

Нет известных претензий на интеллектуальную собственность.

Авторы

Спенсер Куин, Google

Нихав Джайн, Google

Джон Пёрси, Google

Джаред Файндер, Google

Левана Чен, Google

Кенни Веркамер, Google

Обзор

Это расширение позволяет приложению получать доступ к отслеживаемым объектам из физической среды и создавать привязки, прикрепленные к отслеживаемым объектам.

Это расширение определяет отслеживаемые самолеты. Другие расширения могут добавлять дополнительные отслеживаемые типы. Например, XR_ANDROID_trackables_object добавляет отслеживаемые объекты, а XR_ANDROID_depth_texture добавляет буферы глубины, которые позволяют выполнять лучевое приведение к произвольным точкам среды.

Отслеживаемое — это то, что отслеживается в физической среде (см. XrTrackableTypeANDROID ):

  • плоскость (например, стена, пол, потолок, стол)
  • объект (например, клавиатура, мышь, ноутбук)

Создайте отслеживаемый трекер

XrTrackableTrackerANDROID — это дескриптор, который представляет ресурсы, необходимые для обнаружения и обновления отслеживаемых объектов данного XrTrackableTypeANDROID в среде.

XR_DEFINE_HANDLE(XrTrackableTrackerANDROID)

Функция xrCreateTrackableTrackerANDROID определяется как:

XrResult xrCreateTrackableTrackerANDROID(
    XrSession                                   session,
    const XrTrackableTrackerCreateInfoANDROID*  createInfo,
    XrTrackableTrackerANDROID*                  trackableTracker);

Описание параметров

  • session — это XrSession , который создает трекер.
  • createInfo — это указатель на структуру XrTrackableTrackerCreateInfoANDROID , содержащую параметры, которые будут использоваться для создания трекера.
  • trackableTracker — это указатель на дескриптор, в котором возвращается созданный XrTrackableTrackerANDROID .

Приложение может использовать функцию xrCreateTrackableTrackerANDROID для создания отслеживаемого трекера.

  • XR_ERROR_FEATURE_UNSUPPORTED будет возвращен, если система не поддерживает отслеживаемые объекты указанного типа.
  • XR_ERROR_PERMISSION_INSUFFICIENT будет возвращен, если вызывающему приложению не были предоставлены необходимые разрешения.

Приложение может использовать возвращенный дескриптор трекера в последующих вызовах API. Дескриптор XrTrackableTrackerANDROID в конечном итоге должен быть освобожден с помощью функции xrDestroyTrackableTrackerANDROID .

Допустимое использование (неявное)

Коды возврата

Успех

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Отказ

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_FEATURE_UNSUPPORTED

Структура XrTrackableTrackerCreateInfoANDROID определяется как:

typedef struct XrTrackableTrackerCreateInfoANDROID {
    XrStructureType           type;
    void*                     next;
    XrTrackableTypeANDROID    trackableType;
} XrTrackableTrackerCreateInfoANDROID;

Описания участников

  • type — это XrStructureType этой структуры.
  • next имеет значение NULL или указатель на следующую структуру в цепочке структур. Никакие такие структуры не определены в ядре OpenXR или этом расширении.
  • trackableType — это XrTrackableTypeANDROID , который будет отслеживать трекер.

Структура XrTrackableTrackerCreateInfoANDROID предоставляет параметры создания для XrTrackableTrackerANDROID при передаче в xrCreateTrackableTrackerANDROID .

Расширения могут определять структуры, которые можно присоединить к next чтобы обеспечить дополнительную настройку отслеживаемых трекеров.

Допустимое использование (неявное)

Перечисление XrTrackableTypeANDROID определяется как:

typedef enum XrTrackableTypeANDROID {
    XR_TRACKABLE_TYPE_NOT_VALID_ANDROID = 0,
    XR_TRACKABLE_TYPE_PLANE_ANDROID = 1,
    XR_TRACKABLE_TYPE_DEPTH_ANDROID = 1000463000,
    XR_TRACKABLE_TYPE_OBJECT_ANDROID = 1000466000
} XrTrackableTypeANDROID;

Функция xrDestroyTrackableTrackerANDROID определяется как:

XrResult xrDestroyTrackableTrackerANDROID(
    XrTrackableTrackerANDROID                   trackableTracker);

Описание параметров

Функция xrDestroyTrackableTrackerANDROID уничтожает отслеживаемый трекер.

Если нет другого действительного XrTrackableTrackerANDROID , созданного с тем же XrTrackableTypeANDROID , система может отключить службы отслеживания, необходимые для этого отслеживаемого типа, для экономии системных ресурсов.

Допустимое использование (неявное)

Безопасность потоков

  • Доступ к trackableTracker и любым дочерним дескрипторам должен быть синхронизирован извне.

Коды возврата

Успех

  • XR_SUCCESS

Отказ

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

Получить все отслеживаемые файлы

Атом XrTrackableANDROID определяется как:

XR_DEFINE_ATOM(XrTrackableANDROID)

XrTrackableANDROID используется для представления одного отслеживаемого объекта и действителен только в течение жизненного цикла связанного с ним XrTrackableTrackerANDROID .

Функция xrGetAllTrackablesANDROID определяется как:

XrResult xrGetAllTrackablesANDROID(
    XrTrackableTrackerANDROID                   trackableTracker,
    uint32_t                                    trackableCapacityInput,
    uint32_t*                                   trackableCountOutput,
    XrTrackableANDROID*                         trackables);

Описание параметров

  • trackableTracker — это XrTrackableTrackerANDROID для запроса.

  • trackableCapacityInput — это емкость массива trackables или 0, чтобы указать запрос на получение необходимой емкости.

  • trackableCountOutput — это указатель на количество записанных trackables или указатель на необходимую емкость в случае, если trackables недостаточно.

  • trackables — это указатель на массив XrTrackableANDROID . Оно может быть NULL если trackableCapacityInput равно 0.

  • См. раздел «Параметры размера буфера» для подробного описания получения необходимого размера trackables .

xrGetAllTrackablesANDROID заполняет массив XrTrackableANDROID представляющий отслеживаемые объекты, обнаруженные в среде. XrTrackableTypeANDROID возвращаемых trackables должен совпадать с XrTrackableTypeANDROID trackableTracker .

Получите отслеживаемый самолет

Функция xrGetTrackablePlaneANDROID определяется как:

XrResult xrGetTrackablePlaneANDROID(
    XrTrackableTrackerANDROID                   trackableTracker,
    const XrTrackableGetInfoANDROID*            getInfo,
    XrTrackablePlaneANDROID*                    planeOutput);

Описание параметров

  • trackableTracker — это XrTrackableTrackerANDROID для запроса.

  • getInfo — это XrTrackableGetInfoANDROID , содержащий информацию, используемую для получения отслеживаемого самолета.

  • planeOutput — это указатель на структуру XrTrackablePlaneANDROID , в которой возвращается отслеживаемая плоскость.

Функция xrGetTrackablePlaneANDROID возвращает сведения об отслеживаемой плоскости, такие как ее геометрия, ориентация и состояние отслеживания.

Информация о плоскости разрешается относительно базового пространства во время вызова xrGetTrackablePlaneANDROID с использованием XrTrackableGetInfoANDROID::time, XrTrackableGetInfoANDROID::baseSpace .

Допустимое использование (неявное)

Коды возврата

Успех

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Отказ

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_TIME_INVALID

Структура XrTrackableGetInfoANDROID определяется как:

typedef struct XrTrackableGetInfoANDROID {
    XrStructureType       type;
    void*                 next;
    XrTrackableANDROID    trackable;
    XrSpace               baseSpace;
    XrTime                time;
} XrTrackableGetInfoANDROID;

Описания участников

  • type — это XrStructureType этой структуры.
  • next имеет значение NULL или указатель на следующую структуру в цепочке структур. Никакие такие структуры не определены в ядре OpenXR или этом расширении.
  • trackable — это плоскость XrTrackableANDROID для запроса.
  • baseSpace поза плоскости будет относительно этого XrSpace во time .
  • time — это XrTime , в котором можно оценить координаты относительно baseSpace .

Структура XrTrackableGetInfoANDROID предоставляет параметры запроса при передаче в xrGetTrackablePlaneANDROID . trackable должен соответствовать trackableTracker используемому в xrGetTrackablePlaneANDROID .

XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID будет возвращен, если отслеживаемый тип trackable объекта не XR_TRACKABLE_TYPE_PLANE_ANDROID .

Допустимое использование (неявное)

Структура XrTrackablePlaneANDROID определяется как:

typedef struct XrTrackablePlaneANDROID {
    XrStructureType           type;
    void*                     next;
    XrTrackingStateANDROID    trackingState;
    XrPosef                   centerPose;
    XrExtent2Df               extents;
    XrPlaneTypeANDROID        planeType;
    XrPlaneLabelANDROID       planeLabel;
    XrTrackableANDROID        subsumedByPlane;
    XrTime                    lastUpdatedTime;
    uint32_t                  vertexCapacityInput;
    uint32_t*                 vertexCountOutput;
    XrVector2f*               vertices;
} XrTrackablePlaneANDROID;

Описания участников

  • type — это XrStructureType этой структуры.
  • next имеет значение NULL или указатель на следующую структуру в цепочке структур. Никакие такие структуры не определены в ядре OpenXR или этом расширении.
  • trackingState — это XrTrackingStateANDROID самолета.
  • centerPose — это XrPosef, определяющий положение и ориентацию плоскости в системе координат соответствующего XrTrackableGetInfoANDROID::baseSpace . Здесь тождественная ориентация представляет собой координатные оси с +Y, параллельные нормали плоскости.
  • extents — это размер плоскости XrExtent2Df .
  • planeType — это XrPlaneTypeANDROID , определенный средой выполнения для этой плоскости.
  • planeLabel — это XrPlaneLabelANDROID , определенный средой выполнения для этой плоскости.
  • subsumedByPlane — это XrTrackableANDROID плоскости, которая включает эту плоскость ( XR_NULL_TRACKABLE_ANDROID если таковой не существует).
  • lastUpdatedTime — это XrTime последнего обновления плоскости.
  • vertexCapacityInput — это емкость массива vertices или 0, чтобы указать запрос на получение необходимой емкости.
  • vertexCountOutput — это указатель на количество записанных vertices или указатель на требуемую емкость в случае, если vertices недостаточно.
  • vertices — это указатель на массив XrVector2f . Оно может быть NULL если vertexCapacityInput равен 0. Вершины располагаются против часовой стрелки. Многоугольник может быть вогнутым и не должен быть самопересекающимся.
  • См. раздел «Параметры размера буфера» для подробного описания получения необходимого размера vertices .

Допустимое использование (неявное)

Перечисление XrTrackingStateANDROID описывает состояние отслеживания XrTrackableANDROID .

typedef enum XrTrackingStateANDROID {
    XR_TRACKING_STATE_PAUSED_ANDROID = 0,
    XR_TRACKING_STATE_STOPPED_ANDROID = 1,
    XR_TRACKING_STATE_TRACKING_ANDROID = 2
} XrTrackingStateANDROID;

XrTrackingStateANDROID

Описание

XR_TRACKING_STATE_PAUSED_ANDROID

Указывает, что отслеживание или отслеживание привязки приостановлено, но может быть возобновлено в будущем.

XR_TRACKING_STATE_STOPPED_ANDROID

Отслеживание на этом отслеживаемом объекте остановлено и никогда не будет возобновлено.

XR_TRACKING_STATE_TRACKING_ANDROID

Объект отслеживается, и его поза актуальна.

Перечисление XrPlaneTypeANDROID — это тип плоскости XrTrackableANDROID .

typedef enum XrPlaneTypeANDROID {
    XR_PLANE_TYPE_HORIZONTAL_DOWNWARD_FACING_ANDROID = 0,
    XR_PLANE_TYPE_HORIZONTAL_UPWARD_FACING_ANDROID = 1,
    XR_PLANE_TYPE_VERTICAL_ANDROID = 2,
    XR_PLANE_TYPE_ARBITRARY_ANDROID = 3
} XrPlaneTypeANDROID;

Перечисление XrPlaneLabelANDROID — это метка плоскости XrTrackableANDROID .

typedef enum XrPlaneLabelANDROID {
    XR_PLANE_LABEL_UNKNOWN_ANDROID = 0,
    XR_PLANE_LABEL_WALL_ANDROID = 1,
    XR_PLANE_LABEL_FLOOR_ANDROID = 2,
    XR_PLANE_LABEL_CEILING_ANDROID = 3,
    XR_PLANE_LABEL_TABLE_ANDROID = 4
} XrPlaneLabelANDROID;

Создайте якорное пространство

XrResult xrCreateAnchorSpaceANDROID(
    XrSession                                   session,
    const XrAnchorSpaceCreateInfoANDROID*       createInfo,
    XrSpace*                                    anchorOutput);

Описание параметров

  • session — это XrSession , который создает пространство привязки.
  • createInfo — это указатель на структуру XrAnchorSpaceCreateInfoANDROID , содержащую параметры, которые будут использоваться для создания пространства привязки.
  • anchorOutput — это указатель на дескриптор, в котором возвращается созданное XrSpace .

В любой момент времени положение и направление якоря отслеживаются или не отслеживаются. Это означает, что оба XR_SPACE_LOCATION_POSITION_TRACKED_BIT и XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT должны быть установлены или оба должны быть очищены, когда приложение вызывает xrLocateSpace или xrLocateSpaces anchorOutput .

Приложение должно в конечном итоге освободить возвращенный XrSpace с помощью xrDestroySpace .

  • XR_ERROR_FEATURE_UNSUPPORTED должен быть возвращен, если система не поддерживает привязки.
  • XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID должен быть возвращен, если конкретное вложение привязки не поддерживается.

Допустимое использование (неявное)

Коды возврата

Успех

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

Отказ

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_POSE_INVALID
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_OUT_OF_MEMORY

Структура XrAnchorSpaceCreateInfoANDROID определяется как:

typedef struct XrAnchorSpaceCreateInfoANDROID {
    XrStructureType       type;
    void*                 next;
    XrSpace               space;
    XrTime                time;
    XrPosef               pose;
    XrTrackableANDROID    trackable;
} XrAnchorSpaceCreateInfoANDROID;

Описания участников

  • type — это XrStructureType этой структуры.
  • next имеет значение NULL или указатель на следующую структуру в цепочке структур. Никакие такие структуры не определены в ядре OpenXR или этом расширении.
  • space — это XrSpace , на котором будет создана привязка.
  • time — это XrTime создания привязки.
  • pose — это XrPosef якоря.
  • trackable — это XrTrackableANDROID , к которому будет прикреплена привязка. Это может быть XR_NULL_TRACKABLE_ANDROID для создания пространственной привязки.

Допустимое использование (неявное)

Пример кода для получения всех отслеживаемых объектов

В следующем примере кода показано, как получить все отслеживаемые объекты заданного типа.

XrSession session; // previously initialized

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateTrackableTrackerANDROID xrCreateTrackableTrackerANDROID; // previously initialized
PFN_xrGetAllTrackablesANDROID xrGetAllTrackablesANDROID; // previously initialized
PFN_xrDestroyTrackableTrackerANDROID xrDestroyTrackableTrackerANDROID; // previously initialized

XrTrackableTrackerCreateInfoANDROID createInfo{XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID};
createInfo.trackableType = XR_TRACKABLE_TYPE_PLANE_ANDROID;
XrTrackableTrackerANDROID planeTrackableTracker;
XrResult result = xrCreateTrackableTrackerANDROID(
  session,
  &createInfo,
  &planeTrackableTracker);
if (result != XR_SUCCESS) { /* Handle failures. */ }

uint32_t trackableCountOutput = 0;
std::vector<XrTrackableANDROID> allPlaneTrackables;

// Query the number of trackables available.
result = xrGetAllTrackablesANDROID(
  planeTrackableTracker,
  0,
  &trackableCountOutput,
  nullptr
);

if (result == XR_SUCCESS) {
  allPlaneTrackables.resize(trackableCountOutput, XR_NULL_HANDLE);

  // Fetch the actual trackable handles in the appropriately resized array.
  result = xrGetAllTrackablesANDROID(
    planeTrackableTracker,
    trackableCountOutput,
    &trackableCountOutput,
    allPlaneTrackables.data());

  if (result == XR_SUCCESS) {
    for (XrTrackableANDROID trackable : allPlaneTrackables) {
      // You now have all trackables of the specified type.
    }
  }
}

// Release trackable tracker.
result = xrDestroyTrackableTrackerANDROID(planeTrackableTracker);

Пример кода для получения отслеживаемого самолета

В следующем примере кода показано, как получить отслеживаемую плоскость из существующего XrTrackableANDROID , полученного из результата попадания XR_ANDROID_raycast или xrGetTrackablesANDROID .

XrTrackableTrackerANDROID planeTracker; // previously created

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrGetTrackablePlaneANDROID xrGetTrackablePlaneANDROID; // previously initialized

XrTime updateTime; // Time used for the current frame's simulation update.
XrSpace appSpace; // Space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
XrTrackableANDROID planeTrackable; // Acquired from a hit result or getTrackables().

XrTrackableGetInfoANDROID planeGetInfo;
planeGetInfo.type = XR_TYPE_TRACKABLE_GET_INFO_ANDROID;
planeGetInfo.next = nullptr;
planeGetInfo.trackable = planeTrackable;
planeGetInfo.space = appSpace;
planeGetInfo.time = updateTime;

XrTrackablePlaneANDROID plane = { XR_TYPE_TRACKABLE_PLANE_ANDROID };
result = xrGetTrackablePlaneANDROID(
  planeTracker,
  &planeGetInfo,
  &plane
);

if (result == XR_SUCCESS) {
  // Plane tracking state, center pose, extents, type now available in plane.
}

Пример кода для создания пространства привязки

В следующем примере кода показано, как создать пространство привязки, прикрепленное к отслеживаемому объекту.

XrSession session; // Created at app startup.
XrTime updateTime; // Time used for the current frame's simulation update.
XrSpace appSpace; // Space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
XrTrackableANDROID planeTrackable; // Acquired from a hit result or getTrackables().

// Create an anchor at (2, 2, 2) world-coordinates.
XrAnchorSpaceCreateInfoANDROID spatialAnchorCreateInfo;
spatialAnchorCreateInfo.type = XR_TYPE_ANCHOR_SPACE_CREATE_INFO_ANDROID;
spatialAnchorCreateInfo.next = nullptr;
spatialAnchorCreateInfo.space = appSpace;
spatialAnchorCreateInfo.time = updateTime;
spatialAnchorCreateInfo.pose = { { 0, 0, 0, 1 }, { 2, 2, 2 } };

XrSpace spatialAnchor = XR_NULL_HANDLE;
XrResult result = xrCreateAnchorSpaceANDROID(
  session,
  &spatialAnchorCreateInfo,
  &spatialAnchor
);

// Create an anchor attached to a trackable.
XrTrackablePlane plane = ...;
XrAnchorSpaceCreateInfoANDROID trackableAnchorCreateInfo;
trackableAnchorCreateInfo.type = XR_TYPE_ANCHOR_SPACE_CREATE_INFO_ANDROID;
trackableAnchorCreateInfo.next = nullptr;
trackableAnchorCreateInfo.space = appState;
trackableAnchorCreateInfo.pose = plane.centerPose;
trackableAnchorCreateInfo.trackable = planeTrackable;

XrSpace trackableAnchor = XR_NULL_HANDLE;
XrResult result = xrCreateAnchorSpaceANDROID(
  session,
  &trackableAnchorCreateInfo,
  &trackableAnchor
);
while (true) {
  // app update loop
  // ...

  // Get the current location of the anchor's space w.r.t the world.
  XrSpaceLocation anchorLocation = { XR_TYPE_SPACE_LOCATION };
  result = xrLocateSpace(trackableAnchor, appSpace, updateTime, &anchorLocation);

  if (anchor.trackingState == XR_TRACKING_STATE_TRACKING_ANDROID) {
    // Update anchor pose.
    doDrawingForAnchor(anchorLocation.pose);
  } else {
    // ...
  }
}

// Cleanup - destroy the space, detatch the anchor so its no longer tracked by the
// runtime and then release all resources held by it.
xrDestroySpace(spatialAnchor);
xrDestroySpace(trackableAnchor);

Новые базовые типы

Новые типы объектов

Новые константы перечисления

Перечисление XrStructureType расширено:

  • XR_TYPE_TRACKABLE_GET_INFO_ANDROID
  • XR_TYPE_ANCHOR_SPACE_CREATE_INFO_ANDROID
  • XR_TYPE_TRACKABLE_PLANE_ANDROID
  • XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID

Перечисление XrObjectType расширено:

  • XR_OBJECT_TYPE_TRACKABLE_TRACKER_ANDROID

Перечисление XrResult расширено:

  • XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID
  • XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID

Новые перечисления

Новые структуры

Новые функции

Проблемы

История версий

  • Редакция 1, 27 сентября 2024 г. (Кенни Веркамер)
    • Первоначальное описание расширения.