Game Physics Presentation.pptx
- Количество слайдов: 30
Физика в играх Общие принципы физических движков
Задача физ. движков На входе: • • • Набор тел, заданных геометрией, положением и некоторыми физическими величинами, определяющих их движение и взаимодействие Параметры среды: гравитация, вязкость Набор соединений тел На выходе: • • Положение тел после временного промежутка Информация об их взаимодействии(коллизии) Ключевые условия: • • • Правдоподобность поведения тел при движении и взаимодействии Исключение взаимопроникновения Корректное поведение соединений тел
Способы реализации Физика частиц Физика твердого тела
Физика частиц Частица Связь
Частица Предыдущая позиция (last_pos) delta Параметры: ● Позиция (pos) ● Предыдущая позиция (last_pos) ● Вес Интегрирование Верле: delta = pos - last_pos = pos + delta Позиция (pos)
Связи Параметры: ● Пара соединяемых частиц ● Целевое расстояние между частицами ● Относительная жесткость Решение связи: . . . Закон Гука? F = k * delta. Length
В чем фишка? Не все так просто
Фундаментальная проблема компьютерной физики Необходимость разрешения нескольких ограничений (связей) одновременно Ограничения: расстояние AC = L 1 расстояние CB = L 2 C L 1 A L 2 B
Фундаментальная проблема компьютерной физики C L 1 A L 2 _L 1 _L 2 B
Фундаментальная проблема компьютерной физики Решение - система уравнений: sqrt((C’ + x) - A) = L 1 sqrt((C’ + x) - B) = L 2 Метод Гаусса Якоби, -Зейделя A*x=B C X L 1 A L 2 C’ L 1’ L 2’ B
Фундаментальная проблема компьютерной физики Итерационное приближение решения. Методы Якоби и Гаусса-Зейделя сводятся к последовательному решению ограничений A B
Связи Параметры: ● Пара соединяемых частиц ● Целевое расстояние между частицами ● Относительная жесткость X 1 restlength Решение связи: deltalength X 2 delta = x 2 -x 1; deltalength = sqrt(delta*delta); diff = (deltalength-restlength)/deltalength; x 1 += delta*0. 5*diff; x 2 -= delta*0. 5*diff;
Обработка столкновений
Обработка столкновений
Обработка столкновений
Плюсы и минусы метода Плюсы: ● Простота ● Скорость ● Стабильность ● Мягкие тела, ткани Минусы: ● Сложность задания тел ● Неточность ● Невозможно работать с непостоянным временным промежутком
Физика твердого тела • • В основе закон сохранения импульса Тела несжимаемы
Параметры тел ● ● ● ● Позиция Поворот Линейная скорость Угловая скорость Масса Тензор инерции Геометрия Материал
Итерация работы движка Интегрировани е Поиск контактов Разрешение контактов
Интегрирование ● ● ● ● ● Позиция (position) Поворот (rotation) Линейная скорость (lin_velocity) Угловая скорость (ang_velocity) Масса (mass) Тензор инерции (inertia) Геометрия Материал Сумма действующих сил (force) Сумма действующих моментов (torque) lin_velocity = lin_velocity + force / mass * delta. Time ang_velocity = ang_velocity + torque / inertia * delta. Time position = position + lin_velocity * delta. Time rotation = rotation + ang_velocity * delta. Time
Поиск столкновений Параметры контакта: N H P ● ● N P P H N H P - точка контакта N - нормаль контакта H - глубина контакта Пара тел Поиск контактов ● Широкая фаза (AABB, . . . ) ● Узкая фаза (SAT, GJK, . . . )
Разрешение контактов Начальное условие: тела взаимодействуют в точке контакта вдоль нормали, после применения импульса перестают сближаться Скорость тел в точке контакта: (A) rel_a_velocity = A. velocity + (contact_point - A. position) ^ A. ang_velocity (B) rel_b_velocity = B. velocity + (contact_point - B. position) ^ B. ang_velocity A B Относительная скорость тел в точке контакта rel_velocity = rel_a_velocity - rel_b_velocity Проекция скоростей proj_velocity = rel_velocity * contact_normal = 0
Разрешение контактов Проекция скоростей равна 0. Прикладываем к телам импульс в точке контакта вдоль нормали с некой амплитудой lamda. необходимо найти lamda. n 1 = contact_normal w 1 = (contact_normal ^ (contact_point - A. position)) n 2 = - contact_normal w 2 = - (contact_normal ^ (contact_point - B. position)) A B a = n 1 * A. lin_velocity + n 2 * B. lin_velocity + w 1 * A. ang_velocity + w 2 * B. ang_velocity b = (n 1 * n 1 / A. mass) + w 1 * w 1 / A. inertia + (n 2 * n 2 / B. mass) + w 2 * w 2 / B. inertia lamda = -a / b lamda = -(1 + bounce) * a / b
Разрешение контактов Применение импульса к телам contact_point, contact_normal, contact_depth, lamda velocity += contact_norm * lambda / mass ang_velocity += ((contact_norm*lamda) ^ (contact_point - position)) / inertia A B
Разрешение контактов Тела перестают сближаться (отлетают друг от друга). Необходимо устранить взаимопроникновение тел. proj_velocity = 0 lamda = -a / b proj_velocity >= - bounce * a A B lamda = -(1 + bounce) * a / b proj_velocity >= - bounce * a + contact_depth * ERP lamda = ( a - (1 + bounce) + contact_depth * ERP) / b
Разрешение контактов Псевдоскорости. Обычная скорость + мгновенная скорость. Мгновенная скорость обнуляется при шаге интегрирования. Уравнение для обычной скорости: proj_velocity >= - bounce * a lamda = -(1 + bounce) * a / b A B Уравнение для мгновенной скорости: proj_velocity >= contact_depth * ERP lamda = ( contact_depth * ERP - a ) / b
И все? ? ? Нет
Усовершенствование алгоритма “Горячий старт” (Warmstarting) - улучшает сходимость системы. Без “Warmstarting”: C “Warmstarting”: lamda = compute. Lamda() if (lamda > 0) Apply. Impulse(lamda) Apply. Impulse(accumulated. Impulse) lamda = Compute. Lamda() accumulated. Impulse += lamda if (accumulated. Impulse < 0) { lamda -= accumulated. Impulse = 0 }
Плюсы и минусы метода Плюсы: ● Скорость ● Стабильность ● Точность ● Управление временным промежутком Минусы: ● Сложность ● Большая чувствительность к корректности контактов ● Сложность реализации
The end Спасибо!
Game Physics Presentation.pptx