Примечание: этот пост был первоначально опубликован 14 июля 2017 года.

Ниже представлен конечный продукт после 13 часов прототипирования и решения проблем. Прочтите сообщение ниже, чтобы увидеть мой путь к достижению этого результата.

Начало

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

Одним из распространенных способов перемещения пользователей в виртуальной реальности является телепортация, когда пользователь указывает своим контроллером на пункт назначения, который он хочет переместить, а затем отпускает/нажимает кнопку, чтобы немедленно телепортироваться в этот пункт назначения. Тем не менее, телепортация в виртуальной реальности разрушает технологию погружения, специально созданную для погружения. Вместо этого я попытался имитировать элементы управления сенсорной панелью, представленные в других VR-играх, где движение определялось в зависимости от того, куда пользователь кладет пальцы на сенсорную панель Vive. Например, если пользователь поместит палец на левую сторону сенсорной панели, его персонаж в виртуальной реальности будет двигаться влево, и чем больше пользователь поместит пальцы на внешние края сенсорной панели, тем быстрее будет двигаться его персонаж.

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

Программирование триггера-локомоции

Мой новый метод перемещения по триггеру будет работать, позволяя пользователю указать один контроллер в том направлении, в котором он хочет двигаться, а затем нажать триггерную кнопку Vive на этом контроллере, чтобы двигаться в этом направлении.

ControllerForward & CameraFollow

Программируя эту механику, я начал с определения направления, куда указывали мои контроллеры. Для простоты я сосредоточился на применении этого метода движения только к левому контроллеру. Я начал с создания пустого дочернего объекта под левым контроллером и назвал его «ControllerForward», затем создал другой объект под ControllerForward и назвал его «CameraFollow». Идея создания этих объектов заключается в том, что я буду перемещать CameraFollow в прямом направлении объекта ControllerForward, а затем заставлять SteamVR CameraRig плавно следовать за этим объектом CameraFollow. К сожалению, это не сработало, как ожидалось — поскольку CameraFollow была подключена к левому контроллеру, а y-позиция левого контроллера всегда была выше 0, были сценарии, когда SteamVR CameraRig отрывался от земли.

Настройка и решение

В итоге я получил объект ControllerForward, являющийся дочерним элементом SteamVR CameraRig, что позволяет легко контролировать плавность движения камеры, блокировать положение Y камеры, чтобы она не отрывалась от земли, и по-прежнему получать всю информацию о контроллере. с левого контроллера. Идея объекта CameraFollow (который все еще является дочерним элементом объекта ControllerForward) заключается в том, что при нажатии кнопки триггера информация о глубине триггера (насколько сильно нажата кнопка триггера) перемещает объект CameraFollow между 0 и 1 единицами. в прямом направлении объекта ControllerForward. Таким образом, если кнопка запуска будет нажата только на 10%, CameraFollow сдвинется только на 0,1 единицы. Таким образом, фактический SteamVR CameraRig можно закодировать так, чтобы он плавно перемещался к объекту CameraFollow при нажатии триггера.

Результаты были довольно впечатляющими для того, к чему я пришел всего за пару часов — я мог плавно и интуитивно передвигаться в виртуальной реальности, а с некоторыми настройками скорости следования камеры для имитации нормальной скорости ходьбы я практически не чувствовал тошноты в виртуальной реальности. . В приведенном ниже GIF круглая капсула — это объект CameraFollow, а маленький квадрат — объект CameraFollow.

Выполнение

Теперь, когда я запрограммировал рабочий метод передвижения, я попытался реализовать его в своей первоначальной идее простой игры с луком и стрелами. Однако механика двуручного обращения с луком и стрелами плохо сочеталась с использованием левого контроллера для перемещения в пространстве. Кроме того, движение не подходило для больших миров, а скорость движения не могла быть слишком быстрой, иначе я почувствовал значительные волны VR-болезни.

