В итоге мы пришли к выводу, что наши ресурсы позволяют выполнить оба представленных выше варианта с возможностью оператора выбирать между ними в соответствии с рекомендациями врача.
2. Разработка программы
2.1 Уровень с морем. Локация
Мы были ограничены исключительно бесплатными 3D-моделями расширения .fbx, которые можно было найти в Unity Asset Store и на просторах интернета, что сделало невозможным внедрение в приложение фотореалистичной графики. Тем не менее, мы постарались подобрать такие текстуры и модели, чтобы у пользователя не пропадало ощущение погружения.
Основные сложности возникли непосредственно с текстурами моря - оно должно было занимать огромную территорию, поскольку играло роль «пола» на протяжении всего уровня. Однако, найти текстуру подходящих размеров в интернете оказалось невозможным, по причине того, что фотоаппарата, способного запечатлеть поверхности такого размера, не существует, а изображение, созданное с помощью компьютерной графики, было бы недостаточно реалистичным.
Перед нами встало два возможных решения проблемы - растянуть существующее изображение по всей поверхности моря или создать множество объектов («плиток») с отдельными текстурами и объединить их в один. Первый вариант оказался нерелевантным, поскольку растянутая текстура выглядела совершенно нереалистично и не создавала ощущения моря. В то же время, вариант со множеством объектов, кроме отсутствия этой проблемы, так же позволял упростить создание ощущения морской качки и движения волн (об этом будет подробнее рассказано в пункте «реализация». Таким образом, мы остановились на втором варианте, и именно он был воплощён в итоговом приложении.
Мы не могли оставить только чистое море, не добавив при этом каких-либо декораций, и этому мешали две вещи. Первая - проблема с погружением. Пустой мир, в котором есть только море, небо и лодка игрока просто-напросто скучен, что может отбить у потенциального пациента желание перемещаться по нему, а, значит, снизить погружение и эффект от терапии. Вторая - ничем не ограниченный мир накладывал бы на нас обязанность следить за тем, чтобы водная поверхность тоже была бесконечной, что вызывало некоторые трудности. Поэтому нами было создано кольцо из гор, ограничивающее перемещение игрока по миру, а, также, несколько скал и выступов по всему уровню, включая как небольшие рифы, так и каменную арку, под которой пациент может проплыть на своей лодке.
Когда было принято решение о создание кольца из гор и серии каменных декоративных препятствий, перед нами встал о вопрос о выборе 3D-моделей для них. Проблема заключалась не только в ограниченном наборе, из которого мы имели возможность выбирать модели для скал, но и в том, что они должны были соответствовать определённым признакам.
Во-первых, нам не подходили модели низкого качества, поскольку их присутствие на карте негативно влияло на погружение, не позволяя игроку в полной мере ощутить реальность происходящего.
Во-вторых, моделей должно было быть определённое количество (как минимум пять), чтобы была возможность создать ощущение реального горного массива, а не кольца из множества одинаковых камней.
В-третьих, стилистика и цветовая палитра моделей должны были совпадать.
Исходя из этих пунктов, мы отобрали несколько моделей, лучше прочих, подходящий для нашей задачи. Их список и изображения представлены ниже. Все модели и наборы моделей названы кодовыми именами, по которым в списке источников можно найти ссылки на них.
Рисунок 1 - Модели скал
1) Arch. Модель каменной арки. Она рассматривалась на добавление в сцену, но не попала в финальную версию, поскольку для того, чтобы дать лодке возможность проплыть под аркой, арку пришлось бы очень сильно увеличить, из-за чего она занимала бы слишком много места и мешала полноценному изучению сцены. При этом, как обычный декоративный элемент, арка не гармонировала с прочими моделями, и от неё пришлось отказаться.
2) Stone. Качественная модель каменного уступа. Она была добавлена в сцену, однако её текстура, для соответствия, была заменена на ту, что используется в Rock_Pack2.
3) Rock_Pack1. Набор скал и камней, включающий одну арку. В финальную версию не попал, поскольку модели в этом наборе оказались недостаточно качественными и реалистичными.
4) Rock_Pack2. Набор скал и камней, также включающий одну арку. Именно из скал этого набора (с добавлением Stone) был создан итоговый горный массив. Кроме того, арка из этого набора стала той каменной аркой, под которой может проплыть игрок на своей лодке.
Рисунок 2 - Сцена с морем, вид сверху.
Рисунок 3 - Морской пейзаж, вид из лодки. Рисунок 4 - Каменная арка.
По изначальной задумке оператор должен был иметь возможность выбирать между управлением лодкой через заданные им параметры (скорость движения, крутизна поворота) и самостоятельным управлением игрока с помощью вёсел. При этом, в первом случае пациент находился бы на борту моторного катера, а во втором - управлял бы деревянной лодкой с помощью вёсел. В итоговой версии оператор действительно имеет такую возможность, однако, в связи с ограничениями по возможным моделям, нам не удалось найти подходящую модель катера, поэтому в обоих случаях игрок находится на борту вёсельной лодки.
В качестве итоговой модели вёсельной лодки мы рассматривали следующие варианты. Так же, как и в случае со скалами, все модели и наборы моделей названы кодовыми именами, по которым в списке источников можно найти ссылки на них.
Рисунок 5 - Модели лодок и вёсел
1) Boat1. Потрёпанная, старая лодка с реалистичной текстурой. Эта лодка подходила для нас идеально, и именно она попала в итоговую сцену.
2) Boat2. Очень хорошая модель с качественной текстурой, однако, не подошла для нашего приложения - из-за низких бортов не удавалось сделать достаточно сильную качку - лодка просто начинала погружаться под воду, что шло в разрез с реальной физикой и разрушало погружение.
3) BoatWithOars. Эта модель рассматривалась нами в первую очередь, поскольку сразу содержала в себе и лодку, и вёсла. Однако, проблемой стала отсутствие текстур на модели лодки. У нас не было возможности создать свою текстуру, а текстуры с других моделей на этой смотрелись нереалистично. Однако, модели вёсел оказались очень качественными, и текстура с сидений в Boat1 отлично подошла для них, поэтому именно эти вёсла были использованы в итоге.
4) Oar. Модель весла, которая рассматривалась нами как вариант на добавление в сцену. Однако, вёсла в модели BoatWithOars оказались качественнее.
5) StrangeBoat. Необычная модель, которая рассматривалась в качестве альтернативы выбранной нами лодке. Однако, эта модель не вписывалась в окружение, и потому от неё отказались.
6) Canoe. Ещё одна альтернативная модель лодки. Модель Boat1 оказалась более качественной, поэтому итоговый выбор пал на неё.
2.2 Уровень с морем. Скрипты
При запуске уровня первым делом активируется скрипт движения воды. Это было создано для повышения реализма локации и улучшения эффекта погружения пользователя в окружающий мир. Море движется по карте вперёд и назад, создавая ощущение волн. При этом, движение вперёд идёт несколько дальше движения назад, что позволяет усилить ощущение, что перед нами не статичная анимация, а настоящее море. При этом, возникает опасность того, что море может, рано или поздно, оказаться за пределами карты, ограниченной горным кольцом. Эту проблему решает следующий скрипт. игровой приложение виртуальный интерфейс
Скрипт, ограничивающий перемещение воды, привязан к каждой конкретной «плитке» моря (выше говорилось о том, что море является не цельным объектом, а набором «плиток»). Когда эта «плитка» оказывается за пределами видимости (скрывшись за горным кольцом), скрипт активируется и перемещает её обратно в начало карты, также за пределы горного кольца, из-под которого она появится через какое-то время. Таким образом, море всё время движется вперёд, но никогда не исчезает.
Следующим, крайне важным скриптом, является тот, что отвечает за движение вёсел. Каждый раз, когда лодка поворачивается в одну из сторон, активируется скрипт, привязанный к соответствующему веслу. Это весло совершает круговое движение, погружаясь в воду и появляясь из неё, что соответствует реальным движениям гребца. Скрипт также активируется для обоих вёсел, когда происходит движение вперёд.
Отвечающий за движение скрипт имеет три разных режима работы - 'manual', 'operator' и 'player'. Режим `manual' означает непосредственный контроль движений лодки с помощью клавиш клавиатуры и использовался исключительно в тестовых целях (в финальной версии программы вся информация о нём скрыта, но он всё ещё доступен). Режим `operator' позволяет оператору задать скорость движения лодки и углы её поворотов. Пользователь при этом может только поворачивать голову. Режим `player' даёт пользователю возможность управлять вёслами с помощью джойстиков.
Вне зависимости от выбранного режима, в скрипте, отвечающем за движение, присутствуют четыре глобальные переменные. Переменная «control_type» отвечает как раз за режим работы, как указано в предыдущем абзаце. Переменная «speed» отвечает за скорость лодки. На неё умножается расстояние, проходимое лодкой при использовании игроков двух джойстиков сразу или угол поворота лодки при использовании только одного. Переменная «power_water» отвечает за силу качки. На неё умножается угол, на который отклоняется лодка при качке. Переменная «speed_water» отвечает за скорость ветра. На неё умножается скорость, с которой происходит качка. Значения для всех четырёх переменных задаются оператором в меню непосредственно перед запуском сцены.
3. Эксплуатационная документация
3.1 Меню оператора
Рисунок 6 - Меню оператора.
Меню оператора запускается при запуске самого приложения. У игрока нет к нему доступа. Оператор в этом меню может настраивать все необходимые параметры соответственно рекомендациям врача, а, также, запустить непосредственно саму сцену. Управление меню осуществляется с помощью компьютерной мыши.
Кнопка меню оператора «Запуск»
Рисунок 7 - Кнопка «Запуск».
При нажатии на эту кнопку запускается сцена «Море» с заданными оператором параметрами. Оператор имеет возможность в любой момент снова вызвать меню по нажатию клавиши «esc» на клавиатуре.
Элемент меню оператора «Скорость качки»
Рисунок 8- Элемент «Скорость качки».
Нажимая на кнопки «-» и «+» оператор может, соответственно, уменьшать или увеличивать скорость качки на 1 м/с. Текущее значение скорости качки указано между кнопками. Минимальное возможное значение 0 м/c, на максимальное значение ограничений нет.
Элемент меню оператора «Скорость лодки»
Рисунок 9 - Элемент «Скорость лодки».
Нажимая на кнопки «-» и «+» оператор может, соответственно, уменьшать или увеличивать скорость лодки на 1 км/ч. Текущее значение скорости лодки указано между кнопками. Минимальное возможное значение 0 км/ч, на максимальное значение ограничений нет.
Элемент меню оператора «Сила качки»
Рисунок 10 - Элемент «Сила качки».
Нажимая на кнопки «-» и «+» оператор может, соответственно, уменьшать или увеличивать силу качки на 1 условную единицу. Текущее значение силы качки указано между кнопками. Минимальное возможное значение 0, максимальное возможное значение 20.
Кнопка меню оператора «Режим управления»
Рисунок 11 - Кнопка «Режим управления».
Нажатие на эту кнопку меняет текущий режим управления. Всего в приложении доступно два режима управления - «Игрок» и «Оператор» (режим физического управления с помощью клавиатуры доступен только при непосредственном редактировании кода). При переключении режима меняется надпись на кнопке.
3.2 Интерфейс игрока
Как таковой, интерфейс игрока в приложении отсутствует. В режиме управления оператором игрок может только двигать головой, обозревая путь, по которому движется лодка.
В режиме же самостоятельного управления он всё также может двигать головой, но, также, ещё и перемещаться на лодке, управляя вёслами с помощью кнопок на джойстиках. Нажатие кнопки на одном джойстике осуществляет движение соответствующим веслом и поворот в соответствующую сторону. Нажатие же одновременно на обе кнопки выполняет движение обоими вёслами и движение вперёд.
Кроме того, в этом режиме оператор может в любой момент нажать клавишу «esc» на клавиатуре, чтобы открыть меню оператора.
Заключение
Приложение полностью завершено и готово к работе. Все необходимые функции были реализованы. Графика находится на достаточно реалистичном уровне, чтобы создать эффект погружения. Этому также способствует движение волн и наличие скал.
Финальное исследование показало, что технология Виртуальной Реальности представляет хорошие результаты в терапии функционального головокружения. В дальнейшем планируется развитие и совершенствование приложения, добавление новых функций и сцен, в зависимости от рекомендаций и запросов практикующих врачей.
Кроме того, перспективным является развитие приложения «в ширь», то есть расширение возможностей для лечения разнообразных заболеваний, не ограниченных только функциональным головокружением, а, также, терапии после пережитой операции.
Список литературы
1. Brandt, T., Dieterich, M., (1986), «Phobischer Attacken-Schwankschwindel, ein neues. Syndrom. Munich: Mьnch Med Wochenschr»
2. Brandt, T., Huppert, D., Strupp, M., Dieterich, M., (2015). «Functional dizziness: diagnostic keys and differential diagnosis. Munich: J Neurol»
3. Brandt, T., Dieterich, M., Strupp, M., (2009). «Vertigo. Munich: Praktika»
4. Staab, J. P., Ruckenstein, M. J., (2005). «Chronic dizziness and anxiety: Effect of course of illness on treatment outcome. Rochester: Archives of Otolaryngology -- Head & Neck Surgery»