Как математика помогает в геймдеве
Никита, чем ты начал интересоваться раньше: играми или математикой?
Четыре года я занимаюсь разработкой программного обеспечения в команде Яндекса. Мы пишем движок рисования карт в приложениях Еды, Карт и Маркета. В геймдев я пришёл случайно пять лет назад. Сначала интересовался графикой, физикой, а потом понял, что по набору скилов мне недалеко до того, чтобы делать игры. Поэтому выходит, что сначала в моей жизни появились математика и программирование, только потом геймдев.
Сейчас я в свободное время пишу компьютерные инди-игры, участвую в гейм-джемах — соревнованиях по созданию видеоигр, где за несколько дней участникам нужно сделать игру на заданную тему. На Itch.io есть несколько моих проектов.
В 2021 году я начал вести курс про real-time-графику на факультете МКН в СПбГУ. А этой весной — ещё и экспериментальный мини-курс на полсеместра про трассировку лучей.
О, расскажешь о курсах подробнее?
В геймдеве разработчики сталкиваются с разными задачами. Они занимаются разработкой логики (что происходит в игре, кто из персонажей куда идёт, кто кого атакует), графическим интерфейсом, физикой и симуляциями (например, когда трава в игре растёт сама по себе), графикой (пишут графический движок, реализуют эффекты и оптимизируют их). Мои курсы как раз о том, как создавать графические движки.
Real-time-графика. Это компьютерная графика, которая создаётся в реальном времени. Кадровая частота в видеоиграх обычно 60 кадров в секунду — чтобы воссоздать один кадр, у разработчика есть 16 миллисекунд. Чем быстрее сменяются кадры, тем картинка круче выглядит.
На курсе мы работаем с платформой OpenGL и изучаем фишки, которые можно использовать, чтобы при таких жёстких ограничениях по времени нарисовать что-то интересное. После 15 занятий студенты могут самостоятельно написать движок для несложной игры 10-летней давности.
Трассировка лучей. Это курс про CGI-графику, которую используют для создания персонажей, сцен и спецэффектов в фильмах, рекламе и играх. Тут у разработчика нет таких сильных ограничений по времени: кадр рендерится один раз и потом показывается. Поэтому и специфика курса другая: мы больше вкладываемся в фотореализм, чтобы на выходе получить натуральную картинку. На курсе я рассказываю об одном из основных математических алгоритмов, к которому всё сводится, — решении уравнения распространения света.
Какую роль математика играет в разработке игр?
Это зависит от типа игры и сложности её логики. Например, при разработке шахмат, где просто фигурки двигаются по доске, математика используется только для обучения искусственного интеллекта. Если игра более реалистичная, например Kerbal Space Program про космические полёты, то знаний математики нужно больше.
Разработка игр — сложный мультидисциплинарный процесс из множества этапов, математика нужна практически на каждом из них.
Для разработки логики игры понадобятся знания дискретной математики (комбинаторики, теории графов) и теории вероятностей. Графический движок не написать без линейной алгебры, аналитической геометрии, продвинутым разработчикам пригодится дифференциальная геометрия, математическая статистика и анализ цифровых сигналов.
Линейная алгебра, аналитическая геометрия и вычислительная линейная алгебра используются для написания физического движка. Работа с аудио — это анализ цифровых сигналов, математический анализ и комплексные числа. При создании контента (моделей, текстур, анимаций, эффектов) пригодится базовая векторная алгебра, а в гейм-дизайне — дискретная математика и статистика.
А приведешь конкретные примеры?
Перемещение персонажей. В играх-платформерах вроде Super Mario, где персонаж прыгает по ступенькам, лазит по лестницам и собирает предметы, математика нужна для разработки логики его передвижений. Например, для расчёта ускорения, с которым персонаж прыгает, или силы, с которой он толкает предметы, когда игрок нажимает кнопку.
Трёхмерное вращение. Если нужно, чтобы объекты не только двигались, но и вращались, на помощь тоже приходит математика. В 2D это сделать несложно: вращение можно описать одним углом поворота. В 3D всё становится интереснее. Можно описать трёхмерное вращение тремя углами Эйлера. Но с этими углами очень неудобно работать, поэтому можно описать вращение матрицей 3 × 3. Матрицы гораздо удобнее, но они крайне избыточны (нужно запомнить девять значений вместо трёх), и не любая матрица является вращением. В итоге решение сводится к кватернионам — четвёрке вещественных чисел x, y, z, w с покомпонентным сложением и хитрым некоммутативным законом умножения.
Шейдеры. Это специальные программы наподобие инструкций, по которым видеокарта понимает, как нужно отрисовать тот или иной эффект. Шейдеры целиком состоят из математики. Например, Smoothstep — s(t) = 3t² − 2t³ — очень важная функция, которая встроена во все языки шейдеров и часто используется для анимаций и сглаживания изображений.
Генерация мира. Для генерации игрового мира также необходимы знания математики. Есть много подходов, но чаще всего выделяют два: глобальный и локальный. При глобальном подходе генерируется сразу весь мир: например, целый остров с горами, реками и поселениями. При локальном подходе мир создаётся постепенно и различные его участки могут генерироваться независимо друг от друга. Такой подход предпочтительнее для игр с очень большим миром.
Допустим, нам требуется сгенерировать небольшой кусочек мира. Для простоты можно считать, что нужно сгенерировать высоту ландшафта в каждой точке, то есть карту высот. Для этого нам понадобится шум. В игровой индустрии шумом называют любую функцию, выглядящую случайной. Часто эта функция задана не для непрерывного аргумента, а на дискретной сетке. Нам нужен какой-нибудь непрерывный шум — плавно меняющаяся, но всё ещё случайная функция. Один из самых распространённых алгоритмов для этого называется шумом Перлина — по фамилии его создателя, Кена Перлина.
Распространение света. Свет взаимодействует с объектами по очень сложным законам. В общем случае свет, выходящий из какой-то точки объекта в каком-то направлении, складывается из света, пришедшего со всех возможных направлений! Чтобы описать и смоделировать распространения света в компьютерной графике, нужно решать интегральное уравнение.
Обычное уравнение рендеринга описывает только взаимодействие света с поверхностью объектов: тени, отражение, преломление, рассеяние света. Его сложно решать, и этому посвящён весь мой курс о трассировке лучей из восьми занятий.
Многие эффекты требуют взаимодействия света с объёмом: например, лучи света в пыльной комнате. Для этого нужно ещё более сложное уравнение объёмного рендеринга. Оно используется в играх для объёмных лучей света, тумана, облаков или для реалистичного неба.
Насколько глубокие знания математики необходимы для успешной карьеры в геймдеве?
Смотря чем вы хотите заниматься. В геймдеве много профессий. Например, художнику или аудиоинженеру математика не очень нужна. Но если художник работает в среде 3D-моделирования и знаком с математическими основами трёхмерной графики, то какие-то вещи он сможет делать быстрее, это будет хорошим бонусом для него.
Для разработки компьютерной графики математика нужна всегда, без знания аналитической геометрии и линейной алгебры справиться нельзя. На своём курсе по трассировке лучей я рассказываю студентам об основах теории вероятностей и статистики.
Гейм-дизайнерам математика пригодится для разработки баланса игры. Баланс в играх определяет сложность и взаимоотношения объектов между собой. Например, в игре-стратегии есть несколько юнитов: башни, которые игрок защищает, враги, от которых он отстреливается, и так далее.
Юниты (англ. units) — это игровые объекты в компьютерных играх, которые могут быть созданы, управляемы и уничтожены игроком. У них могут быть различные характеристики, такие как здоровье, скорость, урон и так далее.
Если игра получается лёгкой, нужно сделать её интереснее или создать регулируемый уровень сложности. Тогда гейм-дизайнеры подкручивают большое количество параметров: стоимость юнита, запас здоровья, атаку для каждого типа юнита игрока или его врага, урон и силу башни.
Для этого они создают таблички в Excel, расписывают все параметры, придумывают формулы и на их основе пытаются регулировать баланс игры. Например, чтобы уравнять силу игрока и врага, нужно придумать, что такое сила, и создать формулу, которая будет её описывать.
С этой задачей можно разобраться интуитивно, но со знанием математики на уровне старших классов сделать это будет проще. Полезно знать, как поведёт себя функция, если число возвести в квадрат, как выглядит квадратный корень, логарифмы и так далее.
Стоит ли ждать применения новых математических подходов в геймдеве в ближайшем будущем?
В математике не так часто возникают новые методы, но регулярно переоткрываются отдельные дисциплины.
В компьютерной графике я наблюдаю такую тенденцию развития: разработчики находят академические статьи, изучают уже известные алгоритмы и применяют их в работе.