iuliia Posted November 5, 2025 Posted November 5, 2025 Здравствуйте! Передо мной стоит задача определения среды выполнения (openXR, openVR), а также устройства ввода (на данный момент Oculus Quest 3, Pico 4) при запуске проекта. В данный момент среда выполнения определяется с помощью следующего кода: VR.ApiType Для определения названия устройства: Input.GetVRDevice(0).Name Первая проблема заключается в том, что устройство Pico 4, запущенное в openVR определяется как Oculus Quest 2. Как я могу получить правильное название устройств? Вторая проблема с openXR. При выполнении кода выше (вывод названия устройства) возвращается пустая строка. Вопрос. Как мне правильно определить среду выполнения и точное название устройства ввода при запуске через openVR и openXR? P.S. запуск проекта в openVR и openXR происходит через steamVR.
sweetluna Posted November 5, 2025 Posted November 5, 2025 Здравствуйте, VR api не подразумевают делать какую-то логику под конкретный шлем, по этому производители драйверов могут выдавать любую им удобную информацию, так что на нее не стоит опираться. В противном случае вы получите приложение которое не будет способно работать с новыми шлемами. В случае с OpenXR это поле (Name) частично упразднено и в будущем полностью уйдет. Если вам нужна специфичная логика под конкретный шлем, например управление - то лучше использовать маски кнопок и проверять поддерживаемые оси контроллеров через InputVRController::getSupportedButtonsMask() и InputVRController::getAxisByType() соответственно. Чуть больше информации в заголовке статьи - InputVRController. Надеюсь поможет. 1 May RenderDoc/Nsight Graphics/Intel GPA bless you
iuliia Posted November 6, 2025 Author Posted November 6, 2025 15 hours ago, sweetluna said: Здравствуйте, VR api не подразумевают делать какую-то логику под конкретный шлем, по этому производители драйверов могут выдавать любую им удобную информацию, так что на нее не стоит опираться. В противном случае вы получите приложение которое не будет способно работать с новыми шлемами. В случае с OpenXR это поле (Name) частично упразднено и в будущем полностью уйдет. Если вам нужна специфичная логика под конкретный шлем, например управление - то лучше использовать маски кнопок и проверять поддерживаемые оси контроллеров через InputVRController::getSupportedButtonsMask() и InputVRController::getAxisByType() соответственно. Чуть больше информации в заголовке статьи - InputVRController. Надеюсь поможет. Добрый день! Я поняла, благодарю! Однако я не совсем понимаю как связать оси с определенной кнопкой на разных устройствах (в режиме openXR)? Я могу определить поддерживаемые оси, получить их тип и индекс, но у кнопок на разных контроллерах отличаются типы осей.
arizmenda Posted November 7, 2025 Posted November 7, 2025 Здравствуйте! Есть смысл строить логику не от названия устройства, а от того, какую функцию вы хотите получить. То есть мы не пытаемся сопоставить кнопки между разными шлемами, а просто ищем подходящий тип оси, который выполняет нужную роль. Мы делаем примерно так: switch (button) { case Buttons::TELEPORT: { int axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_TRACKPAD_X); if (axis_index == -1) axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_JOYSTICK_X); if (axis_index != -1) return controller->isButtonPressed( static_cast<Input::VR_BUTTON>(Input::VR_BUTTON_AXIS_0 + axis_index)); } case Buttons::USE: { int axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_TRIGGER_VALUE); if (axis_index == -1) axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_TRIGGER_FORCE); if (axis_index != -1) return controller->getAxis(axis_index) > 0.5f; } case Buttons::GRAB: return controller->isButtonPressed(Input::VR_BUTTON_GRIP); case Buttons::MENU: return controller->isButtonPressed(Input::VR_BUTTON_APPLICATION) || controller->isButtonPressed(Input::VR_BUTTON_Y); } Смысл в том, что разные контроллеры могут предоставлять разные оси, но их назначение остается одинаковым. Поэтому ориентируемся не на модель устройства, а на тип оси - и тогда все будет работать и на Quest, и на Pico, и т.д.
iuliia Posted November 11, 2025 Author Posted November 11, 2025 On 11/7/2025 at 12:43 PM, arizmenda said: Здравствуйте! Есть смысл строить логику не от названия устройства, а от того, какую функцию вы хотите получить. То есть мы не пытаемся сопоставить кнопки между разными шлемами, а просто ищем подходящий тип оси, который выполняет нужную роль. Мы делаем примерно так: switch (button) { case Buttons::TELEPORT: { int axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_TRACKPAD_X); if (axis_index == -1) axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_JOYSTICK_X); if (axis_index != -1) return controller->isButtonPressed( static_cast<Input::VR_BUTTON>(Input::VR_BUTTON_AXIS_0 + axis_index)); } case Buttons::USE: { int axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_TRIGGER_VALUE); if (axis_index == -1) axis_index = controller->findAxisByType(InputVRController::AXIS_TYPE_TRIGGER_FORCE); if (axis_index != -1) return controller->getAxis(axis_index) > 0.5f; } case Buttons::GRAB: return controller->isButtonPressed(Input::VR_BUTTON_GRIP); case Buttons::MENU: return controller->isButtonPressed(Input::VR_BUTTON_APPLICATION) || controller->isButtonPressed(Input::VR_BUTTON_Y); } Смысл в том, что разные контроллеры могут предоставлять разные оси, но их назначение остается одинаковым. Поэтому ориентируемся не на модель устройства, а на тип оси - и тогда все будет работать и на Quest, и на Pico, и т.д. Поняла. Большое спасибо!! 1
Recommended Posts