Лекция 7. Игровая физика

 

Оглавление

Введение. 1

Теория. 2

Кинематика твердого тела. 2

Ориентация тела в пространстве. 3

Последовательность действий для физического моделирования: 4

Collision detection. 4

Collision response. 5

Логическая реакция. 6

Трение. 6

Физика автомобиля в рейсингах. 7

Физические движки. 7

Open Dynamics Engine - ODE. 8

RenderWare Physics. 8

Havok 2.0. 9

Заключение. 10

 

Введение

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

 

В простых играх физические законы реализуется без особых изысков.

Например: 
if(пуля_попала_в_стул)развалить_стул();
или  
if(ракета_попала в танк)if(--жизнь_танка == 0)уничтожить_танк();

 

В современных коммерческих играх идет борьба за реалистичность физики.

Хочется процитировать одного из наиболее одиозных теоретиков современного игростроенияКранКа:

Я считаю, что физика сегодня значительно отстает от графики, а ведь именно она гораздо ближе к тому, что мы называем gameplay. Но причина такого отставания вполне объяснима. Современные ЭВМ до безобразия слабы. Пока что основные усилия создания иллюзорных миров сконцентрированы на обмане зрительных и слуховых органов. Это и понятно - начинать надо именно с подачи информации на внешние человеческие рецепторы. Тем более что задачу упрощает тот факт, что в один времени можно ограничиться визуализацией лишь маааленького кусочка моделируемой вселенной – так по счастью устроена физическая реальность наших тел: пространство и время не дают нам воспринимать внешний мир по другому.

 

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

Иногда можно услышать термин «Аркадный режим». Конечно, он не имеет ничего общего с аркадой, как игровым жанром. Просто с целью повышения играбельности некоторые физические законы не соблюдаются. Например, машина становится более устойчивой, лучше входит в поворот и т.п.

 

Гоночные симуляторы и гонки на машинах разные вещи :)

К первым относятся F1,NFS, а ко вторым Самогонки и вроде как

HoverRace.

В первых главная и единственная цель пройти трассу быстрее чем

остальные, а во вторых это не главная и не единственная цель.

Поэтому в первых играх - ничего кроме дороги не отвлекает, и любое

не соответствие с физическими законами сразу же бросается в глаза,

падает интерес. А во вторых играх - помимо дороги есть разнообразные

занятия, которые отвлекают и реальная физика будет больше напрягать,

чем радовать, следствие - падение интереса.

 

Тем не менее, ограниченное быстродействие ЭВМ не является преградой для создания интересных игр.

Например, первая игра, в которую я играл - Лунолет. Она работала на программируемом калькуляторе. Тем, кто не знаком с этим технологическим чудом 20-летней давности, я сообщаю, что в нем было 15 ячеек памяти для хранения переменных и около 100 - для команд.

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

Затем в процессе игры в числовом виде вводилось: delta T, расход топлива и вектор тяги. После выполнения вычислений по весьма приближенным формулам, выдавалось новое значение позиции.

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

Но играть было интересно.

Теория

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

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

Кинематика твердого тела

Зависимость позиции (r), скорости (v) и ускорения (a).

 (1)

Зависимость силы (F), линейного момента (p), массы и ускорения.

 (2)

Расчет Центра Массы.

 (3)

Общий линейный момент равен моменту Центра Массы

 (4)

Общая сила равна произведению центра массы на ускорение

 (5)

Ориентация тела в пространстве

 

Зависимость ориентации (W), угловой скорости(w) и углового ускорения (a)

 

 (6)

 

 

 

 С = Wr

Расчет скорости в точке B для вращающегося твердого тела.

 (7)

Зависимость линейной скорости от угловой.

 (8)

 

 

Угловой момент – аналог уравнения (2)

Сила вращения – крутящий момент.

(9)

 

Угловой аналог уравнения (3) для ЦМ:

(10)

Момент инерции получается применением уравнения (7) к уравнению (10).

(11)

И наконец, получаем связь между общим крутящим моментом и моментом инерции:

(12)

 

Последовательность действий для физического моделирования:

  1. Вычислить ЦМ и момент инерции ЦМ.
  2. Установить для объекта начальное положение, ориентацию, линейную скорость и угловую скорость.
  3. Определить все силы, действующие на объект.
  4. Суммировать все силы и разделить на массу для определения линейного ускорения ЦМ. (5)
  5. Для каждой силы вычислить векторное произведение из ЦМ в точку приложения силы. Полученный результат добавляется в общий крутящий момент ЦМ (9)
  6. Разделить общий крутящий момент на момент инерции ЦМ для вычисления углового ускорения.
  7. Числовое интегрирование линейного ускорения и углового ускорения для обновления позиции, линейной скорости, ориентации и линейного ускорения.
  8. Нарисовать объекты в новых позициях и перейти к шагу 3.

Collision detection

Это задача скорее геометрическая, чем физическая.

Обычно тела представляются в виде каких-то очень простых фигур. Самый простой случай – сфера. Чтобы зафиксировать пересечение сфер достаточно найти расстояния между их центрами. Если меньше, чем сумма радиусов – значит сферы пересеклись. Это самый быстрый способ проверки.

Поэтому сферой часто описываются объекты, форма которых не похожа на сферу. Например, в  одной из игр мы представили «физического» человека, как две сферы. Что-то вроде снеговика. И это вполне нормально работало.

