Впервые на русском: Документация Oculus для разработчиков. Руководство ПК SDK для разработчика. Управление связью с виртуальной реальностью

Продолжаем публикацию эксклюзивной информации для разработчиков от Oculus. Новый раздел посвящён управлению связью с виртуальной реальностью.

  1. Документация Oculus для разработчиков:
    1. Введение в рекомендации
    2. Бинокулярное зрение, стереоскопическая визуализация и индикаторы глубины
    3. Поле зрения и масштаб
    4. Методы рендеринга
    5. Движение
    6. Отслеживание
    7. «Болезнь симуляции»
    8. Пользовательский интерфейс
    9. Пользовательский ввод и навигация
    10. Заключение
    11. Введение в SDK для ПК
    12. Руководство разработчика
    13. Руководство по началу работы с ПК SDK
    14. Руководство ПК SDK для разработчика. Интеграция LibOVR
    15. Инициализация и перечень сенсоров
    16. Рендеринг в Oculus Rift
    17. Расширенная настройка рендеринга
    18. Управление связью с виртуальной реальностью
    19. Система безопасности Oculus Guardian
    20. Аудио Oculus Rift
    21. Контроллеры Oculus Touch
    22. Дополнительная информация об Oculus Touch
    23. Примеры использования SDK и геймпада
    24. Оптимизация вашего приложения
    25. Подключение контроллеров Oculus Touch
    26. Асинхронный SpaceWarp
    27. Дополнительная информация о подключении контроллеров Oculus Touch
    28. Справочная информация

Чтобы оставаться в курсе новостей о виртуальной реальности, подписывайтесь на наш Telegram!

Когда вы отправляете своё приложение в Oculus, вы предоставляете приложение и метаданные, которые необходимы для его внесения в Oculus Store и запуска его из Oculus Home.

После запуска из Oculus Home вам необходимо написать цикл опроса состояния сеанса. ovr_GetSessionStatus возвращает структуру со следующими логическими значениями:

  • ShouldQuit: True, если приложение должно инициировать завершение работы.
  • HmdPresent: True, если шлем виртуальной реальности подключён.
  • DisplayLost: True, если шлем виртуальной реальности был отключеё, или драйвер дисплея был отключен вручную, или обнаружен TDR.
  • HmdMounted: True, если шлем виртуальной реальности находится на голове пользователя.
  • IsVisible: True, если игра или приложение имеет запущена в виртуальной реальности и видна в шлеме виртуальной реальности.
  • ShouldRecenter: True, если приложение должно вызвать ovr_RecenterTrackingOrigin. Это срабатывает, когда пользователь инициирует повторную попытку через Universal Menu «Универсальное меню».
Управление при завершении работы пользователя

Если ShouldQuit истинно, сохраните состояние приложения и выключите или выключите без сохранения состояния приложения. Пользователь автоматически вернется в Oculus Home.

В зависимости от типа приложения вы можете предложить пользователю начать с того места, где он остановился в следующий раз, когда приложение открыто (например, многоуровневая игра), или вы можете просто начать сначала (в случае с пассивным видео). Если это многопользовательская игра, вы можете выйти из игры локально, не прекращая игру.

Управление при повторном запросе пользователя

Если значение параметра ShouldRecenter истинно, приложение должно вызвать ovr_RecenterTrackingOrigin или ovr_SpecifyTrackingOriginи и быть готовым к предстоящему позиционному отслеживанию на основе другого источника.

У некоторых приложений может появиться причина проигнорировать запрос или выполнить его через внутренний механизм, отличный от ovr_RecenterTrackingOrigin. В таких случаях приложение может вызвать ovr_ClearShouldRecenterFlag для того, чтобы инициировать очистку запроса рецентра.

Управление неподключённым шлемом виртуальной реальности

