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

Имя Строка

XR_ANDROID_trackables

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

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

Зарегистрированный добавочный номер

456

Пересмотр

1

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

OpenXR 1.0

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

2024-09-30

Статус ИС

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

Участники

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

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

Джон Перси, Google

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

Левана Чен, Google

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

Обзор

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

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

Отслеживаемое — это то, что отслеживается в физической среде (см. 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;

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

  • typeXrStructureType этой структуры.
  • nextNULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены в ядре 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;

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

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

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

Если тип trackable объекта не равен XR_TRACKABLE_TYPE_PLANE_ANDROID , будет возвращено значение XR_ERROR_MISMATCHING_TRACKABLE_TYPE_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;

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

  • typeXrStructureType этой структуры.
  • nextNULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены в ядре 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 . в разделе «Параметры размера буфера».

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

  • Перед использованием XrTrackablePlaneANDROID необходимо включить расширение XR_ANDROID_trackables
  • type должен быть XR_TYPE_TRACKABLE_PLANE_ANDROID
  • next должен быть NULL или действительным указателем на следующую структуру в цепочке структур
  • trackingState должен быть допустимым значением XrTrackingStateANDROID
  • planeType должен быть допустимым значением XrPlaneTypeANDROID
  • planeLabel должен быть допустимым значением XrPlaneLabelANDROID
  • vertexCountOutput должен быть указателем на значение uint32_t
  • vertices должен быть указателем на массив структур vertexCapacityInput XrVector2f
  • Параметр vertexCapacityInput должен быть больше 0

Перечисление 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;

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

  • typeXrStructureType этой структуры.
  • nextNULL или указатель на следующую структуру в цепочке структур. Такие структуры не определены в ядре OpenXR или в этом расширении.
  • space — это XrSpace , на котором будет создан якорь.
  • time — это XrTime создания якоря.
  • pose — это XrPosef якоря.
  • trackableXrTrackableANDROID , к которому будет прикреплен якорь. Это может быть 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, 2024-09-27 (Кенни Веркемер)
    • Первоначальное описание расширения.

OpenXR™ и логотип OpenXR являются товарными знаками компании Khronos Group Inc. и зарегистрированы в качестве товарного знака в Китае, Европейском Союзе, Японии и Великобритании.