Впервые на русском: Документация Oculus для разработчиков. Руководство ПК SDK для разработчика. Дополнительной информация об Oculus Touch

Продолжаем публикацию эксклюзивной информации для разработчиков от Oculus. Новый раздел посвящён дополнительной информации об Oculus Touch.

  1. Документация Oculus для разработчиков:
    1. Введение в рекомендации
    2. Бинокулярное зрение, стереоскопическая визуализация и индикаторы глубины
    3. Поле зрения и масштаб
    4. Методы рендеринга
    5. Движение
    6. Отслеживание
    7. «Болезнь симуляции»
    8. Пользовательский интерфейс
    9. Пользовательский ввод и навигация
    10. Заключение
    11. Введение в SDK для ПК
    12. Руководство разработчика
    13. Руководство по началу работы с ПК SDK
    14. Руководство ПК SDK для разработчика. Интеграция LibOVR
    15. Инициализация и перечень сенсоров
    16. Рендеринг в Oculus Rift
    17. Расширенная настройка рендеринга
    18. Управление связью с виртуальной реальностью
    19. Система безопасности Oculus Guardian
    20. Аудио Oculus Rift
    21. Контроллеры Oculus Touch
    22. Дополнительная информация об Oculus Touch
    23. Примеры использования SDK и геймпада
    24. Оптимизация вашего приложения
    25. Подключение контроллеров Oculus Touch
    26. Асинхронный SpaceWarp
    27. Дополнительная информация о подключении контроллеров Oculus Touch
    28. Справочная информация
Данные контроллера

Oculus SDK предоставляет API-интерфейсы, которые сообщают позицию и состояние для каждого контроллера Oculus Touch.

Эти данные отображаются в двух местах:

  • ovrTrackingState::HandPoses[2] – возвращает состояние позиции и отслеживания для каждого контроллера Oculus Touch.
  • ovrInputState – структура, возвращаемая ovr_GetInputState, которая содержит информацию о кнопке Oculus Touch, джойстика, триггера и ёмкостное сенсорное состояние датчика.

Данные о потере руки для контроллера отделяются от состояния входа, поскольку они поступают из другой системы и сообщаются в отдельные моменты времени. Позиции контроллера возвращаются системой отслеживания и прогнозируются одновременно со шлемом виртуальной реальности исходя из абсолютного времени, переданного в GetTrackingState. Наличие данных об обеих руках и шлеме виртуальной реальности, которые сообщаются вместе, обеспечивает согласованное сканирование состояния системы.

Ручное слежение

Сенсоры-созвездия, используемые для отслеживания положения головы в Oculus Rift, также отслеживают позиции рук контроллеров Oculus Touch.

Для того, чтобы установить данные, в которых содержится информации об Oculus Rift и контроллерах Oculus Touch, будет использоваться по меньшей мере два сенсора-созвездия, что нужно для того, чтобы улучшить точность слежения и помочь с проблемами окклюзии.

SDK использует ту же структуру ovrPoseStatef, что и шлем виртуальной реальности, которая включает шесть степеней свободы (6DoF) и данные отслеживания (ориентация, положение и их первая и вторая производные).

Вот пример того, как получить данные для отслеживания:

 

ovrTrackingState trackState = ovr_GetTrackingState(session, displayMidpointSeconds, ovrTrue);

ovrPosef         handPoses[2];

ovrInputState    inputState;

 

В этом примере кода мы вызываем ovr_GetTrackingState для того, чтобы получить спрогнозированные положения. Положения контроллера сообщаются в той же системе координат, что и данные о шлеме виртуальной реальности, и могут использоваться для визуализации рук или объектов в 3D-мире. Пример этого приведен в демо-версии Oculus World.

Состояние кнопки

Состояние кнопки ввода сообщается на основе прерываний HID, поступающих на компьютер, и может быть получено вызовом ovr_GetInputState.

В следующем сэмпле кода показано, как в дополнение к позициям рук можно использовать данные входа:

 

double displayMidpointSeconds = ovr_GetPredictedDisplayTime(session, frameIndex);

ovrTrackingState trackState = ovr_GetTrackingState(session, displayMidpointSeconds, ovrTrue);

