на главную
об игре
Uncharted 4: A Thief's End 10.05.2016

Разработка Uncharted 4: немного о ИИ, часть 2

Взгляды в диалогах

Это тоже один из последних аспектов, которыми я занимался в проекте.

Взгляды в диалогах — это логика, заставляющая персонажей реагировать на разговоры, например, смотреть на других людей и делать жесты. В The Last of Us дизайнеры месяцами вручную аннотировали все внутриигровые диалоги, помечая моменты взглядов и жестов. Повторять этого мы не хотели. У нас было несколько заскриптованных диалогов, которые уже разметили вручную, но нужна была система, способная обрабатывать диалоги без аннотаций. Аниматорам давали параметры для регулировки скорости поворота головы, максимального угла поворота головы, длительности взгляда, времени пауз, и так далее.

Сохранение скорости движения джипа

С ранних этапов разработки у нас была проблема с этапом гонки на джипе в уровне с городом на Мадакаскаре: если джип игрока заносило и он терял скорость после удара о стену или машину врага, то игрока отбрасывало далеко от конвоя и он проваливал прохождение уровня.

Я придумал такое решение: временно ограничил сверху угловую скорость и изменение линейной скорости при столкновении со стенами и вражескими машинами. Это простое решение оказалось довольно эффективным — игрокам гораздо сложнее стало проваливать прохождение из-за заносов.

Уничтожение транспорта

В Uncharted 4 впервые появились управляемые игроком машины. В предыдущих играх серии водить машины могли только NPC, и эти машины двигались по сплайновым «рельсам». Я помогал в работе над реализацией уничтожения транспорта.

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

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

При воспроизведении анимаций уничтожения существует вероятность, что уничтоженный транспорт может пройти сквозь стену. Используется sphere cast (сфера, проецируемая как луч) из идеальной позиции машины вдоль «рельс», если бы она не была уничтожена, к позиции, где на самом деле находится её корпус. Если при генерировании sphere cast фиксируется контакт, то машина сдвигается в направлении нормали контакта на долю величины проникновения, поэтому процесс устранения прохода сквозь стену происходит постепенно, на протяжении нескольких кадров, что позволяет избегать резкой смены позиций.

Мы создали специальный тип уничтожения транспорта, называемые vehicle death hint. Это чувствительные к контексту анимации уничтожения, взаимодействующие с окружением. Аниматоры и дизайнеры располагают позиции этих анимаций вдоль «рельсов» сплайна и указывают окна входа в них на сплайнах. Если транспортное средство уничтожается в пределах этого окна, то начинает воспроизводиться соответствующая анимация уничтожения. Изначально эта функция создавалась как инструмент для реализации эпичного взрыва джипа для демо, представленного на E3 в 2015 году.

?t=7m55s

Фильтр Байера для дизеринга

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

Наш первоначальный фильтр Байера был матрицей 8×8, показанной на этой странице Википедии. Я решил, что он был слишком мал и приводил к созданию артефактов в виде полос. Мне хотелось использовать фильтр Байера 16×16, но в Интернете я нигде не мог его найти. Поэтому я попытался выполнить обратную разработку паттерна фильтра Байера 8×8 и заметил рекурсивный паттерн. Я мог бы просто изучить его и записать матрицу 16×16 вручную, но я ради интереса написал инструмент, способный генерировать матрицы Байеса размером в любую степень двойки. После перехода к фильтру Байеса 16×16 артефакты с полосами значительно снизились.

Задержка звука взрыва

На самом деле это очень незначительная деталь, но я хотел бы её упомянуть. За пару недель до показа демо на E3 в 2015 году я заметил, что взрыв башни видится и слышится одновременно, что было нелогично. Нейт и Салли находятся очень далеко от башни, поэтому они должны сначала увидеть взрыв, а потом услышать его. В готовое демо команда художников добавила небольшую задержку звука взрыва.

Локализация на традиционный китайский

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

Вот и всё

Это практически всё, над чем я работал для Uncharted 4 из того, что стоит упоминания. Надеюсь, статья была вам интересна.

Комментарии: 0
Ваш комментарий