Как устроены полёты на паутине в Marvel’s Spider-Man
Разбираемся, как разработчики заставили игроков поверить, будто в этот раз паутина действительно крепится к зданиям.
Скриншот: игра Marvel’s Spider-Man / Insomniac Games
Камень преткновения всех трёхмерных игр про Человека-паука — реализация механики полёта на паутине, которая должна быть и реалистичной, и весёлой. Странно было бы заставлять игрока постоянно прицеливаться и вручную цепляться паутиной к зданиям.
Такая механика была бы слишком сложной, тем более что Паука в полёте ещё и качает вверх-вниз. То есть, чтобы было весело, поиск подходящих мест, за которые могла бы зацепиться паутина, должен быть автоматическим. Но как это провернуть? И как дать игроку необходимый контроль за перемещением Паука, чтобы тот не врезался в стены?
Считается, что лучше всех с этим справились разработчики Marvel’s Spider-Man, вышедшей в 2018 году. Рассказываем, как им это удалось.
Эталонная игра про полёты на паутине
Сначала немного предыстории. Эпоха трёхмерных игр про Человека-паука началась в 2000 году с выходом игры Spider-Man. Поиграть в неё можно было на всех ключевых игровых платформах того времени. Но многие запомнили именно версию для PlayStation.
Полноценной симуляции полётов на паутине в игре не было. Технически это было реализовано так: когда игрок дважды нажимал кнопку, отвечающую за прыжок, Человек-паук подпрыгивал и просто начинал двигаться в воздухе вперёд. Анимация при этом создавала иллюзию, будто он раскачивается на паутине. Сама паутина устремлялась за край экрана — строго вверх. К чему она там могла крепиться в небе, умалчивалось. Она была скорее косметической.
Особенность такого подхода была в том, что игрок никак не мог изменить направление полёта — только прервать его. Впрочем, даже с таким минимумом это была отличная игра про Человека-паука. И иллюзию полёта на паутине она создавала убедительную.
В игре Spider-Man: The Movie Game, вышедшей в 2002-м по мотивам первого фильма с Тоби Магуайром, использовался тот же принцип. Но игроки во время полёта всё-таки могли поворачивать влево-вправо.
В 2004 году вышла Spider-Man 2 — уже по мотивам второго фильма с Тоби Магуайром. В нулевые от игр по лицензии фильмов никто не ждал качества, но Spider-Man 2 всех приятно удивила. Разработчики из Treyarch совершили небольшую революцию.
Во-первых, в игре был открытый мир — целый город, сопоставимый по размерам с Либерти-Сити из GTA 3. В предыдущих играх мы летали на паутине по относительно небольшим уровням. Во-вторых, впервые полёты на паутине были основаны на физике. Герой раскачивался на ней, как маятник, и мог менять направление полёта. К тому же он мог в любой момент отпустить паутину и выстрелить новую нить. Отныне паутина перестала быть лишь визуальным эффектом, просто сопровождающим анимацию полёта. Это был полноценный физический объект, длина которого и определяла, как будет перемещаться главный герой.
И самое важное — паутина на этот раз на самом деле крепилась к зданиям. И точка крепления определяла, как именно вы будете лететь по городу. Вы также могли выпустить сразу две нити паутины из обеих рук и просто зависнуть над землёй, держась за них.
Точки для крепления паутины располагались на самих зданиях. Сначала разработчики хотели размещать их только на углах строений. Но это было неэффективно, поэтому они решили сделать систему, которая сама создавала точки для крепления на поверхности, оказавшейся в поле зрения Человека-паука.
К сожалению, в последующих играх про Паука делали перемещение на паутине с оглядкой на игру 2000 года. То есть паутина уносилась куда-то в сторону неба, и мы не видели, к чему она крепится. Подобный подход встречался, например, в Spider-Man: Web of Shadows, вышедшей в 2008-м, в The Amazing Spider-Man 2012 года и даже в Lego Marvel Super Heroes 2013 года.
Вышедшая в 2018-м Marvel’s Spider-Man, разработанная Insomniac Games, стала второй после Spider-Man 2 игрой про Человека-паука, в которой разработчики попытались реализовать реалистичное перемещение на паутине, основанное на физике. О том, как им это удалось, авторы прочитали часовую лекцию на GDC в 2019 году. Ниже мы расскажем о нюансах создания этой механики.
Как выбрать точку крепления паутины
При разработке перемещений на паутине авторы Marvel’s Spider-Man хотели решить несколько ключевых задач. Во-первых, перемещение должно быть основано на физике, чтобы игроки почувствовали, будто они действительно несутся на паутине между высоток Нью-Йорка.
Во-вторых, паутина обязательно должна цепляться к объектам игрового мира, а не к некой точке в небе. В-третьих, игрок не должен задумываться о том, как работает механика полёта. Она есть, и он её просто использует.
«Мы хотели, чтобы игроки в действительности думали только о том, куда они хотят полететь, а не за что они хотят зацепиться. Это позволяет игроку сосредоточиться на дополнительных слоях геймплея, таких как преследование машин или уклонение от пуль и ракет».
Даг Шеэн (Doug Sheahan),
один из главных программистов Marvel’s Spider-man
Сначала разработчики пытались реализовать механику прикрепления паутины к домам при помощи массива невидимых лучей (raycasts), которые моделька Человека-паука испускала в разные стороны.
Пучок таких лучей должен был «прочёсывать» окружение впереди. Если какой-то из них попадал в точку для прикрепления паутины, расположенную на здании, то паутина цеплялась за неё.
Но у такого подхода был серьёзный минус. Длина каждого луча в мире игры составляла около 50 метров. И даже если лучей было очень много, в какой-то момент они расходились настолько, что расстояние между двумя соседними лучами увеличивалось до 20 метров. Из-за таких промежутков лучи попросту пропускали точки крепления паутины не только на маленьких объектах вроде флагштоков и радиовышек, но и на крупных вроде больших зданий. Особенно часто упускались углы домов, которые были идеальной точкой крепления для паутины, ведь они позволяли Человеку-пауку свернуть на соседнюю улицу.
В общем, от массива лучей пришлось отказаться. Они, конечно, всё равно используются, но теперь не играют такой большой роли в поиске точек крепления паутины. Вместо этого разработчики обернули каждое здание в невидимую геометрическую фигуру, повторяющую его очертания, — и на ней размещалось множество точек, за которые могла зацепиться паутина. Когда Паук пролетал мимо такого здания, программа сразу получала информацию обо всех точках крепления, которые на нём есть. Далее оставалось выбрать одну из них.
Точки по стенам зданий раскидывала система процедурной генерации города, реализованная при помощи программы Houdini. Для понимания, Нью-Йорк, который вы видите в игре, состоит из 8300 зданий. И он не создавался разработчиками вручную. Все дома изначально выглядели как набор простых примитивов — кубов и цилиндров. А затем уже при помощи процедурной генерации они обрастали деталями вроде окон, карнизов и водонапорных башен. И если разработчики вносили какие-то изменения в здания или улицы, то система процедурной генерации автоматически меняла и разметку точек крепления паутины.
Теперь, располагая множеством точек крепления на зданиях, игре оставалось лишь найти среди них ту единственную, к которой и прицепится во время полёта следующая нить.
Игрок задаёт направление движения персонажа. Система берёт этот вектор и строит на нём отрезок длиной в несколько метров. Затем этот отрезок поворачивается на несколько градусов — гипотетическое направление выстрела паутиной, ведь Паук стреляет ею не вперёд, а в стороны. Там, где отрезок заканчивается, создаётся точка для дальнейших вычислений.
Полученная точка (назовём её X) условно висит в воздухе между Человеком-пауком и стеной. Далее программа находит рядом с ней две точки на здании (A и B). Точка А — та, что ближе всего к точке X.
Точка B — это то место на здании, в которое попал бы наш отрезок, если бы мы продолжили его.
Условно, точка A идеальна для ситуаций, когда мы хотим на паутине пролететь вдоль стены здания. Точка B нужна, когда вам надо попасть по прямой в определённое место. Далее игра выбирает, в зависимости от направления движения игрока, какая из точек ему предпочтительнее, либо использует среднее значение между ними.
Но тут есть один нюанс. Точно такие же точки система найдёт и на других зданиях. Встаёт вопрос: как из множества таких точек выбрать именно ту, за которую в следующем кадре и зацепится паутина?
Этот вопрос решает система рейтинга. Точки сравниваются друг с другом, набирая баллы по определённым критериям. Например, если персонаж летит вдоль здания, то точка, которая позволит ему продолжить движение в этом направлении, получает балл. Если впереди перекрёсток с четырьмя углами четырёх зданий, то балл получает точка на том углу, который позволит совершить поворот на перпендикулярную улицу. Точка, набравшая самое большое количество баллов, и становится местом крепления паутины.
Как контролировать скорость
Поломать голову разработчикам пришлось и над тем, как управлять скоростью Человека-паука в полёте. В конце концов, он не Супермен, и его полёт — это на самом деле этакие прыжки с одних качелей на другие.
С точки зрения физики на скорость полёта Человека-паука влияет гравитация. Когда он, держась за паутину, несётся вниз, скорость увеличивается. Когда же он движется вверх — снижается.
Но есть проблема: если Паук таким образом сможет развить слишком большую скорость, город попросту не будет успевать подгружать новые районы. Так что предельную скорость ограничили 30 метрами в секунду.
Когда Паук летит вниз, система искусственно подтормаживает его. Игроки этого не замечают благодаря визуальным эффектам, создающим ощущение возрастающей скорости. Но это иллюзия: на самом деле Паук летит не так быстро, как кажется.
А вот когда Человек-паук движется по дуге вверх, то на него действует сила тяжести и он замедляется — то, чего игрок и ждёт. Однако и тут разработчики пошли на хитрость. Чтобы движение Человека-паука больше походило на полёт, они позволили ему подольше сохранять набранную скорость.
Непростое управление полётом
После того как разработчики разобрались с тем, как крепится паутина к зданиям и как Человек-паук набирает скорость, они столкнулись с несколькими трудностями не технического плана. Выявить их удалось во время тестов. Так, первым игрокам очень не понравилось, что, вопреки ожиданиям, они не могли лететь на паутине строго по прямой.
Дело в том, что законы физики тянули Человека-паука под точку прикрепления паутины. Куда прицепился — туда тебя и тянет. Получается зигзаг. Если бы Паук существовал в реальном мире, то примерно так он бы и двигался — то влево, то вправо.
«Игроки пытались лететь посередине улицы, но их постоянно тянуло вбок — к точке прикрепления. Они пытались вырулить на середину, но их следующая точка привязки оказывалась на другой стороне улицы, и их тянуло уже туда. Разочарование игроков увеличивалось. В довершение всего это зигзагообразное движение также замедляет их скорость по прямой, и они просто чувствуют, что на самом деле не могут развить тот импульс, который им нужен».
Даг Шеэн (Doug Sheahan),
один из главных программистов Marvel’s Spider-man
Чтобы решить эту проблему, разработчики сдвинули точку прикрепления паутины от стены здания ближе к середине улицы. Визуально паутина по-прежнему крепилась именно к стене. Но расчёты для раскачивания производились уже не от стены, а от некой точки посреди улицы. Благодаря этому Человек-паук всё время летит по центру улицы. То есть фактически в Marvel’s Spider-Man паутина тоже цепляется за небо, как и во многих своих предшественницах. Только игроки об этом не знают, ведь выглядит всё так, будто зацепилась она за стену.
В случаях, когда Человек-паук цеплялся за угол, чтобы повернуть, точка крепления оставалась на стене. Иначе поворот выглядел бы неестественно.
Другая проблема касалась ситуаций, когда игрок, пролетая по улице, поднимался до уровня крыши. Во время тестов в этот момент он терял возможность нормально раскачиваться на паутине. Происходило это потому, что для правильного раскачивания требовалось, чтобы точка крепления всегда была хотя бы на небольшой высоте над игроком.
Чтобы полёт оставался нормальным, разработчики просто подняли точки крепления немного выше уровня крыши. Опять же, визуально паутина цеплялась за карниз, но раскачивался Человек-паук вокруг точки, которая расположена над зданием.
Но и на этом проблемы не закончились. Во время тестов игроки слишком рьяно пытались контролировать полёт Человека-паука, из-за чего то и дело во что-нибудь врезались. А пытаясь повернуть за угол во время полёта, они просто врезались в сам угол. В итоге разработчикам пришлось сделать систему, которая незаметно корректировала полёт.
Игра сканирует пространство перед персонажем при помощи лучей. И если впереди препятствие, то Человек-паук сдвигается влево или вправо. Игрокам кажется, что это они так ловко летят на паутине, обходя все препятствия, а на самом деле они в лучшем случае лишь задают направление полёта.
Похожим образом была решена и проблема с карнизами. Порой, пытаясь пролететь над крышей здания, игроки врезались в карниз: паутина оказывалась слишком длинной. Избежать подобного можно было бы, если бы разработчики разрешили как-то контролировать длину паутины во время полёта. Но подобную функцию в игру не добавили. Вместо этого система сканирует пространство перед игроком и, если видит препятствие, над которым можно пролететь, то сама медленно укорачивает паутину.
Аналогично игра укорачивает паутину, если Человек-паук, пролетая над улицей, рискует врезаться в землю, автомобильный трафик, людей или что-нибудь ещё. Таким образом под главным героем всегда остаётся достаточно пространства, защищающего его от столкновения.
* * *
Полёты на паутине в Marvel’s Spider-Man, пожалуй, самые зрелищные из всех, что были в играх про Человека-паука. Иллюзия создаётся весьма убедительная. Плюс хотя бы визуально паутина всегда цепляется за объекты вокруг Человека-паука, а не за некую точку в небе. К тому же разработчики позаботились о том, чтобы сам полёт по высокодетализированному городу обходился без столкновений с препятствиями.