Вместо того, чтобы отказаться от этого метода передвижения по триггеру, я долго и упорно думал о том, как мы могли бы использовать сильные стороны этой системы движения в игре, которая опирается на эти сильные стороны. Trigger-locomotion имитирует ходьбу в реальном мире, при этом пользователь может точно контролировать, с какой скоростью идти и в каком направлении идти. Это управляемая и удобная симуляция ходьбы для стелс-игр или одного из моих любимых жанров — ужасов.

Новое направление

Не теряя времени, я взял «Horror Hospital Pack» от FoeJofMay в магазине Unity Asset и начал создавать небольшую хоррор-среду. При переходе в виртуальную реальность, чтобы увидеть, как триггерная локомоция будет работать в небольших помещениях, начальные тесты выглядели действительно многообещающе; более медленное, более методичное движение очень хорошо держалось в ужасных / жутких условиях.

Взаимодействие с пользователем

Создание сцены ужаса — это максимальное погружение игрока за счет воздействия на чувства пользователей. Уникальность виртуальной реальности заключается в том, что она напрямую влияет на осязание игроков через виртуальные контроллеры. Имея это в виду, основным взаимодействием с пользователем, которое я хотел, чтобы пользователь контролировал (помимо движения), был небольшой свет, который они могли использовать для освещения окружающей среды и объектов при перемещении сцены. Я взял актив «SciFi Handlight» от Hit Jones и сопоставил его с правым контроллером, чтобы пользователь мог держать свет в правой руке и двигаться левой. Сначала я запрограммировал подсветку так, чтобы она включалась и выключалась, когда пользователь нажимает на сенсорную панель, но затем задался вопросом, почему пользователь вообще выключает подсветку. Суть опыта, который я пытался создать, заключалась в том, чтобы пользователь не чувствовал себя в безопасности.

Возвращаясь к чертежной доске, я подумал, что было бы более интерактивным, если бы пользователю приходилось встряхивать свой контроллер, чтобы генерировать больше света, как светящаяся палочка. Со временем свет постепенно тускнел, заставляя пользователя снова встряхивать свои контроллеры, чтобы осветить свое пространство и увидеть, куда они идут. Для этого я сопоставил диапазон и интенсивность пользовательского света с угловой скоростью правого контроллера, сделав так, чтобы чем быстрее встряхивался контроллер, тем дальше и ярче свет он светил. Когда угловая скорость контроллера не достигает определенного порога, диапазон и интенсивность света со временем уменьшаются, создавая эффект медленного затухания света. Хотя это и не идеально, он определенно сделал свою работу, заставив игрока взаимодействовать и создав значительно более эффективное ощущение ужаса.

Анимация и триггеры

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

Сначала я создал монстра, который быстро несся по земле, когда пользователь проходил определенную точку в начале сцены. Используя ресурс True Horror от Witch-A-Twin Studios, я перетащил модель монстра и создал для нее контроллер анимации. Оттуда я перетащил специальную заранее созданную анимацию, которая анимировала, как монстр быстро ползет по полу, надеясь, что это напугает пользователя.

Затем я добавил еще несколько анимаций и триггеров, включая открытие двери, многократное мерцание света, появление жутких картин и пугающий сюрприз для пользователя в конце уровня. Пошаговое ознакомление с кодом этих поведений займет некоторое время, но самое сложное в создании этих триггеров и анимаций — усовершенствовать синхронизацию и поведение, чтобы дать пользователю реальное чувство страха и ужаса.

Постобработка

Как человек, который замечает и ценит отличную кинематографию в кино, на телевидении, в играх и, конечно, в виртуальной реальности, я хотел, чтобы моя работа была усилена возможностью постобработки сцены с различными эффектами. Я специально использовал актив Unity Post-Processing Stack FX, чтобы изменить эти эффекты, и хотя я не буду рассказывать обо всех эффектах, которые я использовал, я кратко коснусь некоторых, с которыми я экспериментировал:

Сглаживание

