889

Зачем нужна математика в компьютерных играх? [часть 1]

Привет-привет.

Почти 200 дней назад я написал комментарий под одним из постов, в котором немножко популярно объяснил, зачем в компьютерных играх (и компьютерной графике вообще) нужна линейная алгебра. Тот самый линал, что любой студент-технарь изучает на 1 курсе универа.


О том, что пост мне пилить лень, я предупредил сразу, но пикабушников это не убедило, у меня прибавилось over 100 подписчиков (с одного коммента-то!), так что почему бы и нет.


Примечание: рассказывать я буду с расчётом на людей, понимающих, что такое матрица, вектор и cross product, но, несмотря на это, постараюсь всё объяснить и расписать понятно даже для гуманитария (в идеале, линал для понимания поста изучать не нужно).


Как говорил Стивен Хокинг, «Любая формула уменьшает количество моих читателей вдвое». Пока, ребят).

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Чуть-чуть школьной геометрии. Что такое вектор? Это стрелка. У неё есть длина и направление. Есть двумерные векторы (у которых направление — от 0 до 360 градусов), есть трёхмерные (у них есть два направления, оба от 0 до 360).

В абстрактной алгебре есть даже бесконечномерные векторы, но это нам не нужно)

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Вот эта красная стрелка — и есть вектор. Линии, обозначенные буквами x, y, z, — называются умным словом координатные прямые.

Давайте запихнём наш вектор в коробку (оранжевые пунктирные прямые) и померяем её длину, ширину и высоту. Эти значения называются координатами вектора. В частности, здесь это (10, 2, 10). [именно в таком порядке, (x, y, z)]


Теперь если мы кому-нибудь скажем «вектор (10, 2, 10)», он сразу сможет его нарисовать, и это окажется в точности тот же вектор.


В школе на геометрии обычно изучают скалярное произведение двух векторов. Вот оно:

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

А ещё его изучают в универе, на линейной алгебре.


А теперь главное: применение! Давайте представим, что мы хотим нарисовать на экране 3D-модель. Любая 3D-модель состоит из треугольников, и, в общем, нарисовать кучу треугольников рандомным цветом — достаточно лёгкая задача.

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Не слишком привлекательно, да? Давайте попробуем сделать нормальные тени.

Нужно узнать, каким цветом заливать каждый треугольник.


Итак, для начала введём вектор, который начинается в центре модели, а заканчивается там, где и будет источник освещения. А именно — вектор (0, 0, 1).


Так получается потому что ось z направлена на нас, а координаты — что-то вроде процентов, например, точка (0, 0, 0.5) — это точка ровно посередине между центром модели (которая, как мы считаем, находится «позади экрана») и экраном компьютера :)


А теперь давайте проведём из каждого треугольника перпендикулярный ему вектор (причём длины 1) и скалярно перемножим с нашим вектором источника освещения.

Это и будет коэффициент освещённости треугольника:

— если 0, то совсем не освещён, рисуем чёрным.

— если 0.5, то освещён наполовину, рисуем серым 50%.

— если 1, то полностью освещён, рисуем белым.

— и тому подобное.


И наша модель обретает жизнь!

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Есть и более продвинутые модели освещения (например, Фонга), про них, возможно, напишу в будущем, но вряд ли.

И небольшое примечание про перпендикулярные векторы.

Перпендикуляр треугольника находится с помощью векторного произведения: берём любые 3 точки треугольника и составляем из них 2 вектора. Векторное умножение выглядит так:

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Как видно, скалярное произведение — число, а векторное произведение — вектор.


Нужно ещё сделать, чтобы перпендикуляр был длиной 1, а это операция нормирования вектора:

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

С кодом модели можно поиграться тут: http://jsfiddle.net/2wvyga24/24/ .

Также можно почитать статьи хабраюзера haqreu: https://habrahabr.ru/post/248153/ .

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Матрицы — это главная причина, по которой всё, что в играх должно вращаться или двигаться, вращается или двигается. И это именно то, как работает Free Transform в фотошопе.


Матрица — это обычная табличка с числами. Их даже можно складывать и умножать.

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост
Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Если сложение — достаточно очевидная вещь, то вот умножение...

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Запоминается простым правилом «строка на столбец». Берём 2 строку первой матрицы и скалярно умножаем на 1 столбец второй. Это и будет элемент, стоящий во 2 строке 1 столбца произведения.

