Advanced: Тема повышенной сложности или важная.
Удивительно, что на нашем форуме еще нет этой темы.
VR-технологии уже достаточно распространены, чтобы начать вести разработку VR-игр и прочих VR-приложений. Кто уже? На чём ведёте разработку, какие успехи?
Я тут попытался скомпилировать Hello World для SteamVR (API OpenVR), упёрся в затык, вызов (IVRSystem* m_pHMD)->GetProjectionMatrix() вызывает Access Violation (0xC0000005). И GetEyeToHeadTransform() тоже. Временно подставил вместо этих вызовов затычки (обычную матрицу перспективы и единичную матрицу соответственно), заработало. Но как искать решение проблемы не представляю, ошибка внутри стимовской DLL-шки же. Пробовал компилировать и под 64, и под 32 бита. Гарнитура Oculus Quest 2 через Oculus Link. Позже куплю современный 5 ГГц роутер буду пробовать через VirtualDesktop, но не уверен, что это что-то изменит. Есть идеи?
romanshuvalov
> GetProjectionMatrix() вызывает Access Violation (0xC0000005)
открыть исходники openVR и посмотреть что в этих методах может быть недоступным.
cyberpunk2077
> открыть исходники openVR и посмотреть что в этих методах может быть недоступным.
Открыты только заголовки, реализации нет: https://github.com/ValveSoftware/openvr/search?q=GetProjectionMatrix
cyberpunk2077
> открыть исходники openVR и посмотреть что в этих методах может быть
> недоступным.
ничего там нет, это интерфейс не более, вся реализация в библиотеке исходников которой нет.
romanshuvalov
ты либы собирал сам или скачал с гита те что есть?
cyberpunk2077
> открыть исходники openVR
Он не на столько open ))
romanshuvalov
Это чистая виртуальная функция:
virtual HmdMatrix44_t GetProjectionMatrix(EVREye eEye, float fNearZ, float fFarZ ) = 0;
Aroch
Ты же сам написал что исходников реализации нет, поэтому я скачал с гита собранные либы, потому что больше их взять неоткуда. Пробовал ради эксперимента подменить ДЛЛшку на ту, которая лежит в steamapps/common/SteamVR, она там вроде другая. Не помогло.
cyberpunk2077
> Это чистая виртуальная функция:
Они там все такие. В заголовках только интерфейс с виртуальными функциями. А при инициализации создаётся объект "неизвестного класса", наследованный от этого интерфейса. Адрес метода я кстати проверял - ненулевой. И все другие методы работают, возвращают корректные значения.
romanshuvalov
> Ты же сам написал что исходников реализации нет, поэтому я скачал с гита
> собранные либы, потому что больше их взять неоткуда. Пробовал ради эксперимента
> подменить ДЛЛшку на ту, которая лежит в steamapps/common/SteamVR, она там вроде
> другая. Не помогло.
dll, но dll и lib не одно и тоже, и судя по тому что у них для винды именно .lib то собирали они студийным компилятором, а у тебя mingw, собери и получи на выходе .a который и подключишь линкеру.
Aroch
> собирали они студийным компилятором, а у тебя mingw, собери и получи на выходе .a
Как собрать, если нет исходников? Студия умеет собирать .a для последующего использования в mingw? Или я не так тебя понял.
upd.: Нарыл https://stackoverflow.com/questions/11793370/how-can-i-convert-a-… -to-a-mingw-a - буду пробовать, хорошая идея (нижний ответ про dlltool)
romanshuvalov
> Как собрать, если нет исходников?
есть там исходники, тебе надо собрать .a для динамического связывания и всё. А саму dll возьмешь с папки bin.
https://github.com/ValveSoftware/openvr/blob/master/src/README
Aroch
> а у тебя mingw
хе-хе
romanshuvalov
использовать студийные lib, если пользуешься mingw - это безнадежное дело.
Для OpenVR есть С-интерфейс, так что можно динамически грузить dll без всяких либ, это удобно если у пользователя не установлен SteamVR и вообще VR опционально идет.
А разве mingw не поддерживает *.lib? Я когда-то подключал какую-то M$ библиотеку к mingw проекту и все работало (возможно, только, что я тупо переименовал ее в *.a, уже не помню).
Ок, я понял, линковать надо через .a. Но угадайте что?
Я совершенно случайно обнаружил в пакетах mingw пакет openvr, датированный, правда, 2019 годом, но правильно собранный и с линковочным .dll.a в комплекте. И с ним ошибка точно та же.
Вообще судя по бэктрейсу ошибка вообще происходит не у меня:
> С-интерфейс, так что можно динамически грузить dll без всяких ли
не спасёт.