Я использовал сглаживание, чтобы повысить резкость некоторых текстур и придать миру более округлый и реалистичный вид. Я не мог выставить этот параметр на максимум из-за требований к производительности и стабильности при разработке в виртуальной реальности (где 90 кадров в секунду — это минимальный минимум для разрешения экрана 1080p), включения параметра по умолчанию было более чем достаточно, чтобы выполнить работу без ущерба кадры.

Окружающая окклюзия и цветение

Окружающая окклюзия — это эффект, который имитирует то, как свет в реальном мире отражается от объектов, в том числе то, как свет попадает в ловушки в небольших областях, таких как щели дивана или швы кровати. Этот эффект добавляет реалистичности без потери производительности. Блум, однако, не является естественным для глаз, но добавляет эффект более резкого и интенсивного света, создавая постоянное ощущение беспокойства.

Глубина резкости

Глубина резкости — это интересный эффект, который делает объекты в поле зрения пользователей более четкими, а объекты за пределами поля зрения пользователей — более блеклыми и размытыми. Этот эффект отлично смотрится во многих современных играх и хорошо работает в качестве инструмента в фотографии. Однако, когда я попытался применить глубину резкости в VR, мне стало очень некомфортно. Я не уверен, был ли шейдер Unity несовместим с виртуальной реальностью, но включение DOF дезориентировало в виртуальной реальности и преподало урок, что эффекты, созданные для 2D-экрана, могут автоматически иметь такой же эффект в виртуальной реальности. В результате я решил не использовать глубину резкости в этой сцене.

Хроматическая аберрация, виньетка и грязь на объективе

Эти три эффекта сделали камеру более сломанной, пыльной и грязной, добавляя ощущение жуткости/ужаса. Я не доводил интенсивность этих эффектов до 100%, а настроил их ровно настолько, чтобы визуально отражать разлагающиеся объекты в окружающей среде с помощью объектива камеры.

Оттенки серого и пленочное зерно

Эти два эффекта обычно используются, чтобы камера/сцена выглядела старше и состарилась. Например, популярные шоу, такие как «Ходячие мертвецы», используют зернистость пленки, чтобы сделать свои сцены более соответствующими постапокалиптической среде, в то время как фильмы, такие как «Безумный Макс» (в его коллекционном издании BluRay), используют оттенки серого, чтобы сделать свои сцены более реалистичными. камера чувствует себя более приземленной в окружающей среде и делает действие более кинематографичным.

Результаты постобработки вы можете увидеть ниже. Сцены не только стали темнее, но и стали лучше визуально отражать окружающую среду, которую я намеревался создать.

Перед постобработкой:

После постобработки:

Звук и полировка

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

Одним из звуков, который представлял собой проблему, были шаги пользователя. В 2D- или 3D-играх звуки шагов обычно воспроизводятся по таймеру каждый раз, когда персонаж движется. Этот метод программирования нельзя скопировать и вставить в VR-игру, поскольку, если пользователь движется вниз, звук шагов не должен воспроизводиться, и звук не будет воспроизводиться, если пользователь делает полшага назад, а затем немного вперед. Чтобы учесть это в виртуальном пространстве, я создаю объект под названием «FootPos», который меняет положение, чтобы совпадать с положением камеры каждый раз, когда пользователь перемещается на 0,6 единицы от этого объекта FootPos исключительно по оси X или Z. Это расстояние в 0,6 единицы соответствует длине одного шага, поэтому, если пользователь сделает шаг в физическом мире, FootPos изменит свое положение на место, где находится камера (и, следовательно, пользователь). Кроме того, каждый раз, когда FootPos перемещал свою позицию (то есть каждый раз, когда пользователь делал шаг), воспроизводился случайный звук шагов из заранее определенного набора звуков шагов.

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

Я всегда готов поделиться своими творениями, и вы можете найти опыт, который я создал здесь. Имейте в виду, что вам понадобится HTC Vive, компьютер с поддержкой виртуальной реальности и SteamVR!

Увидимся в следующем посте,

Теджас