Проблемы с пониманием API драйвера OpenVR

#c #driver #openvr

#c #драйвер #openvr

Вопрос:

Моя конечная цель — создать облегченный клон VRidge для понимания API OpenVR, но я изо всех сил пытаюсь понять, как заставить мой код что-то отображать. В качестве отправной точки, вместо моего телефона, я хочу создать окно как HMD (SFML, SDL, вы называете это …) и иметь SteamVR, отображающий в нем представление виртуальной реальности.

Я понимаю, что реализующий объект IServerTrackedDeviceProvider является обработчиком устройств моего драйвера, ITrackedDeviceServerDriver является интерфейсом самого устройства, и я подозреваю, что мое устройство «HMD» должно будет реализовать IVRDisplayComponent .

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

Ответ №1:

Вы почти правы.

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

Классы, наследуемые vr::ITrackedDeviceServerDriver после того, как они были зарегистрированы родительским устройством, считаются отслеживаемым устройством, тип устройства устанавливается родительским устройством в регистре, также в случае GetComponent() , если метод устройства HMD должен возвращать компоненты отображения по запросу, для других устройств он может просто вернуть NULL

GetComponent() получает строку c с именем и версией компонента, например "IVRDisplayComponent_002" , хранящуюся в vr::IVRDisplayComponent_Version , и если на устройстве есть компонент с парой совпадающих имен версий, вам нужно вернуть указатель на него, если совпадение не найдено, верните NULL

Также о компонентах: в примере драйвера, который предоставляет Valve, он выполнен очень ленивым и плохим способом, НЕ НАСЛЕДУЙТЕ КОМПОНЕНТЫ ДЛЯ ВАШИХ КЛАССОВ УСТРОЙСТВ

Разделите ваши компоненты на отдельные объекты, которые вы инициализируете на своем устройстве и возвращаете их GetComponent() соответствующим образом

Теперь единственное, что осталось для правильной идентификации и использования ваших устройств SteamVR, — это их регистрация, но есть одна загвоздка: вам нужно указать тип устройства при его регистрации, передав одно из значений из vr::ETrackedDeviceClass enum (это должно быть достаточно понятно, если вы посмотрите на enum)

Конечно, это еще не все, что нужно для драйвера openvr, чтобы все это работало, и чтобы SteamVR даже признал существование вашего драйвера, вам нужно реализовать HmdDriverFactory() функцию, аналогично, за GetComponent() исключением того, что вы сравниваете входную строку c с парой версий имени поставщика, а в случае родительского устройства — с его vr::IServerTrackedDeviceProvider_Version , есливы получаете совпадение, возвращающее указатель на экземпляр вашего родительского устройства или любого другого поставщика, который вы внедрили

Несколько замечаний:

  • Для HMD требуется хотя бы один компонент отображения
  • Устройство HMD очень чувствительно к тому, как вы отправляете ему позы (не спрашивайте, почему, это просто так)
  • Будьте готовы к отсутствию документации, лучшие документы, которые вы получите, — это комментарии к коду openvr_driver.h , ValveSoftware/openvr отслеживание проблем и другие люди, работающие с драйверами openvr (хотя их всего несколько …)

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