#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, поэтому вы всегда можете запросить более подробную информацию в комментариях