ovrPosef         handPoses[2];

ovrInputState    inputState;

 

// Grab hand poses useful for rendering hand or controller representation

handPoses[ovrHand_Left]  = trackState.HandPoses[ovrHand_Left].ThePose;

handPoses[ovrHand_Right] = trackState.HandPoses[ovrHand_Right].ThePose;

 

if (OVR_SUCCESS(ovr_GetInputState(session, ovrControllerType_Touch, &inputState)))

{

if (inputState.Buttons & ovrButton_A)

{

// Handle A button being pressed

}

if (inputState.HandTrigger[ovrHand_Left] > 0.5f)

{

// Handle hand grip…

}

}

 

Структура ovrInputState включает следующие поля:

  • TimeInSeconds (double): системное время, когда состояние контроллера в последний раз обновлялось.
  • ControllerType (unsigned int): описывается с помощью ovrControllerType. Указывает, какие типы контроллеров присутствуют; вы можете проверить бит ovrControllerType_LTouch, например, для того, чтобы убедиться, что левый контроллер подключен. Включены опции:
  1. ovrControllerType_None (0x0000)
  2. ovrControllerType_LTouch (0x0001)
  3. ovrControllerType_RTouch (0x0002)
  4. ovrControllerType_Touch (0x0003)
  5. ovrControllerType_Remote (0x0004)
  6. ovrControllerType_XBox (0x0010)
  • Buttons               unsigned (int): состояние кнопки, описанное в ovrButtons. Соответствующий бит устанавливается, если кнопка нажата.
  • Touches (unsigned int): сенсорные значения для кнопок и сенсоров, индексированные функцией ovrTouch. Соответствующий бит устанавливается, если палец пользователя касается кнопки или жестикулирует, что обнаруживается контроллером.
  • IndexTrigger[2] (float): значения триггера левого и правого пальцев (ovrHand_Left и ovrHand_Right) в диапазоне от 0.0 до 1.0f. Значение 1.0 означает, что триггер полностью нажат.
  • HandTrigger[2] (float): значения триггера левой и правой кнопок (ovrHand_Left и ovrHand_Right) в диапазоне от 0.0 до 1.0f. Ручной триггер часто используется для захвата предметов. Значение 1.0 означает, что триггер полностью нажат.
  • Thumbstick[2] (ovrVector2f): значения горизонтальной и вертикальной оси пальца (ovrHand_Left и ovrHand_Right) в диапазоне от -1.0f до 1.0f. API автоматически добавляет мёртвую зону, поэтому разработчикам не нужно её дополнительно обрабатывать.
  • IndexTriggerNoDeadzone[2] (float): значения триггера левого и правого пальцев (ovrHand_Left и ovrHand_Right) в диапазоне от 0.0 до 1.0f без мёртвой зоны. Значение 1.0 означает, что триггер полностью нажат.
  • HandTriggerNoDeadzone[2] (float): значения триггера левой и правой кнопок (ovrHand_Left и ovrHand_Right) в диапазоне от 0,0 до 1,0f без мертвой зоны. Кнопка захвата, выше упомянутая как ручной триггер, часто используется для захвата предметов. Значение 1.0 означает, что кнопка полностью нажата.
  • ThumbstickNoDeadzone[2] (ovrVector2f): горизонтальные и вертикальные значения оси пальца (ovrHand_Left и ovrHand_Right) в диапазоне от -1.0f до 1.0f без мертвой зоны.
  • IndexTriggerRaw[2] (float): необработанные значения левой и правой кнопок захвата (ovrHand_Left и ovrHand_Right) в диапазоне от 0.0 до 1.0f без мертвой зоны или фильтра. Значение 1.0 означает, что триггер полностью нажат.
  • HandTriggerRaw[2] (float): значения триггера левой и правой кнопок (ovrHand_Left и ovrHand_Right) в диапазоне от 0.0 до 1.0f без мертвой зоны или фильтра. Кнопка захвата, выше упомянутая как ручной триггер, часто используется для захвата предметов. Значение 1.0 означает, что кнопка полностью нажата.
  • ThumbstickRaw[2] (ovrVector2f): горизонтальные и вертикальные значения оси пальца (ovrHand_Left и ovrHand_Right) в диапазоне от -1.0f до 1.0f без мертвой зоны или фильтра.