Казалось бы, зачем так усложнять? Почему не умножать обычным образом?


Разгадка проста: изначально матрицы были придуманы, чтобы решать уравнения. Но это мы не будем затрагивать...

Ведь вдруг оказалось, что матричное умножение — это то, что делает матрицы столь полезными для компьютерной графики!

А ещё можно матрицы умножать на векторы. По обычному правилу: по сути, вектор — и есть матрица, просто с одним столбцом (или одной строкой, но это совсем отдельная тема).

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Давайте возьмём плоскость и засунем любую картинку в нулевые координаты (т.е. левый нижний угол квадратика с кексом имеет координаты 0,0).

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Как её теперь повернуть на 45 градусов? Картинка ведь состоит из точек (пикселей), и нужно найти новые координаты для каждой точки. Нужна какая-нибудь формула.


И она есть!


Итак, любая точка с координатами (x, y) — по сути, вектор с координатами (x, y) же. Умножение на матрицу 2×2 — это преобразования пространства (сжатие, поворот и тому подобное).


И поворот выглядит вот так:

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Координаты x', y' — это и есть новые координаты после поворота.

А вот масштабирование (увеличение / уменьшение) — на λ по x и на η по y.

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

И наконец, «cкос», также известный как Skew / Shear. Фотошоперы поймут).

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Поскольку ничего не понятно, вот утащенная из интернета картинка:

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Например, мы повернули картинку на 30 градусов, а затем увеличили в 3 раза по вертикали и в 2 по горизонтали.

Тогда пиксель с координатами (50,30) перейдёт в пиксель с координатами (2, 175):

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Я же ничего не перепутал, да?


Все наши преобразования происходят вокруг начала координат — точки (0, 0). Если мы хотим повернуть картинку вокруг центра, нужно вставлять её так, чтобы центр картинки оказался в точке (0, 0).


Увы, перемещения с помощью матрицы выразить нельзя. Так что был придуман небольшой хак: давайте перейдём к матрицам и векторам 3×3:

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост
Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Все предыдущие преобразования остаются в силе:

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Но теперь мы можем выразить перемещения!

Зачем нужна математика в компьютерных играх? [часть 1] Линейная алгебра, Алгебра, Математика, Игры, Графика, Длиннопост

Ну что ж, теперь несколько хороших моментов:


— Умножение матриц не перестановочно, т.е. обычно A × B ≠ B × A. От перестановки множителей меняется произведение. Например, [переместить на x,y и повернуть на φ] — не то же самое, что [повернуть на φ и переместить на x,y].


— Однако ассоциативно, т.е. (A × B) × C = A × (B × C).


— А значит, перемножение матриц даёт суммарное преобразование. Например: A — поворот, B — перенос, C — масштаб. Тогда матрица A × B × C — это всё сразу. И произведение матрицы (A × B × C) на вектор — это преобразование вектора всеми тремя способами на все те же координаты.


— Обратная матрица — обратное преобразование. Например, поворот на 30 градусов — поворот на -30. Увеличение вдвое — увеличение в 0.5.


И самое важное:

— Всё это переносится практически без изменений в трёхмерное пространство. Векторы и матрицы становятся четырёхмерными (чтобы выражать перемещения), появляется несколько видов поворотов... ну и всё.

P. S. вероятно, следующие посты не будут публиковаться в сообщество.

P. P. S. поскольку мне лень, ждать продолжения бывает долго х)


Вопросы в комментарии :D

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Вы смотрите срез комментариев. Показать все
8
Автор поста оценил этот комментарий

Вау, чувак, наконец-то крутые математические статьи на Пикабу! В универе бы также преподносили инфу, как ты здесь). Всё хотел изучить, как же все эти 3D-преобразования работают, а тут ты разжевал так, как никто другой до тебя! Продолжай в том же духе, подписываюсь)

раскрыть ветку (21)
3
Автор поста оценил этот комментарий

Училась 15 лет назад, предмет назывался, внезапно, "Компьютерная графика" ) Правда, все, написанное автором, заняло бы пару месяцев лекций )

