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"

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

По-моему, для гуманитариев это местами выглядит как "как нарисовать сову?", но мне реально лень объяснять некоторые вещи, уж сорри :)

Иллюстрация к комментарию
показать ответы
54
Автор поста оценил этот комментарий

Это звучит как

Гуманитариям здесь делать нечего.
раскрыть ветку (1)
8
Автор поста оценил этот комментарий

Я с самого начала искренне хотел и пытался сделать пост таким, чтобы гуманитарии, внезапно заинтересовавшиеся темой, всё поняли. Про векторы, думаю, получилось. Про матрицы — не знаю.


Пост вроде бы небольшой, но я на него убил несколько часов, некоторые предложения переписывал по нескольку раз и т.д.

Такое нужно писать по частям, каждый раз на свежую голову, но я однажды так потерял пост. (сохранение в черновики работает не очень хорошо)

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

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

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

Да, к сожалению.

Я выкинул немалую часть поста. Например, про то, как матричное умножение связано с линейными уравнениями.

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


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

Кому не нужно, — прочитали, "ух ты, интересно", и забыли.)

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

Прекрасный пост, автор, закинь краба.

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

Держи)

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

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

Откуда берется вектор освещения?

Про удаление невидимых граней не думали запилить?

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

На самом деле фактор "поумнения" тоже достаточно важен. Попробуешь прослушать один и тот же математический курс дважды (скажем, банальный матан за 1 семестр), будешь очень удивлён, сколько пропустил в первый раз. У меня был такой опыт)


Вектор освещения — это то, куда мы хотим засунуть источник света. Я взял (0, 0, 1) — это, когда он находится "у нас в руках" (если считать, что вид от первого лица).

Можно взять (0, 0, -1) — источник света будет наоборот, сзади модели. Можно (1, 0, 0) — будет сверху или слева (не помню точно).


http://jsfiddle.net/2wvyga24/24/

в строчке 228 этот вектор. Попробуй поменять, кнопку Run, и посмотреть, что там.


Невидимые грани удаляются элементарно: если коэффициент освещенности (скалярное произведение вектора освещения на нормаль треугольника) меньше 0, то грань не рисуется.

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

Я не об этом.

Рендер сцены — математика.
Скрипты — математика.
Всякие сглаживания — математика.
Работа с сервером — математика.

И так можно продолжать до бесконечности.

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

Я бы поспорил)

Какой-нибудь скрипт открывания двери — не очень математика.


Работа с сервером — математика.

Обычно используются готовые API, которые не очень требуют знаний математики.


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

Пост посвящён именно этому.

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

Сделали упор на "молодой человек", будто хотели себя возвысить надо мной : /


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

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

Ну я пока загорелся этой темой, так что есть шанс, что в ближайшее время будет что-нибудь ещё)

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

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


Хорошо, я попробую в следующих постах объяснять, откуда что берётся.)

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

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

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

:3 спасибо)

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

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

Добрый день, очень крутой пост! Мы получается своего рода коллеги, я делаю видеоигры, в которых преподаю математику)

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

Классно!

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

В универе буду рассказывать о пользе математики и её применении в играх. Спасибо больше!

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

Удачи)

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

Привет дружище, скажи, можно ли использовать твои материалы отсюда в своей презентации по применению математики в играх? Не полностью конечно, но частями

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

А что за презентация? Если что-то открытое, дашь ссылку?

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

Прошу прощения за долгий ответ, мы разбирались в причинах произошедшего. Похоже сбой произошел в момент высокой нагрузки, когда мы подвергались DDOS-атакам. Попробовали еще раз – все должно работать.

Проверьте, пожалуйста, все ли корректно?

https://new.pikabu.ru/profile/Sciberia

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

Ураа. Спасибо огромное :)

Всё работает, всё ок.


Ого о.о даже не знали, что был DDoS.

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

Добавил автора в черный список

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

Пока-пока)

1
Автор поста оценил этот комментарий
Прочитал.
Возник вопрос.
Треугольник имеет два единичных вектора нормаля. Соответственно будет два скалярных произведения: + и - или оба 0. Как понимаю, берётся модуль скалярного произведения.
Тогда возникает вопрос. Как освещается задняя часть головы?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Да, да, я забыл осветить этот момент.