Структура ovrInputState включает текущее состояние кнопок, пальца, триггеров и сенсорных датчиков на контроллере. Вы можете проверить, нажата ли кнопка, проверив одну из констант кнопок, как это было сделано для ovrButton_A в приведённом выше примере. Ниже приведён список бинарных кнопок, доступных на сенсорных контроллерах:

  • ovrButton_A: A кнопка справа на Oculus Touch.
  • ovrButton_B: B кнопка справа на Oculus Touch.
  • ovrButton_RThumb: кнопка джойстика справа на Oculus Touch.
  • ovrButton_X: X кнопка слева на Oculus Touch.
  • ovrButton_Y: Y кнопка слева на Oculus Touch.
  • ovrButton_LThumb: кнопка джойстика слева на Oculus Touch.
  • ovrButton_Enter: кнопка ввода слева на Oculus Touch. Это эквивалентно кнопке «Пуск» на контроллере Xbox.
Состояние кнопки Oculus Touch

В дополнение к кнопкам контроллеры Oculus Touch могут определять, касаются ли пальцы пользователя каких-либо кнопок или находятся в определенных положениях.

Эти состояния сообщаются как биты в полях Oculus Touch и могут быть проверены с помощью одной из следующих констант:

  • ovrTouch_A: пользователь нажал кнопку A на правом контроллере.
  • ovrTouch_B: пользователь нажал кнопку B на правом контроллере.
  • ovrTouch_RThumb: пользователь положил палец на триггер правого контроллера.
  • ovrTouch_RThumbRest: пользователь положил палец на большую часть триггера правого контроллера.
  • ovrTouch_RIndexTrigger: пользователь касается указательным пальцем правого контроллера.
  • ovrTouch_X: пользователь нажал кнопку X на правом контроллере.
  • ovrTouch_Y: пользователь нажал кнопку Y на правом контроллере.
  • ovrTouch_LThumb: пользователь положил палец на триггер левого контроллера.
  • ovrTouch_LThumbRest: пользователь положил палец на большую часть триггера левого контроллера.
  • ovrTouch_LIndexTrigger: пользователь касается указательным пальцем левого контроллера.
  • ovrTouch_RIndexPointing: правый указательный палец пользователя указывает вперёд перед триггера.
  • ovrTouch_RThumbUp: палец пользователя находится справа вверху и внизу от кнопок на контроллере, жест, который можно интерпретировать как правый большой палец вверх.
  • ovrTouch_LIndexPointing: левый указательный палец пользователя указывает вперёд перед триггера.
  • ovrTouch_LThumbUp: палец пользователя находится справа вверху и внизу от кнопок на контроллере, жест, который можно интерпретировать как левый большой палец вверх.
Тактильная обратная связь

Помимо сообщения о состоянии ввода, сенсорные контроллеры Oculus Touch могут обеспечивать тактильную обратную связь посредством вибрации.

SDK поддерживает два типа тактильности: буферизированный и небуферизированный. Буферизованные тактильные ощущения предназначены для быстрого изменения (каждые 3,125 мс) и хорошо работают для тонких эффектов. Небуферизированные тактильные ощущения предназначены для простых эффектов, которые не меняются часто (каждые 33 мс).

Примечание: Буферизованные и небуферизованные функции не должны использоваться вместе, так как это приводит к непредсказуемой тактильной обратной связи.

Буферизированная тактильность

При работе на частоте 320 Гц каждый сэмпл составляет 3,125 миллисекунды. Поскольку эти сэмплы добавляются в буфер, содержащий 256 выборок, буфер может содержать до 800 миллисекунд выборок.

Для того, чтобы проверить состояние буфера, вызовите ovr_GetControllerVibrationState:

 

ovr_GetControllerVibrationState(ovrSession session, ovrControllerType controllerType, ovrHapticsPlaybackState* outState);

 

Для того, чтобы отправить буфер, вызовите ovr_SubmitControllerVibration:

 

