Что такое физический движок?

57

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

user91119
источник
36
Множество терминологических вопросов людям. Не нужно понижать базовые вопросы просто потому, что они основные.
MichaelHouse
16
Описание программы как того, что «должно принимать данные, обрабатывать их и давать результаты», является настолько абсурдно упрощенным и редукционистским способом мышления, что они бесполезны. Подумайте, как бы вы ответили на вопрос «Программа должна принимать входные данные, обрабатывать их и выдавать выходные данные. Итак, что именно игра воспринимает в качестве входных данных и предоставлять в качестве выходных данных?» игра.
Джек Эйдли,
10
@JackAidley Я понимаю вашу точку зрения, но на самом деле игра очень похожа на это: ввод: нажатия клавиш и движения мыши / джойстика, вывод: забавные изображения на экране и забавные звуки из динамиков. Это упрощенно, да, но это помогает понять, что такое «игра» в вычислительном отношении, и, по моему опыту, это также чрезвычайно полезный способ (но, конечно, не единственный) мышления об архитектуре кода, проектировании ресурсов, управлении проектами и т. Д.
WJL

Ответы:

58

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

Входными данными для физического моделирования обычно является набор объектов («тел») со свойствами (например, твердые они или мягкие, их массы, формы и т. Д.), А также набор сил, действующих на эти тела.

Основываясь на этих входных данных, двигатель моделирует обновленные положения и ориентации тел и применяет их («выходные данные»). Обычно, когда объекты сталкиваются или перекрываются, это включается в выходные данные шага моделирования в форме обратного вызова, который клиентский код может подключить для обработки определенной логики игрового процесса, относящейся к столкновению.

Джош
источник
6

Ввод скорости, массы и времени, вывод новых скоростей. Иногда вращение / угловой момент также является входом и выходом.

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

Большинство физических движков в некоторой степени специализированы и будут симулировать физику до уровня, необходимого для игры. Физические движки для автомобильных игр часто сильно отличаются от физических движков для 3D-шутеров. А физический движок игры в гольф может иметь чрезмерные расчеты взаимодействия мяча для гольфа и отдельных листьев травы, в то же время совершенно не обрабатывая столкновения на высокой скорости и деформацию автомобиля (в случае удара по мячу для гольфа) ,

Питер
источник
1
Я хотел бы отметить, что сопротивление воздуха на самом деле является довольно распространенной характеристикой физических двигателей. Любая игра, которая применяет предельную скорость к падающим объектам, моделирует сопротивление воздуха.
Патрик Робертс
@PatrickRoberts Terminal Velocity не совсем то, о чем я думал, когда упоминал сопротивление воздуха. Это все равно что сказать, что у Понга есть физический двигатель, который моделирует кинетические удары.
Питер
12
хорошо, чтобы быть справедливым, в свободном смысле это делает. Он моделирует идеально упругие столкновения в невесомой среде. Я понимаю, что модели могут быть упрощенными, но именно поэтому их называют моделями, потому что они представляют собой практические приближения к явлениям, которые мы испытываем в реальности.
Патрик Робертс
4

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

В частности, физический движок возьмет модель с набором свойств (масса, соединения и т. Д.) И отобразит ее в игре в соответствии с набором параметров.

Ранним примером этого были рэгддолл-движки (например, в Unreal), которые моделировали способ, которым обмякшие тела падают вниз по ступенькам и т. Д.

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

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

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

Крис Джонс
источник
4

Физический движок отвечает за моделирование движения объектов в «мире» (что бы это ни значило в контексте движка). В настоящее время большинство физических движков используют для этого ньютоновскую механику, поскольку они относительно просты для симуляции и «достаточно точны» для большинства целей, если вы не занимаетесь космической симуляцией.

Теоретически, «чистый» физический движок будет принимать три входа:

  • Состояние мира (объекты, их положения и их скорости) по состоянию на последний «тик» (последний момент времени, который должен был смоделировать двигатель)
  • Сколько времени прошло с момента последнего тика
  • Список сил, действующих на различные объекты в мире с момента последнего тика

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

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

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

Какая разница? Даже если в мире больше ничего нет, объект вряд ли будет двигаться точно так же, потому что физический движок будет обрабатывать такие вещи, как реалистичное ускорение. Но также возможно, что другие силы могут действовать на объект одновременно, как и инерция, и двигатель будет учитывать их все . Например, если вы применяете северную силу на объект, но что-то еще применяет западную силу (или объект уже двигался на запад, и ничто не замедляет это), то двигатель переместит объект на северо-запад.

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

Ложка
источник
1

Физический движок - это симулятор физических тел.

вход

Это позволяет вам создавать тело (или несколько), определяя его физические свойства, такие как масса, размер, плотность и т. Д.

Это также позволяет вам определять свойства мира физики, в котором происходит симуляция (например, гравитация).

Наконец, это позволяет вам применять силы или создавать соединения между телами.

Выход

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

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

Где это тело сейчас?

и игровой движок обновляет графическое представление соответственно.

Соображения

Мне обычно нравится видеть Физический Двигатель как инструмент для применения законов физики декларативным способом.

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

Лука Ангелетти
источник
Ваш раздел «соображения» не совсем понятен (для меня). Если вы улучшите это, чтобы сделать его более четким и конкретным / практичным (например, приведите примеры реальных систем, которые вы наблюдали, создали и т. Д.), Тогда я дам вам +1.
code_dredd
@ray: Спасибо за ваше предложение. Я исправлю это как можно скорее!
Лука Анджелетти,
Обязательно напишите мне комментарий после того, как вы закончите, и не торопите его. Это должно быть полезно для других позже.
code_dredd