раскрыть ветку (8)
2
Автор поста оценил этот комментарий
У меня в позапрошлом семестре как раз этот предмет был. И как же повезло, что вёл его шикарный препод, который до этого преподавал алгебру и геометрию. Было море полезной инфы, причём отменно изложенной. Этот предмет в итоге и помог мне определиться, чем конкретно я хочу заниматься.
0
Автор поста оценил этот комментарий

Ну не знаю, нам читал зав кафедры, который постоянно был в разъездах и успевал по 2-4 темы за пару. К примеру: 3 афинных преобразования, которые мы выполняли - это одна тема.

0
Автор поста оценил этот комментарий

А у меня это заняло целый семестр почти без теории(. Преподали минимум материала и сказали - пишите прогу. Ну мы и писали как умели(.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий
Аналогично. При чем, писали кто на чем умел )
0
Автор поста оценил этот комментарий

А ты откуда? У нас аналогично все было.

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Воронеж. Но, думаю, так много где).

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Видимо, да.

1
Автор поста оценил этот комментарий

Да даже у меня почти то же)

Всё описанное в посте я узнал ещё будучи школьником, самостоятельно раскапывая по этому инфу.

2
Автор поста оценил этот комментарий

:3 спасибо)

Интересно, что я всё это изучил в школовозрасте, когда писал свою библиотечку для рендеринга. Но там я буквально собирал инфу по частям. Часть этого вообще узнана из исходников чужих библиотек

раскрыть ветку (11)
0
Автор поста оценил этот комментарий

А я в школе только двумерной графикой баловался. Но теперь у меня есть минимальная теоретическая база, чтобы написать свой первый нормальный велосипед в мире 3D). Раньше делал простенькие игрульки, опираясь на гайды, но не понимая, как оно работает. Блин, пожалуйста, не забрасывай это дело, я ещё про шейдеры и многое другое интересное совсем ничего не понимаю! ;)

P.S. гуглил в своё время по этой теме очень много, но либо материал попадался устаревший, либо непонятный такому ламеру как я -_-.

раскрыть ветку (10)
1
DELETED
Автор поста оценил этот комментарий
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Спасибо!)

Автор поста оценил этот комментарий

Ну, собственно, всё описанное в посте я сам и раскопал в школовозрасте). Местами приходилось читать исходники чужих графических библиотек, ибо больше нигде инфы не было.


Какой велосипед ты хочешь? Свою игру? Свой движок? Свой рендер? Свой 3d-редактор?

раскрыть ветку (7)
0
Автор поста оценил этот комментарий

Всё и сразу :D. Ну а вообще, начать с рендера и уже потом потихоньку добраться до движка.

раскрыть ветку (6)
Автор поста оценил этот комментарий

Оу. Неслабо. Я начал с 2D)

В моих постах будет больше введение в разные темы. Например, я не пояснил, почему обратная матрица всегда будет давать обратное преобразование. Для меня это очевидно (следует из ассоциативности умножения матриц, и получится единичная матрица, т.е. тождественное преобразование), и рассказывать об этом просто скучно.

Так что они вроде как не дают полное понимание.


А ещё я не показал ни одной четырёхмерной матрицы, которые используются в 3D.

В общем, я стараюсь сделать так, чтобы человек понял базовые вещи и смог остальное дальше узнавать сам :)


https://dev.opera.com/articles/understanding-the-css-transfo... оставлю эту ссылку здесь. Ну и в целом, гугли по темам и читай больше х)

И побольше размышляй над этим, самое главное.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Ну, как производятся матричные вычисления, я ещё помню, а вот зачем и как применять их - знаю крайне посредственно). Буду изучать тему, ну и твои будущие посты тоже :).

P.S. а разве между 3D и 2D есть какая-то разница кроме дополнительного измерения при вычислениях?

раскрыть ветку (4)
Автор поста оценил этот комментарий

Большее разнообразие поворотов)


Вообще говоря, для 3д больше присущи такие вещи, как освещение, рендеринг и т.п.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий
Ну мне хотя бы геометрию отрисовать для начала). Думаю, это вполне посильная сейчас задача).
раскрыть ветку (2)
Автор поста оценил этот комментарий

Там вот эта ссылка в статье есть:


> Также можно почитать статьи хабраюзера haqreu: https://habrahabr.ru/post/248153/ .


Почитай обязательно, он как раз об этом всём и рассказывает)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Хорошо. Спасибо)
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку