Математика в Gamedev по-простому
前往频道在 Telegram
Как на самом деле работают стрельба, толпа NPC, графика, физика тканей. Канал про то, что ИИ не заменит: понимание. Разборы на пальцах, рабочий код, интерактивы. dev-math.ru Сотрудничество: @it_bizdev
显示更多443
订阅者
无数据24 小时
+177 天
+9130 天
数据加载中...
吸引订阅者
六月 '26
六月 '26
+73
在1个频道中
五月 '26
+369
在2个频道中
Get PRO
四月 '260
在4个频道中
Get PRO
三月 '26
+8
在1个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 21 六月 | +1 | |||
| 20 六月 | 0 | |||
| 19 六月 | +5 | |||
| 18 六月 | +1 | |||
| 17 六月 | +2 | |||
| 16 六月 | +10 | |||
| 15 六月 | +1 | |||
| 14 六月 | 0 | |||
| 13 六月 | +1 | |||
| 12 六月 | +1 | |||
| 11 六月 | +2 | |||
| 10 六月 | 0 | |||
| 09 六月 | 0 | |||
| 08 六月 | +3 | |||
| 07 六月 | 0 | |||
| 06 六月 | +10 | |||
| 05 六月 | 0 | |||
| 04 六月 | +2 | |||
| 03 六月 | +1 | |||
| 02 六月 | +1 | |||
| 01 六月 | +32 |
频道帖子
Новая неделя, новый формат
Чтож, попробуем что-то новое. Мне всегда хочется делать "лучше чем раньше". Раньше темы были довольно часто встречающиеся по которым материалы и так найти относительно легко. Сейчас я хочу взять тему, которая разобрана не так хорошо. Раньше посты выходили сами по себе — а теперь запускаем первый сезон: связную историю на две недели, с началом, серединой и развязкой.
Тема первой недели — цвет. И сразу вопрос на засыпку: вы уверены, что цвет в реальности — это RGB? Три числа на пиксель?
Собственно, нет. RGB — это не базовая реальность, а трюк, упрощение. Возьмите два цвета, идеально совпавших под лампой в комнате, и вынесите на улицу — они разъедутся. Один и тот же «цвет» под разным освещением становится разным. Это метамерия, и это только первая трещина.
Как это будет выходить. Каждый эпизод — три такта:
— трюк — как индустрия считает это дёшево и почему это умно;
— граница — точная сцена, где допущение ломается;
— за границей — физика, которую трюк отбросил.
А неделя устроена так:
🟦 Пн — комикс-затравка (наш Дейв тоже уверен, что цвет — это RGB; зря);
🟩 Вт–Пт — четыре коротких разбора, по одному на под-тему;
🟧 Сб — большая статья с интерактивом на Unity: хак и эталон рядом, крутите сами и смотрите, где именно фейк начинает врать;
🟥 Вс — комикс-выпуск с развязкой недели и карточкой «что запомнить».
И так две недели. Восемь эпизодов — от «что вообще такое цвет» до спектрального рендера, который считает свет честно. По сути, это история про то, что любой хак — это карта допущений; вопрос лишь в том, знаете ли вы её границы.
Старт — в понедельник, с первого комикса. Следите, будет интересно. А я постараюсь держать такой темп.
| 2 | Матчасть — проверьте, что осело после статей
Вы читали (ну или пролистывали) разборы про повороты и кватернионы, стрельбу, SDF, толпу, матчмейкинг, лутбоксы и шум. Собственно, давайте проверим, что из этого реально осело в голове, а что прошло мимо.
Сделал квиз — «Матчасть». 8 вопросов, по одному на каждую тему. Вопросы на понимание: зачем вообще нужны кватернионы, что такое hitscan, откуда у стаи скворцов синхрон, чем Glicko отличается от ELO. Где-то ошиблись — подсказка после ответа ведёт прямо в нужный раздел статьи. Так что это и проверка, и способ дочитать то, что пропустили.
Ведёт квиз Дельта, а Магистр Хардкод по ходу подсовывает «костыли» — варианты с магическими числами вместо настоящего ответа, не ведитесь. В конце выдаётся звание: от Магистра Хардкода до самого Дейва. Результатом, конечно же, можно похвастаться.
👉 https://dev-math.ru/dave-quiz/
Делитесь в комментариях, какое звание выбили. | 171 |
| 3 | Гладкая случайность: как функция от координат лепит горы, облака и огонь
https://dev-math.ru/articles/noise/
Прямо в браузере крутятся настоящие GLSL-шейдеры — объёмное облако, которое можно облететь камерой, и живой огонь. А ещё градиенты, октавы, domain warping и шесть интерактивов. Жду огоньков 🔥
Вообще шум довольно забавная тема. Он так тесно связан с компьютерной графикой, VFX и таким огромным спектром задач. Забавно что все "естественное" это по своей сути фрактальные структуры шума. Поэтому многие работали над разными применениями и вариациями этого. Хотя конечно в случае облаков и огне — это скорее "фокус", чем что-то реальное.
Пока я делал интерактивы я удивился, что чтобы их не фризило мне пришлось сделать для облаков пребейк 3д текстур и прочие волюметрические техники. Так как на моём макбуке оно прям лагало. Но ща работает гладко, так что приглашаю ознакомиться.
#мат_геймдев #МатРазбор #procgen #шейдеры | 476 |
| 4 | Перлин пофиксил свой шум в 2001-м. А потом запатентовал фикс
Три поста я рассказывал вам про шум Перлина. Чтож, у него два изъяна.
Первый: его узор тайком выстраивается по осям. Шум считается по сетке-клеточкам, и бугры на нём тянутся
по горизонтали и вертикали, будто прилипли к тетрадному листу. На горах незаметно, а на ровной воде или в анимации глаз уже ловит эту «решётку».
Второй: он дорожает с каждым измерением. 2D-шум — плоская картинка (карта высот). 3D — объём: так в Minecraft режут пещеры. 4D — объём, который ещё и движется во времени (дым, бегущие облака); четвёртая ось — время. А чтобы взять значение, шум перебирает все углы клетки — 2ⁿ штук: 4, 8, 16. Каждое измерение удваивает счёт.
И знаете, кто это починил? Сам Перлин. В 2001-м он выкатил
Simplex-noise, и фикс почти издевательски прост: резать пространство не на квадраты, а на треугольники (в 3D — тетраэдры). Углов у них не 2ⁿ,
а n+1: 3, 4, 5 вместо 4, 8, 16. И «решётка» по осям заодно пропадает.
А что забавно: этот фикс Перлин запатентовал (US 6 867 776). И индустрия годами использовала обходной шум — OpenSimplex (Курт Спенсер, 2014), лишь бы не судиться. Патент истёк только в январе 2022-го — но OpenSimplex уже прижился.
Для рельефа классики хватает с головой. А в 3D, дыме и облаках — цена Перлина
кусается.
#мат_геймдев #МатРазбор #procgen #алгоритmы | 214 |
| 5 | Тизер-трейлер "Приключения Дейва"
Ниче пока не придумал. Включая название. Просто было интересно на сколько сложно будет сделать что я делаю в формате комикса, в формате мультиков, чтобы это можно было выложить в шортсы и вк клипы.
Получился небольшой тизер трейлер по вселенной которая в дальнейшем будет раскрываться в комиксах. По мультфильмам не знаю, учитывая кост одного ролика и того, что делаю я это пока просто на энтузиазме - будем посмотреть. | 221 |
| 6 | Одна октава шума — скучный холм. Горы начинаются со сложения
Шум Перлина из прошлого поста сам по себе — пологие холмы. Ни скал,
ни хребтов, ни мелкой шероховатости. А в природе деталь живёт на
каждом масштабе — это фрактал. Так что шум складывают сам с собой на
разных частотах:
float sum = 0.0, amp = 0.5, freq = 1.0;
for (int i = 0; i < 6; i++) {
sum += amp * noise(p * freq);
freq *= 2.0; // частота ×2 (lacunarity)
amp *= 0.5; // вклад ×0.5 (gain)
}
// sum — это fBm, фрактальный шум
Шесть строк — и «капля» становится правдоподобным хребтом. А подать
шум на вход самому шуму, fbm(p + fbm(p)) — гребни завихряются, и из
той же функции выходят облака, мрамор, лава. Этот приём, domain
warping, — фирменная магия Иниго Килеза (если не слышали — сооснователь
Shadertoy и автор iquilezles.org, «библии» процедурной графики).
Собственно, вся процедурная природа — базовый шум плюс две надстройки:
сложить октавы и исказить координаты. Облака в Horizon Zero Dawn,
рельеф Minecraft, мрамор в текстурах — всё отсюда. Только не берите
мало октав (выйдут «пузыри») и не сэмплите через random на пиксель
(мерцающая каша).
#мат_геймдев #МатРазбор #procgen #шейдеры | 219 |
| 7 | Шум Перлина — это не случайные числа. Это случайные стрелки
Наивная идея «шума»: накидать
в узлы сетки случайные значения
и интерполировать между ними.
Это value noise — и он сразу выдаёт себя: сквозь картинку проступает сетка, всё распадается на квадраты.
Перлин сделал хитрее. В узле лежит не число, а случайное направление — градиент, стрелка.
Значение в точке — это скалярные произведения этих стрелок на векторы «от угла к точке», плавно смешанные специальной кривой:
float n00 = dot(g00, p - c00); // стрелка · смещение
float n10 = dot(g10, p - c10); // ...для всех 4 углов клетки
float n01 = dot(g01, p - c01);
float n11 = dot(g11, p - c11);
vec2 f = fade(fract(p)); // гладкая кривая, НЕ линейная
float n = mix(mix(n00,n10,f.x), mix(n01,n11,f.x), f.y);
В узлах значение строго ноль — оттого ни «пятен» на решётке,
ни швов.
А главное: стрелки не бросаются заново, а считаются хешем от целых координат и сида. Тот же узел при том же сиде — та же стрелка. Всегда. Собственно, поэтому один seed в Minecraft рисует одинаковый мир у всех.
#мат_геймдев #МатРазбор #шейдеры #procgen | 261 |
| 8 | Шум Перлина — это не случайные числа. Это случайные стрелки
Наивная идея «шума»: накидать в узлы сетки случайные значения и
интерполировать между ними. Это value noise — и он сразу выдаёт себя:
сквозь картинку проступает сетка, всё распадается на квадраты.
Перлин сделал хитрее. В узле лежит не число, а случайное направление —
градиент, стрелка. Значение в точке — это скалярные произведения этих
стрелок на векторы «от угла к точке», плавно смешанные специальной
кривой:
float n00 = dot(g00, p - c00); // стрелка · смещение
float n10 = dot(g10, p - c10); // ...для всех 4 углов клетки
float n01 = dot(g01, p - c01);
float n11 = dot(g11, p - c11);
vec2 f = fade(fract(p)); // гладкая кривая, НЕ линейная
float n = mix(mix(n00,n10,f.x), mix(n01,n11,f.x), f.y);
В узлах значение строго ноль — оттого ни «пятен» на решётке, ни швов.
А главное: стрелки не бросаются заново, а считаются хешем от целых
координат и сида. Тот же узел при том же сиде — та же стрелка. Всегда.
Собственно, поэтому один seed в Minecraft рисует одинаковый мир у всех.
#мат_геймдев #МатРазбор #шейдеры #procgen | 1 |
| 9 | Горы, облака и мрамор в играх никто не рисовал — это одна функция
Откройте Minecraft и полетайте над миром. Горы, пещеры, береговые
линии — этого рельефа нет ни в одном файле. Его никто не рисовал и не
сканировал. Это значения функции: подаёте ей координаты точки —
получаете высоту.
Казалось бы, чтобы получить такую «природную» случайность, достаточно
взять random на каждую точку. Ну попробуйте — получите белый шум, ту
самую телевизионную «снежинку». Для ландшафта это мусор: каждая точка
живёт сама по себе, ни холмов, ни долин, один хаос. Фокус,
собственно, не в случайности, а в ГЛАДКОЙ случайности — у соседних
точек значения близкие. Вот из этого и получается логичный рельеф.
Имя у фокуса есть: шум Перлина. Кен Перлин придумал его ещё в 1982-м —
бесился от «пластмассового» вида графики, над которой работал для
«Трона», и захотел управляемую случайность (позже за неё дали
технический «Оскар»). Сегодня на ней стоит половина видимой природы в
играх: рельеф и пещеры Minecraft (тот же seed — тот же мир у всех),
облака в Horizon Zero Dawn, мрамор и огонь в текстурах.
На неделе разберём, как функция от (x, y) превращается в горный
хребет и почему один и тот же seed в Minecraft всегда даёт один и тот
же мир. 🔥
#мат_геймдев #МатРазбор #procgen #шейдеры | 276 |
| 10 | Честно — как статья про дропрейты? | 299 |
| 11 | 没有文字... | 320 |
| 12 | Тема следующей недели? | 320 |
| 13 | Математика невезения: как игры подкручивают случайность, чтобы она ощущалась честной
https://dev-math.ru/articles/lootboxes/
Всю неделю мы разбирали рандом по кусочкам — сегодня забираем всю кухню разом. Внутри вывод констант, пять интерактивов прямо в браузере и цифры, после которых надпись «шанс 1%» читается иначе. Жду 🔥 и репостов друзьям 😆
Игроки читают «1% дропа» как «1 из 100», а random в игре считают честным броском — оба утверждения неверны, и на этом зазоре держатся и фрустрация, и часть монетизации. В статье случайность разобрана как три слоя.
Первый — генератор: LCG в одну строку, детерминизм seed и история pack.png с перебором 2⁴⁸, спектральный тест Кнута и провал RANDU.
Второй — искажение распределения под восприятие: PRD в Dota с численным выводом константы C, pity-системы Genshin и Hearthstone, true hit Fire Emblem, aim assist XCOM и shuffle bag Тетриса.
Третий — экономика дропрейта: геометрическое распределение, 385 против 267 кейсов до ножа CS, кривая 1−(1−p)^N и регулирование лутбоксов от Китая 2017-го до отменённого штрафа EA в Нидерландах. Разработчик получает карту выбора инструмента — голый PRNG, PRD, pity или shuffle bag — и честный список цен, которыми оплачивается каждое сглаживание дисперсии.
#мат_геймдев #МатРазбор #алгоритмы #геймдизайн | 338 |
| 14 | Шанс 50/50 выбить нож в CS стоит 660 $
Шанс ножа в кейсе — 0,26%. Эту цифру Valve не публиковала: сообщество годами восстанавливало её по статистике анбоксингов. В 2017-м Министерство культуры Китая обязало раскрывать вероятности лутбоксов, и таблицу выложил Perfect World — издатель, через которого Valve работает в Китае.
Чтож, посчитаем. Памяти у кейсов нет, попытки независимы: шанс хотя бы одного ножа за N кейсов — 1−(1−0,0026)^N. Сотня кейсов — должно же хватить? Конечно же нет: 23%. Монетка 50/50 набегает только к 267-му кейсу — те самые 660 $ ключами. Уверенные 99% — 1769 кейсов, около 4 400 $.
Ну и моё любимое: остаться без ножа после двух тысяч кейсов вдвое вероятнее, чем выбить его из первого же. Не верите — посчитайте. Пустой кейс — это 99,74%. Возведите в степень 2000: остаётся 0,55%. А нож с первой попытки — те самые 0,26%. Шанс «всё ещё пусто» тает вдвое каждые 266 кейсов и нуля не достигает никогда: из 100 000 человек, открывших по 2000 кейсов, около 550 останутся ни с чем — хотя «в среднем» нож выпадает на 385-м.
И вот что я в этой истории люблю: та же Valve в Dota подкручивает криты в вашу пользу, лишь бы серия промахов не испортила вам вечер. В кейсах серия неудач продаёт ключи, поэтому кейс номер 2000 ничем не отличается от первого. Даже Genshin даёт гарантию на 90-й крутке. Тут — ни на какой.
Шансы при этом честные, жульничать тут и не нужно.
#мат_геймдев #МатРазбор #геймдизайн | 423 |
| 15 | По иконке текстурпаков фанаты вычислили seed мира Minecraft. Через десять лет после скриншота.
pack.png видел каждый: холм, озеро, водопад. Откуда кадр — было неизвестно, пока в 2020-м ютубер SalC1 не спросил об этом вслух. Дальше сообщество устроило расследование.
По облакам и ориентации текстур блоков восстановили ракурс, заодно вычислили способ съёмки: Print Screen и кроп до 512×512. Ключевой факт: рельеф зависит только от нижних 48 бит сида — пространство перебора 2⁴⁸, 281 триллион вариантов. Фильтром стало перемешивание песка с землёй в кадре: сгенерировал кусок мира — сравнил. Подняли распределённый счёт на BOINC, 3700 добровольцев, три дня — seed найден: 3257840388504953787. В этот мир можно зайти и встать в точку, откуда сделан кадр.
Что важно для геймдева: детерминированную генерацию игроки вскрывают реверс инжинирингом. Мод SeedCrackerX вычисляет seed сервера по паре данжей, после чего руды и крепости видны насквозь. Это цена детерминизма — правда, он слишком удобен для разработки, без него не было бы ни сидов, ни RNG-манипуляций в спидранах.
В статье — что у таких генераторов внутри.
#мат_геймдев #МатРазбор #алгоритмы | 354 |
| 16 | По иконке текстурпаков фанаты вычислили seed мира Minecraft. Через десять лет после скриншота.
pack.png видел каждый: холм, озеро, водопад. Откуда кадр — было неизвестно, пока в 2020-м ютубер SalC1 не спросил об этом вслух. Дальше сообщество устроило расследование.
По облакам и ориентации текстур блоков восстановили ракурс, заодно вычислили способ съёмки: Print Screen и кроп до 512×512. Ключевой факт: рельеф зависит только от нижних 48 бит сида — пространство перебора 2⁴⁸, 281 триллион вариантов. Фильтром стало перемешивание песка с землёй в кадре: сгенерировал кусок мира — сравнил. Подняли распределённый счёт на BOINC, 3700 добровольцев, три дня — seed найден: 3257840388504953787. В этот мир можно зайти и встать в точку, откуда сделан кадр.
Что важно для геймдева: детерминированную генерацию игроки вскрывают реверс инжинирингом. Мод SeedCrackerX вычисляет seed сервера по паре данжей, после чего руды и крепости видны насквозь. Это цена детерминизма — правда, он слишком удобен для разработки, без него не было бы ни сидов, ни RNG-манипуляций в спидранах.
В статье — что у таких генераторов внутри.
#мат_геймдев #МатРазбор #алгоритмы | 1 |
| 17 | «Ну сейчас-то повезёт» — это ошибка игрока. А в Dota — фича.
Предмет с «25% крита» на первом ударе критует примерно в 8,5% случаев. Цифра в тултипе не врёт — врёт интуиция о том, как она считается.
В Dota крит — не честная монетка, а система с памятью (pseudo-random distribution). То самое «ну сейчас-то повезёт» здесь буквально зашито в формулу: каждый удар без крита поднимает шанс следующего. Старт ~8,5%, дальше выше, к двенадцатому удару крит гарантирован. В среднем по дистанции выходят те самые 25%.
Зачем так? Честные 25% дают жирный хвост невезения: не критануть восемь раз подряд — это 10% случаев, и встречается оно сплошь и рядом. Каждый такой стрик игрок читает как «игра жульничает». PRD режет именно хвост: дольше без крита — ближе крит. Но за это вы слабее в начале серии — короткие неудачные полосы как раз учащаются. По сути, вы не стали критовать чаще, вы перестали попадать в катастрофические серии. Это обмен дисперсии на предсказуемость, который продаётся как «честность».
В статье — вся кухня: как «случайность» умещается в одну строку кода, почему «1% дропа» это совсем не «1 из 100», и где эта математика правит уже не восприятие, а ваш кошелёк 🙂
#мат_геймдев #МатРазбор #геймдизайн | 392 |
| 18 | Дейв Математик #1. Физика прыжков.
Я решил попробовать сделать комикс. Посмотрим как зайдет. Встречайте Дейв Математик! Олдскульный разработчик игр, который в процессе дебага попадает в свои игровые миры и решает в них проблемы с помощью математики.
Ставьте огоньки, если формат зайдет, поделаю разных комиксов раз в неделю или под вдохновение.
Вообще изначально хотел делать всё в этом нарративе. Так как мне кажется прикольным представлять закулисье игр, как общение с персонажами игр и решением их проблем разработчиком. Может потом из этого можно сделать какую-то маленькую игрушку.
#матразбор #комикс | 477 |
| 19 | Честно — как статья про матчмейкинг? | 484 |
| 20 | Матчмейкинг по-простому: Сигнал и шум
https://dev-math.ru/articles/matchmaking/
В этот раз пост наоборот пораньше, так как много дел на выходных. Одна из самых "математичных" статей получилась. Так как я в целом люблю тервер и статистические процессы, то даже интересно было писать и редактировать. Постарался максимально простым языком объяснить сложные математические понятия. Хотя на самом деле математика всего лишь "язык", который многих пугает, хотя он просто описывает различные процессы.
Главная мысль — на все полвека одна. Истинный скилл это скрытый сигнал, который нельзя
увидеть напрямую. Один матч — шумная однобитная выборка из него. А рейтинг — это фильтр, который оценивает и сам сигнал, и собственную неуверенность в нём. Вся эволюция
ELO → Glicko → TrueSkill ровно про это: как сделать фильтр умнее. ELO — фиксированное
доверие к одному матчу (тот самый K) и логистическая сигмоида, откуда берётся
«400 очков = ×10 шансов». Glicko добавляет второе число RD — адаптивный K, который сам
понимает, про кого мы знаем мало. TrueSkill описывает скилл целым гауссовым колоколом
N(μ, σ) и раздаёт его по команде через factor graph. В финале — кто это крутит в проде: Chess.com и Lichess на Glicko, Rocket
League, Halo на TrueSkill.
Не забываем делиться статьей с друзьями, если она понравится — это помогает развитию канала. Больше подписчиков богам подписчиков. Ну и ставим огоньки естественно. Автор работает за классы :) Я стараюсь в одиночку на пару с клодом делать качественные материалы, и хочется чтобы их увидело как можно больше людей.
Небольшая ремарка. На самом деле такая математика больше про геймдизайн, чем про разработку. Обычно геймдизайнеры подобные системы отдают на интеграцию. Но это геймдизайнеры математического баланса, которые есть не в каждой студии, да и самому быть осведомленным в таких вещах довольно полезно.
#мат_геймдев #МатРазбор #algorithms #matchmaking | 437 |
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