Берётся не модуль, нет. Если у грани получается нулевое или отрицательное скалярное произведение, — значит, она не освещена совсем. То есть, рисовать её не нужно. Таким образом, задняя часть головы не рисуется вообще.


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


Вектора нормали два, действительно. Я просто беру векторное произведение векторов AB и AC (пусть у нас треугольник ABC), считаю, что итоговый вектор нормали направлен правильно, и рисую.

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

показать ответы
Автор поста оценил этот комментарий
Я сюда деградировать захожу. Зачем мне тут высшая математика и алгебра?:)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Я знал, что будет такой коммент)

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

ты случаем не тот парень с хабра, который рассказывал как написать OpenGL своими руками?

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

Не-а)

Но я ссылаюсь на его серию статей (как раз перед матрицами). И модель взял, понятно, именно оттуда.

Пример на jsfiddle написал сам :)

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

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

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

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

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

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

Спасибо )

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

Пожалуйста )

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

Отлично )

Ага, к сожалению, нас часто ддосят, но вроде справляемся.

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

Ну вы держитесь )


Есть вроде сервисы типа Cloudflare, которые заботятся о DDoS сами.

И осторожно с memcached: https://xakep.ru/2018/03/02/github-memcached-ddos/

Вряд ли вы не знаете, но вдруг :)

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

Добрый день!

Конечно, с радостью поможем. Но у нас нет таких полномочий.
Вы не могли бы написать на support@pikabu.ru с почты, которая указана в настройках аккаунта virtpoint?

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

Доброе утро!

Простите, что пингую, мы перевели один крутейший материал, и публикуем его сегодня. И краайне важно опубликовать его с аккаунта с исправленным именем.


Можете нам что-нибудь посоветовать? Ещё раз написать в саппорт? Ещё раз позвать админа? Что-нибудь другое?..

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

Добрый день!

Конечно, с радостью поможем. Но у нас нет таких полномочий.
Вы не могли бы написать на support@pikabu.ru с почты, которая указана в настройках аккаунта virtpoint?

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

Здравствуйте! Ура-ура, спасибо :)


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


Первый ответ — "Да, ваш ник изменён", но вместо этого появился новый чистый акк с ником Sciberia (прикреплённый к G+ соотв. почты).

Второй ответ — что ничего перенести или переименовать не могут, а акк зарегистрировали мы сами.


Сам человек, который регистрировал аккаунт, и которому, соответственно, принадлежит почта, говорит, что ничего не регистрировал.


В общем, мы совсем запутались, и не понимаем, что делать :)

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

@admin, добрый день, не могли бы вы нам помочь?


Мы тут возродили умерший было Курсомир и продолжаем переводить (из-за трудностей юридического характера пришлось взять новое название).


Но автор первого поста по ошибке назвал общий аккаунт своим ником.

Поскольку и раньше случалось, что пикабушникам меняли ники по их просьбе, — можно ли переименовать аккаунт?


https://pikabu.ru/profile/virtpoint — в Sciberia (сейчас есть акк с ником Sciberia, но он тоже наш — плохо синхронизировались, в итоге два аккаунта, и посты / подписчики не на том, на котором нужно).

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

Этого, а Эль видимо сейчас бухой)


https://pikabu.ru/story/interesnyie_pikabushniki_i_skolko_u_... => ctrl+f => Keyten

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

o.o

Спасибо)

0
Автор поста оценил этот комментарий
А, я не ответил? забыл.
Хз про какой список ты говоришь
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Океей, спасибо. Может, у тебя тогда есть мысли, кого ещё на Пикабу могут называть "Эль"?


Вот отсюда #comment_95362113


@MartinDont, ты этого Эля называл Элем или какого-то другого Эля?)

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

@L4rever, привет.


Тут птичка на хвосте принесла, что у тебя есть список, в который попал мой (этот, в котором я пишу) пост. Мне стало интересно, можно посмотреть?)

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

@L4rever, (*с надеждой*) ты же ответишь, да?

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

@L4rever, привет.


Тут птичка на хвосте принесла, что у тебя есть список, в который попал мой (этот, в котором я пишу) пост. Мне стало интересно, можно посмотреть?)

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

