Jump to content

[SOLVED] Проблема с определением VR-устройств


photo

Recommended Posts

Posted

Здравствуйте! Передо мной стоит задача определения среды выполнения (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.

Posted

Здравствуйте,

VR api не подразумевают делать какую-то логику под конкретный шлем, по этому производители драйверов могут выдавать любую им удобную информацию, так что на нее не стоит опираться. В противном случае вы получите приложение которое не будет способно работать с новыми шлемами.
В случае с OpenXR это поле (Name) частично упразднено и в будущем полностью уйдет.

Если вам нужна специфичная логика под конкретный шлем, например управление - то лучше использовать маски кнопок и проверять поддерживаемые оси контроллеров через InputVRController::getSupportedButtonsMask() и InputVRController::getAxisByType() соответственно.
Чуть больше информации в заголовке статьи - InputVRController.

Надеюсь поможет.

  • Like 1
Posted
15 hours ago, sweetluna said:

Здравствуйте,

VR api не подразумевают делать какую-то логику под конкретный шлем, по этому производители драйверов могут выдавать любую им удобную информацию, так что на нее не стоит опираться. В противном случае вы получите приложение которое не будет способно работать с новыми шлемами.
В случае с OpenXR это поле (Name) частично упразднено и в будущем полностью уйдет.

Если вам нужна специфичная логика под конкретный шлем, например управление - то лучше использовать маски кнопок и проверять поддерживаемые оси контроллеров через InputVRController::getSupportedButtonsMask() и InputVRController::getAxisByType() соответственно.
Чуть больше информации в заголовке статьи - InputVRController.

Надеюсь поможет.

Добрый день! Я поняла, благодарю!

Однако я не совсем понимаю как связать оси с определенной кнопкой на разных устройствах (в режиме openXR)? 
Я могу определить поддерживаемые оси, получить их тип и индекс, но у кнопок на разных контроллерах отличаются типы осей.

Posted

Здравствуйте!

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

Мы делаем примерно так:

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, и т.д.

Posted
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, и т.д.

Поняла. Большое спасибо!!

  • Like 1
  • arizmenda changed the title to [SOLVED] Проблема с определением VR-устройств
×
×
  • Create New...