ovr_SubmitControllerVibration(ovrSession session, ovrControllerType controllerType, const ovrHapticsBuffer* buffer);

 

В следующем сэмпле кода показано базовое представление тактильных ощущений в качестве части игрового цикла:

 

uint8_t amplitude = (uint8_t)round(handTrigger[t] * 255);

 

result = ovr_GetControllerVibrationState(Session, touchController[t], &state);

if (result != ovrSuccess || state.SamplesQueued >= kLowLatencyBufferSizeInSamples)

{

DefaultChannel.LogWarningF(«%s Haptics skipped. Queue size %d», kTouchStr[t], state.SamplesQueued);

continue;

}

 

for (int32_t i = 0; i < kLowLatencyBufferSizeInSamples; ++i)

samples.push_back(amplitude);

 

if (samples.size() > 0)

{

ovrHapticsBuffer buffer;

buffer.SubmitMode = ovrHapticsBufferSubmit_Enqueue;

buffer.SamplesCount = (uint32_t)samples.size();

buffer.Samples = samples.data();

result = ovr_SubmitControllerVibration(Session, touchController[t], &buffer);

if (result != ovrSuccess)

{

// Something bad happened

DefaultChannel.LogErrorF(«%s: Haptics submit failed %d», kTouchStr[t], result);

}

}

 

Небуферизированная тактильность

Вибрацию можно включить, вызвав ovr_SetControllerVibration:

 

ovr_SetControllerVibration( Hmd, ovrControllerType_LTouch, freq, trigger);

 

Вибрация включается путём указания частоты. Задание 0.0f будет вибрировать на частоте 160 Гц. Задание 1.0f будет вибрировать с частотой 320 Гц.

Эмуляция ввода геймпада с Oculus Touch

Контроллеры Oculus Touch могут частично эмулировать ввод геймпада Microsoft XInput API без каких-либо изменений кода. Однако вы должны учитывать недостающие логические и эргономические эквивалентности между двумя типами контроллеров.

Вы можете выбрать «Touch (как геймпад)» в качестве поддерживаемого контроллера на странице данных вашего продукта в Oculus Store, если эмуляция геймпада позволяет пользователям Oculus Touch полностью наслаждаться вашим приложением. Если ваше приложение не соответствует всем нашим правилам эмуляции, попробуйте добавить отдельную схему управления Oculus Touch вместо зависимости от эмуляции.

Как это работает

Рантайм Oculus имеет режим эмуляции геймпада для сопоставления данных входа Oculus Touch с входом Microsoft XInput API. Это позволяет пользователям использовать свои Oculus Touch в играх, предназначенных для геймпада, без необходимости изменять код.

Рантайм Oculus позволяет использовать Oculus Touch вместо геймпада при выполнении всех следующих условий:

  • Виртуальная реальность подключена.
  • Пользователь запускает приложение с включенной опцией Gamepad Emulation Via Touch («Эмуляция геймпада Oculus Touch»).
  • Oculus Touch подсоединён.
  • Геймпад не подключен. Вы не можете использовать Oculus Touch для эмуляции второго геймпада.

Контроллеры Oculus Touch возвращаются к тому, чтобы быть контроллерами Oculus Touch тогда, когда приложение закрывается или когда пользователь нажимает кнопку Oculus и выходит в окно Home.

Активация и деактивация эмуляции геймпада

Эмуляция геймпада – это атрибут, привязанный к бинарному файлу сборки, и его можно активировать или деактивировать только путём загрузки сборки.

Для того, чтобы установить режим эмуляции геймпада:

  1. Загрузите новую сборку Oculus Rift с панели инструментов разработчика Oculus.
  2. На странице сведений о загрузке выберите соответствующую опцию эмуляции Gamepad Emulation Via Touch («Эмуляция геймпада Oculus Touch»).
  • Off
  • Twin Stick
  • Left D-pad
  • Right D-pad
Руководства по совместимости эмуляторов геймпада