Но есть объекты, которые невозможно представить сферой. Например, земная поверхность, по которой ходит персонаж. Поэтому задачи, решаемые collision detection, обычно делятся на множество случаев контакта одних типов фигур с другими. Но, как правило, для описания физического объема не применяется та геометрия, которая используется для рендеринга. Гораздо эффективнее использовать специальную геометрию с минимальным количеством полигонов.

Collision response

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

 

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

Относительная скорость столкновения.

 

Для получения относительной нормальной скорости используем вектор нормали, полученный в результате collision detection

Поведение тел после столкновения во многом зависит от их материала. Для описания свойств упругости введем коэффициент упругости:

(13)

Коэффициент упругости может меняться от 1 (супер мяч) до 0 (клей, пролитый на пол).

Сначала рассмотрим столкновение тел без вращения.

Зависимость конечной скорости от начальной с учетом ЦМ и импульса:

       (14)

Импульс рассчитывается так:

(15)

 

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

(16),

из чего следует

 и . (17)

Таким образом, импульс рассчитывается по такой формуле:

(18)

Ну и в завершении краткого обзора теории рассмотрим псевдокод физического моделирования

Определить начальные условия

while(simulating) {

    DeltaTime = CurrentTime - LastTime

    while(LastTime < CurrentTime) {

      рассчитать все силы и моменты

      вычислить линейное и угловое ускорение

      интегрировать ускорение и скорость через DeltaTime

      if(объекты перекрылись друг с другом) {

        уменьшить в 2 раза DeltaTime

      } else {

        if(объекты соприкоснулись) {

           Обработать столкновение по уравнениям (17) и (18)

        }

        LastTime = LastTime + DeltaTime

        DeltaTime = CurrentTime - LastTime

        Обновить позиции и скорости

      }

    }

    Нарисовать объекты в новых позициях.

}

Логическая реакция

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

Или если мяч попадает в стекло, то оно должно разбиться. Естественно, разбивание стекла – это отдельная задача. Обычно она решается без применения физических методов. Просто осколки разлетаются по случайным траекториям. Но факт попадания мяча в стекло – это задача collision detection. А вот реакция программируется отдельно для данного специфичного случая.

Обычно это реализуется путем отсылки сообщений из физической части программы в логику. А в логической реализации того или иного объекта определяется его поведение в случае того или иного физического воздействия.

Трение

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

 

Физика автомобиля в рейсингах

Кроме изложенной выше теории, мне хотелось бы отдельно остановиться на моделировании движения автомобиля.

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

Так как подробное изложение могло бы занять целую лекцию, то я приведу только ряд иллюстраций из статьи Vehicle Dynamics for Racing Games By Ted Zuvich.

Система координат

Наиболее значимые силы, действующие на автомобиль.

Распределение веса в статическом состоянии

Распределение веса в наклонном положении

 

 

 

 

 

Физические движки

Обобщая все вышеизложенное, можно заключить, что реализация игровой физики – сложная и рутинная задача.

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

Open Dynamics Engine - ODE

Библиотека с открытым исходным кодом для высокопроизводительного моделирования динамики твердых тел. Реализована на C/C++. Является наиболее популярным инструментом для реализации физики в небольших игровых проектах.

http://ode.org/

Вот отзыв одного из тех, кто использовал ODE в своем игровом проекте:

«После 2-х недель вникания в код ODE и экспериментов удалось
сделать на нем отличную физику для автомобиля с подвеской, тормозами,
антироллбарами, трансмиссией и реальными контактами с дорогой.
Все интегрируется неявно и поэтому работает очень стабильно.
Конечно, сразу скажу, что было не очень легко, но вообще библиотека
довольно грамотная и главное есть открытый код - без него бы ничего не получилось, потому что пришлось писать свои специализированные joint-ы для оптимизации.
Чтобы что-то серьезное на ODE писать, нужно конечно вникать в нее и
знать довольно глубоко принципы физического моделирования

 

RenderWare Physics

RenderWare Physics 3.7 – это система для быстрого, реалистичного и мультиплатформенного физического моделирования, которое может быть использования для создания игр различных жанров.

 

 

RenderWare Physics оперирует твердыми телами.

 

Кроме того, можно описать различные зависимости между отдельными частями.

Так же в движке довольно удачно решаются вопросы collision detection.

Havok 2.0

Это SDK для быстрого моделирования физики в реальном времени. Нашел применение в более чем 50 играх самых разных жанров: шутеры, рейсинги и спортивные игры.

Движок используется на различных платформах: ПК, X-Box, Sony PlayStation II и Nintendo GameCube.

Он позволяет создать 3D мир, назначить физические свойства объектам, пошагово моделировать изменение мира во времени и получать результаты моделирования.

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

Havok работает примерно так:

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

2.      В Havok 2 все объекты делятся на независимые группы, называемые островами. Это необходимо для повышения производительности, т.к. моделирование небольших групп объектов меньше загружает процессор и требует меньше памяти.

3.      Каждый объект может выполнять определенные действия.

4.      На объекты действует гравитация или какие-то другие силы, определенные в игре. Кроме того, учитываются заданные взаимосвязи между объектами.

5.      Система твердых тел не допускает проникновения их друг в друга. Ошибки, допущенные при разделении объектов, разрешаются путем перемещения объектов.

6.      Интегрирование вычисляет новое состояние движения (позиция, ориентация, скорость, ускорение) для каждого объекта.

7.      Каждый объект, который больше не участвует в физическом моделировании, должен быть деактивирован.

Заключение

Итак, мы кратко рассмотрели теоретические аспекты игровой физики и современные средства ее реализации.

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

 



Используются технологии uCoz