Если DisplayLost истинно:

  1. Приостановите приложение, включая аудио.
  2. Выведите уведомление на монитор, в котором говорится, что шлем виртуальной реальности отключён.
  3. Уничтожьте любые те TextureSwapChains или зеркальные текстуры.
  4. Вызовите ovrDestroy.
  5. Инициируйте вызов ovrSessionStatus::HmdPresent до истинного значения.
  6. Вызовите ovrCreate для воссоздания сеанса.
  7. Создайте заново TextureSwapChains или зеркальные текстуры.
  8. Продолжите работу приложения.

Если ovrDetect не возвращается с истинным значением через определенное время, действуйте так, как если бы ShouldQuit возвратил его истинным. Если пользователь не предпринимает никаких действий после определенного периода времени, выберите действие по умолчанию (сохранить сеанс или закрыть без сохранения) и закройте приложение.

Примечание: Для многопользовательских игр вам может потребоваться один и тот же процесс без приостановки игры.

Управление недоступной гарнитурой

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

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

Примечание: Для многопользовательских игр вы можете продолжить игру без паузы.

Управление потерей связи с Windows

Когда ваше приложение теряет связь с Windows, Oculus Remote, контроллер Xbox и контроллеры Oculus Touch будут продолжать работать в обычном режиме. Однако приложение потеряет контроль над мышью и клавиатурой.

Если ваше приложение теряет связь с Windows и сохраняет связь с виртуальной реальностью (IsVisible), продолжайте обработку вводимой информации и позволяйте приложению работать в обычном режиме. Если клавиатура или мышь необходимы для продолжения, попросите пользователя снять гарнитуру и использовать Alt-Tab  для восстановления связь с Windows.

Сэмпл кода
  
bool shouldQuit = false;

void RunApplication()
{
    ovrResult result = ovr_Initialize();

    if (OVR_SUCCESS(result))
    {
        ovrSession session;
        ovrGraphicsLuid luid;
        result = ovr_Create(&session, &luid);

        if (OVR_SUCCESS(result))
        {
            ovrSessionStatus ss;

            <create graphics device with luid>
            <create render target via ovr_CreateTextureSwapChain>
       
            while (!shouldQuit)
            {
                <get next frame pose, e.g. via ovr_GetEyePoses>
                <render frame>

                result = ovr_SubmitFrame(...);

                if (result == ovrSuccess_NotVisible)
                {
                    <turn off audio output>
                    do { // Wait until we regain visibility or should quit
                        <sleep>
                        result = ovr_GetSessionStatus(session, &ss);
                        if (ss.ShouldQuit)
                            shouldQuit = true;
                    } while (OVR_SUCCESS(result) && !ss.IsVisible && !shouldQuit);
                    <possibly re-enable audio>
                }
                else if (result == ovrError_DisplayLost)
                {
                    // We can either immediately quit or do the following:
                    <destroy render target and graphics device>
                    ovr_Destroy(session);

                    do { // Spin while trying to recreate session.
                        result = ovr_Create(&session, &luid);
                    } while (OVR_FAILURE(result) && !shouldQuit);

                    if (OVR_SUCCESS(result))
                    {
                        <recreate graphics device with luid>
                        <recreate render target via ovr_CreateTextureSwapChain>
                    }
                }
                else if (OVR_FAILURE(result))
                {
                    shouldQuit = true;
                }

                ovr_GetSessionStatus(session, &ss);
                if (ss.ShouldQuit)
                    shouldQuit = true;
                if (ss.ShouldRecenter)
                {
                    ovr_RecenterTrackingOrigin(session); // or ovr_ClearShouldRecenterFlag(session) to ignore the request.
                    <do anything else needed to handle this>
                }
            }

            <destroy render target via ovr_DestroyTextureSwapChain>
            <destroy graphics device>

            ovr_Destroy(session);
        }

        ovr_Shutdown();
    }
}

Примечание: Данный материал представлен для ознакомления, при перепечатывании ссылка на оригинал обязательна. Если вы хотите принять участие в помощи проекту, пишите на editor@vrgeek.ru

Если вы разработчик и вы хотите продолжить свою карьеру в лучших компаниях России, пишите на editor@vrgeek.ru с пометкой «Работа мечты», и мы поможем вам с этим.