А, я подумал, что это твоя статья https://habrahabr.ru/post/248153/

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

Да, я так и думал)


Нет, этот чувак вообще во Франции, вроде, преподаёт. Я его упоминал в посте.

Нет, это не я. Но пост частично основан на его статье, да.

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

Автор, а вот из статьи на хабре я понял, что ты обучаешь студентов. Где, если не секрет?

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

Нет, это не так)


А из какой статьи, если не секрет?

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

Ну тем-более)) Получается я даже это не правильно понял.

Как уже говорил, что приболел на долго в пятом классе как раз когда и начались уравнения и векторы и все. Сейчас занимаюсь геймдевом фактически без знания математики) Шейдер написать без каких то примеров, статей весьма трудно.

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

Есть куча книжек по математике для геймдева, с самых основ идут
0
Автор поста оценил этот комментарий
Не разбираюсь, "по-другому никак" -  это потому что при традиционных поворотах (pitch yaw roll) может тупик получиться при некоторых условиях или что-то такое? (смутные воспоминания)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, примерно такая проблема.)

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

Ну я пока загорелся этой темой, так что есть шанс, что в ближайшее время будет что-нибудь ещё

(на самом деле нет)

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

Да, так, пожалуй, вернее)

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

Что бы задать правильный вопрос - нужно знать бОльшую часть ответа. Если я совершенно не в теме - то и вопрос я задать никакой не могу =)

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

Покажи первое, что непонятно)

показать ответы
0
Автор поста оценил этот комментарий
А реально применимость этих знаний тому, кто занимается графикой? Кто откоывал хоть раз 3D редакторы меня поймет. Может я не сильно углублялся и поэтому не использовал вектора при рисовании 3D объектов, но никакого ввода матриц и работы с векторами небыло. Всё что вы говорили реализовано в програмном коде. Напрямую художник не работает с матрицами, он просто жмет "повернуть на". С таким же успехом можно рассказать зачем художнику знание электроники и т.д и т.п.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я рассказал, как это устроено внутри 2D или 3D-редактора.

Приоткрыл завесу тайны, можно сказать :)


Художнику это не нужно, верно. Программисту — вполне. Например, чтобы понимать, откуда берутся некоторые баги, и как их исправить.

Кроме того, векторы-матрицы нередко встречаются в движках. Вместо кучи функций типа rotateObject / scaleObject / translateObject — одна-единственная функция transformObject, принимающая матрицу.


Я сам, лично в коде CryEngine, чтобы повернуть камеру, использовал кватернионы. Потому что по-другому никак. Про кватернионы тут ничего нет, это будет во 2 части.

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

Ну вообще-то нет.

Векторное умножение не коммутативно. Для двух разных порядков векторов результатом их векторного умножения будет 2 противоположных друг другу вектора. Так что порядок вершин в треугольнике важен. Если его выбрать неправильно, то все освещение станет работать наоборот: тени станут освещенными, а освещенные участки - тенями.

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

Да. В общем, мне пора спать, потому что я уже ничего не соображаю)

0
Автор поста оценил этот комментарий
По моей памяти, векторное произведения поменяет направление (знак), если поменять местами множетели (поправьте, если не прав). Тогда, если я поменяю местами точки B и C, поменяются местами и множетели. Следовательно изменится и направление результата.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Оу. Да, точно, оно антикоммутативно. Я и забыл.


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


P. S. может быть, в obj-файле (файл с моделью) точки специально в таком порядке, чтобы вектор нормали получался правильный.

К слову, в файлах с моделями нормали тоже пишутся. Но конкретно тут мы их вычисляем на лету, а не читаем из файла.

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

Абстрактная алгебра — тоже хорошая штука :)

Но в компьютерной графике действительно не очень применима.

0
Автор поста оценил этот комментарий
Глаза режет, что вектор нарисован в левой тройке осей. В играх и движках не шарю, действительно левая тройка используется?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ох, сорри, не обратил внимание. Обычно мне тоже левая тройка режет глаза)


От перехода от правой тройки к левой меняется знак в некоторых формулах, и всё. Так что использовать левую или правую — в движках, как и везде, — дело вкуса.

Думаю, используется правая.

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

Начал бы с описания физики движений, гравитации там, силы трения, ускорения, использующихся в играх, зачем сразу муть про вектора загонять :Р

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

Физика и рендеринг — малость разные вещи)

Я про рендеринг и рисование рассказывал.

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

>Зачем нужна математика в компьютерных играх?
Можно было сказать, что компьютерная логика не на магии работает.

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

Не, ну это немного другое)


Лично я с матлогикой познакомился лет в 14, изучая программирование.

показать ответы
16
Автор поста оценил этот комментарий
Спасибо, матрицы не особо понял, но вот вектора объяснили замечательно)
Я так понимаю, больше не стоит подобных постов от вас ждать?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Слово "часть 1" в заголовке намекает, что продолжение будет.

Как я уже выше написал, после векторов кончились силы, так что матрицы объяснить настолько наглядно, насколько хотел, не смог.

показать ответы
5
Автор поста оценил этот комментарий
почему.... ПОЧЕМУ?!!! мы говорим о точностях, матаматиках всяких,А СТРЕЛКА КРИВАЯ?!!! НУ ПОЧЕМУ, ОНА КРИВАЯ ТО?!!
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Какая стрелка кривая? о.О

показать ответы
9
DELETED
Автор поста оценил этот комментарий
Отличный пост, спасибо!
объяснял бы так СанСаныч на линале был бы я отличником
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Пожалуйста :D

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

Почему во всех уроках/статьях для новичков используются не человеко-понятные выражения, а выражения из учебников, которые не разобрать если например в пятом классе приболел на продолжительное время? Например в разделе про векторы:

norm[(a,b,c)] = (....

Примерно понимаю, но не до конца и в итоге получается нельзя вникнуть в написанное до конца. Эта статья для "новичков" получается уже не для новичков...


Лучше было бы если эти уравнения из учебников в дополнение переводили в более привычный вид типа:

(a,b,c) * (d,e,f)
это
a * d
b * e
c * f

И смотря на уравнение из учебника и на уравнение переведенное в человеко-подобный вид сразу начинаешь понимать суть происходящего.


Но это почему то никто не учитывает. :)

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

Не-а, не так.

(a, b, c) — это единый объект. Тройка трёх чисел.

(d, e, f) — тоже.


Если их перемножить, получим число. Оно считается по формуле ad+be+cf.

То есть,


(a, b, c) * (d, e, f) = ad + be + cf.

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

Откуда мы знаем, что значит 1? Часть первая? Часть одна? Или часть единственная? (в духе математики вопрос:D)

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

"Откуда мы знаем, что под 1 ты имеешь в виду то же, что и мы?" :D

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

Говори, что непонятно, а я буду переводить)

4
Автор поста оценил этот комментарий
здесь я понял что я гуманитарий 😔
раскрыть ветку (1)
Автор поста оценил этот комментарий

Рассказывай, что непонятно?)

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

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


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


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

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

Это все замечательно, но компьютерные игры состоят не только из одной графики. Хотелось бы узнать, где ещё используется математика в компьютерных играх, помимо графики.

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

Физика? ИИ?

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

Да, такой рендеринг называется Global Illumination )

https://ru.wikipedia.org/wiki/Глобальное_освещение


Может быть, о подробностях освещения я и запилю как-нибудь пост, но нескоро.

0
Автор поста оценил этот комментарий
Спасибо, но теперь появился следующий вопрос))
Я не понял, почему у всех треугольников нормаль ориентирован одинаково.
То есть, как именно выбирается какая вершина A, какая B, а какаяC, так что у всех треугольников нормаль ориентирован одинаково?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Как угодно. Векторное произведение, если ничего не путаю, получится одним и тем же для разных выборов A, B, C)

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

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

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

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

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


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

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

Попробую спросить по другому: есть самолет, у него углы yaw pitch roll( по осям z, y, x к примеру ), самолет имеет уже какие то углы, как поворачивать этот самолет по углам как на картинке?

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

Ах да!

По-моему, здесь нужны кватернионы. Как раз то, о чём я собирался рассказать в следующем посте. Но, т.к. он может быть нескоро, то вкратце: кватернион — это как комплексное число, только в 2 раза хуже.

