Адаптированный переводОригиналМногих начинающих в дизайне видеоигр пугает слово «математика». Но на практике все не так страшно. В дизайне игр чаще всего используют простую алгебру и множение векторов.Даже если эти термины вызывают у вас тревогу, не бойтесь! Моя цель — объяснить абстрактные математические концепции на языке дизайнеров игр.Почему многим легче учить математику именно в контексте дизайна игр? Все просто: X и Y больше не абстракции на бумаге, а конкретные позиции и объекты в игре.Зачем дизайнеру игр математика?От вашей сферы деятельности зависит, какая математика вам понадобится:Квест-дизайнер или нарративный дизайнер обычно использует только арифметику.Дизайнер боевых систем сравнивает умножение и сложение урона.Дизайнер экономики игры создаёт модели потоков ресурсов и налоговых ставок.Системный дизайнер ежедневно применяет линейную алгебру и многократные регрессии для оценки и настройки геймплея.Насколько важна математика для программирования игр?Для начинающих самый частый вопрос: «Нужно ли знать математику, чтобы создать игру?»Короткий ответ: нет, вы можете создавать игры без глубоких математических знаний.Дизайнеры игр приходят из разных сфер: математики, программисты, писатели, химики, историки, юристы и многие другие.Даже как на минимум, полезно знать основы алгебры, линейной алгебры и логики. Это поможет вам понять, где искать ответы, если возникнут вопросы.Сколько математики нужно для программирования игр?Начну с самого простого варианта этого вопроса, который вызывает беспокойство у многих начинающих разработчиков: «Нужно ли мне знать математику, чтобы создать игру?»Короткий ответ — нет, возможно создать игру, не будучи фанатом математики.Дизайнеры видеоигр приходят из самых разных сфер: учителя математики, программисты, писатели, химики, историки, юристы и многие другие.Например, Hollow Knight и многие другие успешные игры были созданы с использованием простых инструментов для разработки игр. Такие игровые движки, как Construct и Game Maker, позволяют новичкам создавать простые игры.В конечном итоге цель компьютеров — выполнять расчёты за вас.Однако длинный ответ таков: нет, математика всё равно потребуется на каком-то этапе.Более важно, чем запоминание конкретных формул, техник или навыков, — это понимание взаимосвязей, описываемых с помощью математики. Разработчики игр постоянно описывают взаимосвязи между объектами.Даже если у вас есть игровой движок, который обрабатывает всю физику — трение, гравитацию и силы, — понимание принципов работы этих систем необходимо для того, чтобы игра выглядела и ощущалась так, как вы хотите.Знали ли вы, что в большинстве платформеров гравитация в три раза сильнее, чем на Земле? Именно это создаёт правильное ощущение при игре в жанре платформера с видом сбоку.Когда вообще нужно использовать математику?Существует множество подходов к решению задач дизайна, и математика — лишь один из них.Например, что если вы хотите, чтобы взрыв наносил больше урона в центре и меньше по краям?Вы можете использовать математику:(Пример кода с линейной интерполяцией)Или же можно просто задать урон дважды: сначала для максимального радиуса, затем для внутреннего:(Пример кода с двумя зонами урона)Первый способ создаёт линейную интерполяцию, которая учитывает каждую единицу расстояния от центра. Второй способ создаёт две чёткие зоны: 15 единиц урона в центре и 10 — на внешнем кольце.Когда я разрабатывал персонажа Xerath в League of Legends, я выбрал второй подход. Мне хотелось создать понятное и чёткое вознаграждение за успешное попадание по цели. Частичные уровни успеха могли бы лишь разочаровать игроков и сделать результаты атаки непредсказуемыми для противников.Принятие подобных решений — это и есть суть дизайна видеоигр. Математика — это всего лишь инструмент, который позволяет создавать разные виды игровых взаимодействий, но это не основа успеха игры.Хорошо, но…Какая математика действительно нужна разработчикам игр?Как бывший студент программирования и компьютерных наук, изучавший математику до высшего уровня и теории графов, я скажу, что самая полезная математика — это та, которую большинство из вас уже изучало в школе.Но, как я уже сказал, это сильно зависит от вашей роли.Геймдизайнер должен знать следующее (в основном это школьная математика):Основные математические операцииАлгебруРешение линейных задачДискретную логикуТехническому специалисту по игровой графике потребуется знать больше:Векторную математикуТригонометриюМатрицыВычисления с плавающей запятойТот, кто создаёт физический движок, должен будет обладать дополнительными навыками, включая:Дифференциальное и интегральное исчислениеКватернионыЯ расскажу обо всех этих понятиях (кроме дифференциального исчисления) в этой статье, чтобы вы могли понять, какие из них могут быть полезны для вашей будущей карьеры или хобби в разработке игр.Какая математика наиболее полезна для создания прототипов игр?Теперь мы подошли к основному вопросу. Вот наиболее полезные виды математики для этих целей:Векторная математикаЭто математика, связанная с позициями, направлениями и расстояниями.Если вы знакомы с игровыми движками, такими как Unity или Unreal Engine, вам могут быть знакомы термины Vector3 (Unity) или FVector (Unreal), которые представляют трёхмерные векторы с тремя значениями (X, Y и Z).Вектор может представлять:Направление (стрелка в пространстве)Позицию (определённая точка в пространстве)Ошибки часто возникают, когда разработчики путают, что именно означает конкретный вектор: направление, позицию или оба сразу.Однако, при правильном подходе векторная математика невероятно полезна. Главное — различать её применения:Позиция (скалярное значение) — Где находится объект?Нормализованные векторы (направление с длиной 1) — В каком направлении движется объект?Ненормализованные векторы (направление и скалярное значение) — С какой скоростью и в каком направлении движется объект?Нормализация вектора означает, что его длина установлена в 1. Это упрощает математические операции, но при этом теряется информация о масштабе (мы знаем только направление, но не знаем точное расстояние).Совет для программирования:Используйте префиксы в названиях переменных, чтобы было понятно, что хранится в переменной и какие у неё единицы измерения. Вот мои рекомендации:pos — позицияwPos — позиция в мировых координатах (world space)lPos — позиция в локальных координатах (local space)dir — направлениеwDir — направление в мировых координатахlDir — направление в локальных координатахv — скорость (velocity)wVel — скорость в мировых координатахlVel — скорость в локальных координатахacc — ускорениеwAcc — ускорение в мировых координатахlAcc — ускорение в локальных координатахНаивысший приоритет при выборе названий переменных — это сделать их понятными для других разработчиков и указать, что именно в них хранится.(Понятия локальных и мировых координат описаны позже в статье.)Пример: стрельба снарядамиРассмотрим пример использования векторов в разработке простой игры с видом сверху.У нас есть игрок (жёлтый), стреляющий ракетой в противника (серый) ниже. Нам нужно определить три параметра:Где должна находиться ракета?В каком направлении она движется?С какой скоростью она движется?Если мы хотим, чтобы ракета летела прямо перед игроком, можно использовать простой вектор:(Пример кода для стрельбы прямо вперёд)Или, если мы хотим, чтобы ракета летела прямо в цель, можно использовать позиции игрока и врага, чтобы вычислить направление:(Пример кода для стрельбы в цель)Результат будет выглядеть так:(Схематическое изображение снаряда, летящего к цели)Эти примеры упрощены, но даже с двумя точками (начальной и конечной) и скоростью можно точно определить, как должна двигаться ракета.Пример: движение игрокаДавайте рассмотрим ещё один пример — определение направления, в котором движется игрок, когда стик контроллера отклонён.(Пример кода для направления движения игрока)В отличие от примера со снарядом, этот вектор не нормализован (его длина важна).Это важно, так как нам нужно учитывать, насколько сильно отклонён стик. Если стик находится в центре или отклонён ниже некоторого порога, игрок не должен двигаться:(Пример кода с проверкой порога движения)Если бы мы разрабатывали платформер, мы бы добавили ускорение из-за гравитации или использовали бы для этого физический движок.(Пример из Unreal Blueprints, показывающий, как сделать движение персонажа на основе ввода)Почему это важно?Даже если вы не пишете код для своей игры, понимание базовых концепций векторной математики поможет вам лучше работать с программированием и игровым дизайном.Вы можете узнать больше о векторной математике для разработчиков игр, посмотрев видео ниже. Полезные математические инструменты для разработки игрСкалярное произведение (Dot Product)Прежде чем продолжить, стоит отметить, насколько полезен этот инструмент. Даже если вы не до конца понимаете математическую часть, скалярное произведение невероятно важно.Сначала разберёмся с названием: dot product.Скучная правда в том, что название происходит от символа «·», но для вас, как игрового дизайнера, это можно понимать как “Direction Of Travel” (направление движения).Если вы вычислите скалярное произведение двух векторов, результат подскажет вам три вещи:Если результат = 0: Векторы перпендикулярны друг другу (угол 90º).Если результат > 0: Векторы направлены примерно в одну сторону (угол между ними < 90º).Если результат < 0: Векторы направлены в противоположные стороны (угол между ними > 90º).Значение скалярного произведения показывает, насколько два объекта смотрят в разные стороны. Это очень полезно, чтобы определить, находится ли что-то перед вами, сбоку или позади.Тригонометрия (вычисление расстояний)В одном из предыдущих примеров мы рассматривали, как запустить ракету в далёкого врага. Чтобы узнать точное расстояние до врага, можно использовать базовую тригонометрию.Поскольку позиции объектов хранятся в виде {x, y}, можно использовать простую тригонометрическую формулу для вычисления расстояния:(Пример формулы вычисления расстояния)(Пример формулы вычисления расстояния)На практике многие опытные программисты уже реализовали эти функции в библиотеках, так что вам не нужно запоминать формулы — достаточно понимать, как их применять. Линейная алгебраЛинейная алгебра — это, по сути, оболочка для двух ключевых понятий:ФормулыКватернионыФормулыФормулы описывают взаимосвязи между разными величинами.Возьмём, к примеру, формулу урона от заклинаний из World of Warcraft:(Пример формулы урона)Эта формула — всего лишь базовая алгебра. Вместо абстрактных X и Y мы используем конкретные параметры:spellPower — характеристика, зависящая от экипировки игрокаbaseDamage — базовый урон, задаваемый разработчиком для каждого заклинанияdamageCoefficient — коэффициент, определяющий, как характеристика силы заклинания преобразуется в уронmulti — множитель, рассчитываемый игровым движком на основе баффов и дебаффовВся алгебра заключается в установлении взаимосвязей между числами для получения полезных результатов.КватернионыПрирода кватернионов довольно сложна, поэтому я рекомендую изучить ссылки в конце этой секции для полного понимания. Как игровой дизайнер, вы должны понимать, как их использовать, а не детали их математического устройства.Если вы когда-либо открывали Unity, вы видели следующие параметры:(Пример изображения интерфейса Unity)Позиция (Position)Вращение (Rotation)Масштаб (Scale)Кватернионы позволяют вам трансформировать объекты, изменяя их положение, вращение и масштаб.Более того, кватернионы позволяют находить позиции объектов относительно других объектов.Пример:Локальная позиция => [Кватернион] => Мировая позицияЧто особенно полезно, так это то, что кватернионы можно складывать.Один расчёт может определить позицию объекта относительно персонажа, следующий — расположение персонажа на движущемся корабле, а затем ещё один — положение корабля относительно планеты.Это позволяет отслеживать объекты даже в сложных сценариях, например, когда игрок бегает по поверхности сферы, заряжает стрелы в лук и одновременно вызывает союзников.К счастью, программисты игровых движков сделали этот процесс простым для нас.(Пример кода работы с кватернионами)Для более глубокого изучения кватернионов и других математических тем для игр посмотрите серию видео Гранта Сандерсона и другие ресурсы, упомянутые ниже. Математика с плавающей запятой (Floating-point Math)Я не мог бы оставить это без внимания, ведь ошибки с числами с плавающей запятой – это одна из самых раздражающих проблем в современной разработке игр.Проблема с числами с плавающей запятойСами по себе числа с плавающей запятой не являются ошибкой — с 1997 года их активно и успешно используют.Проблема в том, что разные аппаратные разработчики не договорились о едином стандарте их реализации. Поэтому нельзя гарантировать, что два одинаковых вычисления на разных компьютерах дадут одинаковый результат.Для одиночных игр это не имеет большого значения. Если игрок нанесёт на 0.0000001 урона больше, чем предполагалось, это не критично.Но для мультиплеерных игр, где важно, чтобы оба игрока видели одинаковую картину, это может стать настоящей катастрофой. Вместо простого сравнения значений на разных устройствах, приходится отслеживать разницу («drift») и согласовывать их.Совет:Если вы начинаете работать с мультиплеером, используйте сетевые движки вроде Photon Quantum, которые решают эту проблему за вас. Этот подход использует фиксированную арифметику, обеспечивая одинаковые результаты на всех устройствах и экономя огромное количество времени при создании прототипов.Дискретная логика (Discrete Logic)При создании правил для игры и их объяснении компьютеру вы будете постоянно использовать дискретную логику.Основные логические операции:AND (A && B) — истина, если оба условия A и B истинныOR (A || B) — истина, если хотя бы одно из условий A или B истинноNOR ((!A) && (!B)) — истина, если оба условия A и B ложныПочему это важно?Создание условий — это основа разработки игрового контента. Логические проверки используются повсюду, даже в таких простых вещах, как открытие двери.Опытные дизайнеры создают стандартные правила работы игры, чтобы их логика оставалась понятной и организованной. Без аккуратного подхода ошибки в дискретной логике могут легко сломать сложные игровые системы.Интерполяция (Interpolation)Следующие два полезных математических концепта имеют забавные названия: Lerp и Slerp.Lerp (Linear Interpolation) — линейная интерполяция, позволяет плавно перемещаться от точки A к точке B.Пример: быстрое перемещение объектов из одной точки в другую.Slerp (Spherical Linear Interpolation) — сферическая линейная интерполяция. Вместо того чтобы перемещаться по прямой линии, она создаёт дугу между двумя направлениями, что отлично подходит для плавного вращения объектов.Применение интерполяцииИспользуя Lerp вместе с кривыми выборки (например, AnimationCurve в Unity), можно легко перемещать объекты так, чтобы это выглядело естественно. Это не заменит ручную работу аниматора, но поможет достичь хороших результатов на стадии прототипирования.Какие математические концепты важны для компьютерной графики?Предыдущие разделы были сосредоточены на движении и игровом процессе. Теперь рассмотрим ключевые математические темы для тех, кто хочет заниматься графикой.ГеометрияОсновные понятия в графике и дизайне уровней охватываются базовой геометрией: точки, линии, плоскости и полигоны.Уровни строятся из множества точек и линий, которые формируют сложные полигоны. Эти полигоны определяют пространства, которые рендерят графические программисты, а игроки проходят, побеждают и порой срывают волосы на голове от сложности.(Пример изображения с полигонами старых игр)В старых играх полигоны были видны намного явственнее, чем в современных, но их основная природа остаётся неизменной.Векторная графика (Vector Graphics)Векторная графика — это не то же самое, что векторная математика. Она описывает визуальные элементы и иллюстрации, созданные с помощью точек, линий и кривых, которые затем заполняются цветом.Если вы когда-либо открывали файл векторной графики в редакторе, таком как Adobe Illustrator, вы уже знакомы с этим понятием.Преимущества векторной графики:Бесконечное масштабирование — векторные изображения можно увеличивать без потери качества.Используется для создания шрифтов, логотипов и других элементов, которые должны выглядеть чётко при любом масштабе.Нормали (Normals)Нормаль — это важное понятие в дизайне уровней, которое описывает направление, перпендикулярное поверхности.Хотя слово «нормаль» звучит странно, можно думать о ней как о направлении, под которым наклонена поверхность.Применение нормалейС помощью скалярного произведения нормали поверхности и вектора «вверх» игрока можно быстро определить, что персонаж должен делать на этой поверхности:СтоятьСкользитьОстанавливатьсяЕсли игнорировать масштаб векторов (предполагая, что они нормализованы, то есть имеют длину 1), это становится ещё проще:Скалярное произведение = 1, если векторы направлены в одну сторону.Скалярное произведение = 0, если векторы перпендикулярны.Скалярное произведение = 0.5, если угол между векторами составляет 45 градусов.Использование нормалей в графикеИзначально нормали использовались в графике для работы с шейдерами, чтобы определить, как рендерить поверхность.Карта нормалей (Normal Map) — специальная текстура, которая делает поверхность более детализированной, улучшая внешний вид без перегрузки видеокарты.(Пример: карта нормалей, высокополигональная модель и финальное изображение с наложенной картой нормалей.)Локальные, мировые и экранные координаты (Local Space, World Space, Camera Space)Когда я упоминал кватернионы, вы могли подумать, что они не так важны для вашей игры. Если вы не собираетесь перемещать объекты между NPC или позволять игрокам бегать по сфере, зачем трансформировать координаты между системами?На самом деле кватернионы жизненно важны для преобразования между локальной системой координат персонажа и мировой системой, а также для преобразования из мировой системы в систему координат камеры.Применение в рендерингеКогда вы рисуете экран, вам нужно определить, каким цветом должен быть каждый пиксель. Для этого необходимо знать, как выглядит мир с точки зрения камеры, а не персонажа.Это важно не только для шейдеров и рендеринга, но и для игрового процесса:Когда игрок кликает по экрану, нужно понять, какой объект находится под курсором.Подобные преобразования обычно выполняются с помощью соответствующих кватернионов, которые преобразуют координаты между двумя системами:От мировых координат к координатам камерыОт координат камеры к мировым координатамХотя реализация зависит от игрового движка, важно понимать суть применения кватернионов для таких преобразований.Еще больше полезной информации в канале по гейдеву - вливайся в наше ламповое комьюнити:t.meБиблиотека разработчика игр | Gamedev, Unity, Unreal Engine
Нейровысер какой-то.
Нет и это очевидно
Сохранил, но матешу ненавижу)
так тебе тогда в другой вагон
Удачи всем погрузиться в шейдерную графику без математики.
Эта аллегория в меме на майнкрафт, потому что в майнкрафте много математики?