0% нашли этот документ полезным (0 голосов)
24 просмотров147 страниц

Gamedev Math

Документ обсуждает важность математики в разработке игр, подчеркивая, что она необходима на всех этапах, включая программирование логики, создание графического движка и анимацию. Рассматриваются ключевые концепции, такие как плавное перемещение персонажа с использованием easing функций и процедурная генерация контента с помощью шумов. Автор, Никита Лисица, делится своим опытом работы в Яндекс Картах и преподавания компьютерной графики.

Загружено:

pulp noir
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
24 просмотров147 страниц

Gamedev Math

Документ обсуждает важность математики в разработке игр, подчеркивая, что она необходима на всех этапах, включая программирование логики, создание графического движка и анимацию. Рассматриваются ключевые концепции, такие как плавное перемещение персонажа с использованием easing функций и процедурная генерация контента с помощью шумов. Автор, Никита Лисица, делится своим опытом работы в Яндекс Картах и преподавания компьютерной графики.

Загружено:

pulp noir
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd

Я просто хотел писать игры

Неожиданная математика в разработке игр

Никита Лисица
2024

1 / 65
Обо мне

• Работаю в Яндекс Картах

2 / 65
Обо мне

• Работаю в Яндекс Картах


• Веду два спецкурса о комьютерной графике на факультете
МКН в СПбГУ

2 / 65
Обо мне

• Работаю в Яндекс Картах


• Веду два спецкурса о комьютерной графике на факультете
МКН в СПбГУ
• В свободное время делаю инди-игры на собственном движке

2 / 65
Яндекс.Карты

3 / 65
Курс о real-time графике

4 / 65
Курс о трассировке лучей

5 / 65
Инди-игры

6 / 65
Инди-игры

7 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок
• Физика

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок
• Физика
• Аудио

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок
• Физика
• Аудио
• Создание контента (моделей, текстур, анимаций, эффектов)

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок
• Физика
• Аудио
• Создание контента (моделей, текстур, анимаций, эффектов)
• Гейм-дизайн

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок
• Физика
• Аудио
• Создание контента (моделей, текстур, анимаций, эффектов)
• Гейм-дизайн
• ...и многое другое

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок
• Физика
• Аудио
• Создание контента (моделей, текстур, анимаций, эффектов)
• Гейм-дизайн
• ...и многое другое

Где здесь нужна математика?

8 / 65
Из чего состоят игры?

Разработка игр – очень сложный, мультидисциплинарный вид


деятельности:

• Программирование логики
• Графический движок
• Физика
• Аудио
• Создание контента (моделей, текстур, анимаций, эффектов)
• Гейм-дизайн
• ...и многое другое

Где здесь нужна математика? Практически везде!

8 / 65
Перемещение персонажа

9 / 65
Перемещение персонажа

• Игрок нажал клавишу влево/вправо/вверх/вниз – что нужно


сделать в коде игры?

10 / 65
Перемещение персонажа

• Игрок нажал клавишу влево/вправо/вверх/вниз – что нужно


сделать в коде игры?
• Сдвинуть положение персонажа на какой-то вектор!

10 / 65
Перемещение персонажа

• Игрок нажал клавишу влево/вправо/вверх/вниз – что нужно


сделать в коде игры?
• Сдвинуть положение персонажа на какой-то вектор!
• position1 = position0 + move

10 / 65
Перемещение персонажа

• Игрок нажал клавишу влево/вправо/вверх/вниз – что нужно


сделать в коде игры?
• Сдвинуть положение персонажа на какой-то вектор!
• position1 = position0 + move
• Например, для перемещения влево move = (−1, 0)

10 / 65
Перемещение персонажа

• Игрок нажал клавишу влево/вправо/вверх/вниз – что нужно


сделать в коде игры?
• Сдвинуть положение персонажа на какой-то вектор!
• position1 = position0 + move
• Например, для перемещения влево move = (−1, 0)
• Персонаж резко переместится в другое место – это
некрасиво!

10 / 65
Плавное перемещение персонажа

• Сделаем перемещение анимированным!

11 / 65
Плавное перемещение персонажа

• Сделаем перемещение анимированным!


• Анимация – зависимость чего-либо от времени, часто в виде
явно заданной функции

11 / 65
Плавное перемещение персонажа

• Сделаем перемещение анимированным!


• Анимация – зависимость чего-либо от времени, часто в виде
явно заданной функции
• position(t) = position0 + δ(t) · move, где

δ : [0, 1] → [0, 1]
δ(0) = 0
δ(1) = 1

11 / 65
Плавное перемещение персонажа

• Сделаем перемещение анимированным!


• Анимация – зависимость чего-либо от времени, часто в виде
явно заданной функции
• position(t) = position0 + δ(t) · move, где

δ : [0, 1] → [0, 1]
δ(0) = 0
δ(1) = 1

• Такие функции δ обычно называют easing функциями

11 / 65
Easing функции

• δ(t) = t – движение с постоянной скоростью

12 / 65
Easing функции

• δ(t) = t – движение с постоянной скоростью


• δ(t) = t2 – движение с постепенным ускорением,
начинающееся плавно и резко заканчивающееся

12 / 65
Easing функции

• δ(t) = t – движение с постоянной скоростью


• δ(t) = t2 – движение с постепенным ускорением,
начинающееся плавно и резко заканчивающееся
• δ(t) = 1 − (1 − t)2 – движение с постепенным замедлением,
начинающееся резко и плавно заканчивающееся

12 / 65
Easing функции

• δ(t) = t – движение с постоянной скоростью


• δ(t) = t2 – движение с постепенным ускорением,
начинающееся плавно и резко заканчивающееся
• δ(t) = 1 − (1 − t)2 – движение с постепенным замедлением,
начинающееся резко и плавно заканчивающееся
• δ(t) = 3t2 − 2t3 – движение, начинающееся и
заканчивающееся плавно (smoothstep)

12 / 65
Smoothstep

13 / 65
Smoothstep

• Smoothstep – s(t) = 3t2 − 2t3 – очень важная функция!

14 / 65
Smoothstep

• Smoothstep – s(t) = 3t2 − 2t3 – очень важная функция!


• Настолько важная, что она встроена во все языки шейдеров,
и про неё есть отдельная статья на википедии

14 / 65
Smoothstep

• Smoothstep – s(t) = 3t2 − 2t3 – очень важная функция!


• Настолько важная, что она встроена во все языки шейдеров,
и про неё есть отдельная статья на википедии
• Это многочлен минимальной степени, удовлетворяющий
условиям

s(0) = 0 s(1) = 1 s0 (0) = 0 s0 (1) = 0

14 / 65
Smoothstep

• Smoothstep – s(t) = 3t2 − 2t3 – очень важная функция!


• Настолько важная, что она встроена во все языки шейдеров,
и про неё есть отдельная статья на википедии
• Это многочлен минимальной степени, удовлетворяющий
условиям

s(0) = 0 s(1) = 1 s0 (0) = 0 s0 (1) = 0

• Эта функция часто используется для анимаций и


сглаживания

14 / 65
Генерация мира

15 / 65
Генерация мира

• Многие современные игры используют процедурную


генерацию контента (PCG), в том числе для генерации
всего игрового мира

16 / 65
Генерация мира

• Многие современные игры используют процедурную


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

16 / 65
Генерация мира

• Многие современные игры используют процедурную


генерацию контента (PCG), в том числе для генерации
всего игрового мира
• Есть много подходов к генерации мира, но грубо их можно
разделить на два: глобальный и локальный
• В глобальном подходе генерируется сразу весь мир –
например, целый остров с горами, реками, и поселениями

16 / 65
Генерация мира

• Многие современные игры используют процедурную


генерацию контента (PCG), в том числе для генерации
всего игрового мира
• Есть много подходов к генерации мира, но грубо их можно
разделить на два: глобальный и локальный
• В глобальном подходе генерируется сразу весь мир –
например, целый остров с горами, реками, и поселениями
• В локальном подходе мир генерируется постепенно, и
различные его участки могут генерироваться независимо
друг от друга

16 / 65
Генерация мира

• Многие современные игры используют процедурную


генерацию контента (PCG), в том числе для генерации
всего игрового мира
• Есть много подходов к генерации мира, но грубо их можно
разделить на два: глобальный и локальный
• В глобальном подходе генерируется сразу весь мир –
например, целый остров с горами, реками, и поселениями
• В локальном подходе мир генерируется постепенно, и
различные его участки могут генерироваться независимо
друг от друга
• Для игр с очень большим миром предпочтительнее
локальный подход

16 / 65
Генерация мира

17 / 65
Генерация мира

• Итак, мы хотим сгенерировать небольшой кусочек нашего


мира

18 / 65
Генерация мира

• Итак, мы хотим сгенерировать небольшой кусочек нашего


мира
• Для простоты будем считать, что мы хотим только
сгенерировать высоту ландшафта в каждой точке, т.е. карту
высот

18 / 65
Генерация мира

• Итак, мы хотим сгенерировать небольшой кусочек нашего


мира
• Для простоты будем считать, что мы хотим только
сгенерировать высоту ландшафта в каждой точке, т.е. карту
высот
• Для этого нам нужен шум

18 / 65
Шум

19 / 65
Шум

• В игровой индустрии шумом называют любую функцию,


выглядящую случайной

20 / 65
Шум

• В игровой индустрии шумом называют любую функцию,


выглядящую случайной
• Часто, эта функция задана не для непрерывного аргумента, а
на дискретной сетке

20 / 65
Шум

• В игровой индустрии шумом называют любую функцию,


выглядящую случайной
• Часто, эта функция задана не для непрерывного аргумента, а
на дискретной сетке
• Белый шум – шум, значения которого в разных ячейках сетки
никак не зависят друг от друга

20 / 65
Шум

• В игровой индустрии шумом называют любую функцию,


выглядящую случайной
• Часто, эта функция задана не для непрерывного аргумента, а
на дискретной сетке
• Белый шум – шум, значения которого в разных ячейках сетки
никак не зависят друг от друга
• Такой шум плохо подходит для карты высот!

20 / 65
Карта высот на основе белого шума

21 / 65
Гладкий шум

• Нам нужен какой-нибудь непрерывный шум – плавно


меняющаяся, но всё ещё случайная функция

22 / 65
Гладкий шум

• Нам нужен какой-нибудь непрерывный шум – плавно


меняющаяся, но всё ещё случайная функция
• Один из самых распространённых алгоритмов для этого
называется шумом Перлина (по фамилии его изобретателя,
Кена Перлина)

22 / 65
Гладкий шум

• Этот алгоритм генерирует случайные единичные векторы в


вершинах квадратной сетки

23 / 65
Гладкий шум

• Этот алгоритм генерирует случайные единичные векторы в


вершинах квадратной сетки
• Для получения значения шума в некоторой точке, алгоритм
вычисляет скалярные произведения этих векторов с
векторами из точки в вершины сетки, и затем интерполирует
их

23 / 65
Шум Перлина: векторы

24 / 65
Шум Перлина: скалярные произведения

25 / 65
Шум Перлина

• Получив четыре скалярных произведения d1 , . . . , d4 из


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

26 / 65
Шум Перлина

• Получив четыре скалярных произведения d1 , . . . , d4 из


ближайших вершин сетки, алгоритм интерполирует между
ними, используя координаты в ячейке сетки как
коэффициенты интерполяции
• Если точка в квадрате (ячейке сетки) имеет координаты
x, y ∈ [0, 1], то значение шума алгоритм вычисляет с помощью
билинейной интерполяции

x · y · d1 + (1 − x) · y · d2 + x · (1 − y) · d3 + (1 − x) · (1 − y) · d4

26 / 65
Шум Перлина: билинейная интерполяция

27 / 65
Шум Перлина

• У полученного шума явно видна исходная сетка, и он мало


пригоден для использования

28 / 65
Шум Перлина

• У полученного шума явно видна исходная сетка, и он мало


пригоден для использования
• На помощь приходит уже известная нам функция
smoothstep: нужно просто применить её к коэффициентам
интерполяции!

28 / 65
Шум Перлина

• У полученного шума явно видна исходная сетка, и он мало


пригоден для использования
• На помощь приходит уже известная нам функция
smoothstep: нужно просто применить её к коэффициентам
интерполяции!

x ← 3x2 − 2x3
y ← 3y 2 − 2y 3

28 / 65
Шум Перлина

29 / 65
Фрактальный шум

• Такой шум лучше, чем белый шум, но он всё ещё слишком


плавный

30 / 65
Фрактальный шум

• Такой шум лучше, чем белый шум, но он всё ещё слишком


плавный
• Обычно для генерации ландшафта смешивают несколько
слоёв такого шума с разными размерами сетки

30 / 65
Фрактальный шум

• Такой шум лучше, чем белый шум, но он всё ещё слишком


плавный
• Обычно для генерации ландшафта смешивают несколько
слоёв такого шума с разными размерами сетки
• Получающийся шум называют фрактальным шумом

30 / 65
Фрактальный шум

31 / 65
Фрактальный шум

• Значение шума можно взять в качестве высоты ландшафта в


точке

32 / 65
Фрактальный шум

• Значение шума можно взять в качестве высоты ландшафта в


точке
• На основе шума, или комбанации нескольких слоёв шума,
можно построить карты температуры, количества осадков, и
т.п.

32 / 65
Карта на основе фрактального шума

33 / 65
Рассчёт освещения

• Сейчас наша карта выглядит плоской

34 / 65
Рассчёт освещения

• Сейчас наша карта выглядит плоской


• Чтобы передать её трёхмерность, нужно применить к ней
освещение

34 / 65
Рассчёт освещения

• Сейчас наша карта выглядит плоской


• Чтобы передать её трёхмерность, нужно применить к ней
освещение
• Чтобы вычислить освещённость поверхности, нужно знать,
насколько сильно она повёрнута в сторону света

34 / 65
Рассчёт освещения

• Сейчас наша карта выглядит плоской


• Чтобы передать её трёхмерность, нужно применить к ней
освещение
• Чтобы вычислить освещённость поверхности, нужно знать,
насколько сильно она повёрнута в сторону света
• За это отвечает вектор нормали n – перпендикуляр к
поверхности объекта

34 / 65
Нормаль

35 / 65
Вычисление нормали

• Для поверхности, заданной своей функцией высоты от точки


z(x, y) вектор нормали вычисляется на основе частных
производных

36 / 65
Вычисление нормали

• Для поверхности, заданной своей функцией высоты от точки


z(x, y) вектор нормали вычисляется на основе частных
производных  
∂z
− ∂x ∂z
, − ∂y ,1
n= r  2
∂z 2
1 + ∂x ∂z

+ ∂y

36 / 65
Вычисление нормали

• Для поверхности, заданной своей функцией высоты от точки


z(x, y) вектор нормали вычисляется на основе частных
производных  
∂z
− ∂x ∂z
, − ∂y ,1
n= r  2
∂z 2
1 + ∂x ∂z

+ ∂y

• Значит, нам нужно посчитать производную от шума Перлина!

36 / 65
Частные производные

37 / 65
Карта нормалей

38 / 65
Нормаль к шуму Перлина

• Снова явно видна исходная сетка, по которой строился шум,


но почему?

39 / 65
Нормаль к шуму Перлина

• Снова явно видна исходная сетка, по которой строился шум,


но почему?
• Изначально мы видели сетку из-за того, что функция шума
была непрерывной, но не была непрерывной её
производная

39 / 65
Нормаль к шуму Перлина

• Снова явно видна исходная сетка, по которой строился шум,


но почему?
• Изначально мы видели сетку из-за того, что функция шума
была непрерывной, но не была непрерывной её
производная
• Человеческий глаз очень хорошо видит разрывы в первой
производной :)

39 / 65
Разрыв в производной

40 / 65
Разрыв в производной

41 / 65
Нормаль к шуму Перлина

• Мы избавились от видимой сетки, применив функцию


smoothstep, у которой производные на концах отрезка [0, 1]
равны нулю

42 / 65
Нормаль к шуму Перлина

• Мы избавились от видимой сетки, применив функцию


smoothstep, у которой производные на концах отрезка [0, 1]
равны нулю
• Освещение зависит от вектора нормали, а вектор нормали
зависит от производной нашей функции

42 / 65
Нормаль к шуму Перлина

• Мы избавились от видимой сетки, применив функцию


smoothstep, у которой производные на концах отрезка [0, 1]
равны нулю
• Освещение зависит от вектора нормали, а вектор нормали
зависит от производной нашей функции
• Значит, чтобы убрать видимую сетку на нормалях, нужно
сделать непрерывной вторую производную!

42 / 65
Нормаль к шуму Перлина

• Мы избавились от видимой сетки, применив функцию


smoothstep, у которой производные на концах отрезка [0, 1]
равны нулю
• Освещение зависит от вектора нормали, а вектор нормали
зависит от производной нашей функции
• Значит, чтобы убрать видимую сетку на нормалях, нужно
сделать непрерывной вторую производную!
• Для этого есть функция smootherstep: s(x) = 6x5 − 15x4 + 10x3

42 / 65
Плавные нормали

43 / 65
Карта с освещением

44 / 65
Ландшафт на основе фрактального шума

45 / 65
Физический движок

46 / 65
Физический движок

• Задача физического движка – симулировать физические


взаимодействия между объектами

47 / 65
Физический движок

• Задача физического движка – симулировать физические


взаимодействия между объектами
• Например, движение твёрдого тела описывается
приложенными к нему силами F и уравнением Ньютона
F = ma

47 / 65
Физический движок

• Задача физического движка – симулировать физические


взаимодействия между объектами
• Например, движение твёрдого тела описывается
приложенными к нему силами F и уравнением Ньютона
F = ma
• Ускорение – это вторая производная от положения объекта
d2
dt2 q

47 / 65
Физический движок

• Задача физического движка – симулировать физические


взаимодействия между объектами
• Например, движение твёрдого тела описывается
приложенными к нему силами F и уравнением Ньютона
F = ma
• Ускорение – это вторая производная от положения объекта
d2
dt2 q
• Физическому движку нужно решать дифференциальное
уравнение!

47 / 65
Физический движок

• Задача физического движка – симулировать физические


взаимодействия между объектами
• Например, движение твёрдого тела описывается
приложенными к нему силами F и уравнением Ньютона
F = ma
• Ускорение – это вторая производная от положения объекта
d2
dt2 q
• Физическому движку нужно решать дифференциальное
уравнение!
d2 F
2
q=
dt m

47 / 65
Физический движок

• Обычно силы, приложенные к объектам, зависят от действий


игрока

48 / 65
Физический движок

• Обычно силы, приложенные к объектам, зависят от действий


игрока
• Обычно объектов в мире довольно много

48 / 65
Физический движок

• Обычно силы, приложенные к объектам, зависят от действий


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

48 / 65
Физический движок

• Есть много разных методов численного решения уравнений


движения: явный и неявный методы Эйлера,
симплектический метод Эйлера, методы Рунге-Кутты, и т.д.

49 / 65
Физический движок

• Есть много разных методов численного решения уравнений


движения: явный и неявный методы Эйлера,
симплектический метод Эйлера, методы Рунге-Кутты, и т.д.
• Например, симплектический метод Эйлера выглядит так:
F
v1 = v0 + · ∆t
m
p1 = p0 + v1 · ∆t

49 / 65
Физический движок

• Есть много разных методов численного решения уравнений


движения: явный и неявный методы Эйлера,
симплектический метод Эйлера, методы Рунге-Кутты, и т.д.
• Например, симплектический метод Эйлера выглядит так:
F
v1 = v0 + · ∆t
m
p1 = p0 + v1 · ∆t

• Он прост в реализации и хорошо сохраняет энергию


физической системы

49 / 65
Методы решения уравнений движения

50 / 65
Вращения

• Хочется, чтобы объекты не только двигались, но и


вращались!

51 / 65
Вращения

• Хочется, чтобы объекты не только двигались, но и


вращались!
• Как описать вращение объекта?

51 / 65
Вращения

• Хочется, чтобы объекты не только двигались, но и


вращались!
• Как описать вращение объекта?
• В 2D это сделать несложно: вращение можно описать одним
углом поворота

51 / 65
Вращения

• Хочется, чтобы объекты не только двигались, но и


вращались!
• Как описать вращение объекта?
• В 2D это сделать несложно: вращение можно описать одним
углом поворота
• В 3D всё становится куда веселее!

51 / 65
Трёхмерные вращения

52 / 65
Трёхмерные вращения

• Можно описать трёхмерное вращения тремя углами Эйлера

53 / 65
Трёхмерные вращения

• Можно описать трёхмерное вращения тремя углами Эйлера


• С этими углами очень неудобно работать!

53 / 65
Трёхмерные вращения

• Можно описать трёхмерное вращения тремя углами Эйлера


• С этими углами очень неудобно работать!
• Можно описать вращение матрицей 3 × 3

53 / 65
Трёхмерные вращения

• Можно описать трёхмерное вращения тремя углами Эйлера


• С этими углами очень неудобно работать!
• Можно описать вращение матрицей 3 × 3
• С матрицами очень удобно работать, но они крайне
избыточны (нужно запомнить 9 значений вместо 3), и не
любая матрица является вращением

53 / 65
Кватернионы

• Решение – кватернионы!

54 / 65
Кватернионы

• Решение – кватернионы!
• Кватернионы – это четвёрки вещественных чисел (x, y, z, w) с
покомпонентным сложением и хитрым, некоммутативным
законом умножения

54 / 65
Кватернионы

• Решение – кватернионы!
• Кватернионы – это четвёрки вещественных чисел (x, y, z, w) с
покомпонентным сложением и хитрым, некоммутативным
законом умножения
• Что-то вроде четырёхмерных комлексных чисел

54 / 65
Кватернионы

• Решение – кватернионы!
• Кватернионы – это четвёрки вещественных чисел (x, y, z, w) с
покомпонентным сложением и хитрым, некоммутативным
законом умножения
• Что-то вроде четырёхмерных комлексных чисел
• Очень интересный и важный математический объект

54 / 65
Кватернионы

• Через кватернионы можно выразить любое вращение


трёхмерного вектора v с помощью некоторого кватерниона q
и формулы
v 7→ q · v · q−1

55 / 65
Кватернионы

• Через кватернионы можно выразить любое вращение


трёхмерного вектора v с помощью некоторого кватерниона q
и формулы
v 7→ q · v · q−1

• Абсолютно все игровые движки используют кватернионы!

55 / 65
Распространение света

• Основная задача компьютерной графики – описать и


смоделировать распространение света

56 / 65
Распространение света

• Основная задача компьютерной графики – описать и


смоделировать распространение света
• Свет взаимодействует с объектами по очень сложным
законам

56 / 65
Распространение света

• Основная задача компьютерной графики – описать и


смоделировать распространение света
• Свет взаимодействует с объектами по очень сложным
законам
• В общем случае свет, выходящий из какой-то точки объекта в
каком-то направлении, складывается из света, пришедшего
из всех возможных направлений!

56 / 65
Распространение света

• Основная задача компьютерной графики – описать и


смоделировать распространение света
• Свет взаимодействует с объектами по очень сложным
законам
• В общем случае свет, выходящий из какой-то точки объекта в
каком-то направлении, складывается из света, пришедшего
из всех возможных направлений!
• Чтобы это смоделировать, нужно использовать
интегральный уравнения

56 / 65
Распространение света

57 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

58 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

• Iout – количество света, выходящего из точки

58 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

• Iout – количество света, выходящего из точки


• Ie – количество излучаемого света

58 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

• Iout – количество света, выходящего из точки


• Ie – количество излучаемого света
• Iin – количество света, приходящего в точку

58 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

• Iout – количество света, выходящего из точки


• Ie – количество излучаемого света
• Iin – количество света, приходящего в точку
• f – функция, описывающая материал объекта

58 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

59 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

• Описывает многие визуальные эффекты: тени, отражение,


преломление, рассеяние света

59 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

• Описывает многие визуальные эффекты: тени, отражение,


преломление, рассеяние света
• Очень сложно решать!

59 / 65
Уравнение рендеринга

Z
Iout (p, ω
~ out , λ) = Ie (p, ω
~ out , λ)+ Iin (p, ω
~ in , λ)·f (p, ω
~ in , ω ωin · ~n)d~
~ out , λ)·(~ ωin
S2

• Описывает многие визуальные эффекты: тени, отражение,


преломление, рассеяние света
• Очень сложно решать!
• Один из моих курсов целиком про это уравнение :)

59 / 65
Уравнение рендеринга

60 / 65
Уравнение объёмного рендеринга

• Обычное уравнение рендеринга описывает только


взаимодействие света с поверхностью объектов

61 / 65
Уравнение объёмного рендеринга

• Обычное уравнение рендеринга описывает только


взаимодействие света с поверхностью объектов
• Многие эффекты требуют взаимодействия света с объёмом:
туман, лучи света в пыльной комнате, и даже цвет самого
неба

61 / 65
Уравнение объёмного рендеринга

• Обычное уравнение рендеринга описывает только


взаимодействие света с поверхностью объектов
• Многие эффекты требуют взаимодействия света с объёмом:
туман, лучи света в пыльной комнате, и даже цвет самого
неба
• Для этого нужно ещё более сложное уравнение объёмного
рендеринга!

61 / 65
Уравнение объёмного рендеринга

ZL
 

I(p + Lω, ω) = I(p, ω) exp − ka (p + tω)dt +


0
ZL ZL
 

+ ke (p + tω) exp − ka (p + sω)ds dt


0 t

62 / 65
Уравнение объёмного рендеринга

• Часто используется в медицине – например, для


визуализации МРТ-обследований

63 / 65
Уравнение объёмного рендеринга

• Часто используется в медицине – например, для


визуализации МРТ-обследований
• Используется в играх для ‘объёмных’ лучей света, тумана,
облаков, или для реалистичного неба

63 / 65
Лучи света

64 / 65
Небо

65 / 65

Вам также может понравиться