Если на ваш механизм управления геймпада влияет любое из следующих ограничений, ваша игра, вероятно, является плохим вариант для использования эмуляции геймпада. Вместо эмуляции рассмотрите возможность создания новой схемы управления для контроллеров Oculus Touch для того, чтобы предоставить больше пользовательского опыта игроку.

  • Тактильные ощущения

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

  • D-pad

Контроллер Touch не имеет D-pad. Если ваша схема управления использует D-pad и оба стика, ваше приложение может плохо работать с эмуляцией.

Если вашей схеме управления требуется только один джойстик, вы можете использовать наши режимы эмуляции для отображения D-pad на правый или левый Oculus Touch.

  • Кнопка просмотра

Эмуляция Twin stick не имеет кнопки просмотра (⧉). Если эта кнопка имеет решающее значение для вашей схемы управления, ваше приложение может не работать с режимом эмуляции с Twin stick.

Режимы эмуляции D-pad действительно имеют отображение для этой кнопки.

  • Левую кнопку Oculus Touch нельзя использовать с кнопками X или Y

Любое действие, которое сочетает в себе движение левого пальца Oculus Touch с нажатием кнопок X или Y, будет затруднительным или невозможным для пользователей, поскольку эти действия контролируются одним и тем же большим пальцем. Если ваша схема управления требует такого действия, ваше приложение может не работать с эмуляцией.

Тестирование эмуляции геймпада

Вы можете принудительно включить режим эмуляции геймпада в Oculus рантайм для тестирования.

Для принудительного подключения эмулятора геймпада:

  1. Добавьте или измените следующее значение DWORD в реестре Windows:

 

[HKEY_CURRENT_USER\SOFTWARE\Oculus]

 

«GamepadEmulationMode»=dword:mode_enum

 

где mode_enum один из следующих вариантов:

  • 00000002 – режим Twin stick.
  • 00000003 – режим правого D-pad.
  • 00000004 – режим левого D-pad.
  1. Перезапустите службу выполнения Oculus. Имя службы – OVRService, а отображаемое имя – Oculus VR Runtime Service.

Чтобы вернуться к обычному управлению и работе, удалите значение GamepadEmulationMode из реестра Windows и затем перезапустите OVRService.

Режим эмуляции геймпада Twin Stick

Карты двух джойстиков геймпада на пальцах Oculus Touch. Кнопка D-pad и кнопка просмотра (⧉) не отображаются.

Эквиваленты кнопок геймпада у Oculus Touch:

  • Вибрация – нет.
  • D-pad – нет.
  • Левый стик – левый палец.
  • Левый бампер – левый зажим.
  • Левый триггер – левый триггер.
  • Кнопка просмотра (⧉) – нет.
  • Кнопка Xbox- кнопка Oculus.
  • Кнопка меню (☰) – кнопка меню (☰).
  • Правый стик – правый палец.
  • Правый бампер – правый зажим.
  • Правый триггер – Правый триггер.
  • Кнопка A – кнопка A.
  • Кнопка B – кнопка B.
  • Кнопка X – кнопка X
  • Кнопка Y – кнопка Y.
Режим эмуляции геймпада Left D-Pad

Такой же, как режим эмуляции геймпада Twin Stick, за исключением следующего:

Эквиваленты кнопок геймпада у Oculus Touch:

  • D-pad – левый палец.
  • Левый стик – нет.
  • Кнопка просмотра (⧉) – удержание левого пальца.
Режим эмуляции геймпада Right D-Pad

Такой же, как режим эмуляции геймпада Twin Stick, за исключением следующего:

Эквиваленты кнопок геймпада у Oculus Touch:

  • D-pad – правый палец.
  • Правый стик – нет.
  • Кнопка просмотра (⧉) – удержание правого пальца.

 

Примечание: Данный материал представлен для ознакомления, при перепечатывании ссылка на оригинал обязательна. Если вы хотите принять участие в помощи проекту, пишите на editor@vrgeek.ru

Если вы разработчик и вы хотите продолжить свою карьеру в лучших компаниях России, пишите на editor@vrgeek.ru с пометкой «Работа мечты», и мы поможем вам с этим.

Чтобы оставаться в курсе новостей о виртуальной реальности, подписывайтесь на наш Telegram!