Если комплексное число — это a+bi с условием i^2 = -1, то кватернион — это a+bi+cj+dk с условием i^2 = j^2 = k^2 = ijk = -1.


Отсюда выводится сложение и умножение кватернионов. Если лень, то всё гуглится :)


Далее. Поворот на угол (a,b,c) представляется как кватернион i*cos a + j*cos b + k*cos c. Перемножение двух таких кватернионов даёт суммарный поворот.


Вот как-то так.


Извини, если снова что-то неправильно понял: очень устал за сегодня, ничего не соображаю)

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

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

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

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

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


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

показать ответы
0
Автор поста оценил этот комментарий
Можно с вами связаться?
раскрыть ветку (1)
Автор поста оценил этот комментарий

Можно прям тут)

А вообще говоря... ikeyten (собака) gmail.com

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

Да, у меня вечно проблемы с определением вектора. Представляю отрезком, не привязанным к началу координат, и постоянно зависаю. Благодарю.

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

Просто воспринимайте вектор как матрицу из одного столбца )

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

Это скрин из какой-то программы, его рисовал не я)

Я просто нагуглил, т.к. уже было лень что-либо рисовать

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

Попрощаться зашёл.

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

Эх. Пока)

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

До меня наконец дошло, что я изучал в школе, и как оно вообще применяется на практике! Спасибо, ты сделал мою жизнь чуточку легче)

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

Ты изучал матрицы в школе? Прикольно)

Или ты про скалярное произведение?

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

Да я даже фразу "скалярно умножаем" не понял =(

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

Посмотри, там картинка есть.


А потом формула сразу после этой фразы:

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

На эту серию в посте даже ссылка есть.


По разным причинам.

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

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

Кроме того, есть те, кто углубляться не хочет, а хочет понять какие-нибудь простые базовые вещи ("в геймдеве нужно матричное умножение?! зачем? оО"), им этого поста будет достаточно, читать же ту серию ради не нужных на практике знаний бессмысленно :)


Меня об этом посте ранее просили в комментариях. Мне тут много раз сказали спасибо. Значит, есть смысл у этого поста.

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

Отличное объяснение. Большое спасибо, т.к. появилось интуитивное понимание операций с матрицами.
Было бы круто, если бы ты объяснил на примере с картинками, сингулярное разложение матрицы (SVD).
Спасибо.

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

Ух блин)

http://translate.kursomir.ru/book/53 я тут курс MIT по линейной алгебре перевожу, там такое будет. Но я пока о нём впервые слышу, если честно.

показать ответы
0
Автор поста оценил этот комментарий
Так и не дочитал. Слишком много формул.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Так ты не читай формулы, читай текст)

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

>"Скрипты" - понятие растяжимое, но в любом случае, большая их часть из математики не требуют ничего сложнее умножения.
Серьезно? Во всех шутерах есть скрипты отвечающие за визуальный контакт с игроком. Как пример скайрим, где если надеть нпс ведро на голову, он тебя не увидит. В стратегиях вообще какие-то неебические алгоритмы просчета ходов.


>Про работу с сервером вообще смешно.
@Keyten,

Пацаны, а вы знаете, что такое client-side prediction?

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

Знаем)

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

Давал бы ссылку на хабр откуда негра стащил.  https://habrahabr.ru/post/248153/

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

Эта ссылка есть, прямо перед матрицами :)

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

мне кажется, куда проще было бы запилить пост "зачем НЕ нужна математика в геймдеве")

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

Запили)

Я бы почитал

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

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

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

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

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

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


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

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


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

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

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

Про матрицы понятно, но у меня вопрос: у меня есть датчик( акселлерометр+гироскоп ) и я хочу сделать инерциальный захват движений. На входе ускорения по трем осям и угловые по трем, каждый кадр я должен эти значения добавлять к координатам( в зависимости от углов ) и к углам. Как это сделать?

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

Я не разбираюсь в гироскопах, вот от слова "совсем".

Само собой напрашивается умножать ускорения на дельту по времени и на косинусы (или синусы) углов. Но я тебе лучше советую погуглить

показать ответы
0
Автор поста оценил этот комментарий
Объяснение норм:) Но векторные пространства та не объяснишь :/
раскрыть ветку (1)
Автор поста оценил этот комментарий

Пф. Запросто)