Как физический движок действительно имитирует физику?

Этот вопрос может быть глупым вопросом, но мне действительно интересно.

После того, как вы играли в игры, такие как HL2, GMod или Angry Bird, и используя библиотеки физики, такие как Box2D, я начал задаваться вопросом , как физический движок имитирует физику?

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

Как физический движок действительно моделирует физику? Какие понятия используются? Есть ли в Интернете "учебник" о том, как сделать физический движок вроде этого, который показывает трассировку лучей?

Ответы

Ответ 1

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

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

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

Ответ 2

В принципе, все физические двигатели являются просто прямым применением второго закона движения Ньютона:

ускорение = сила/масса

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

Основные осложнения возникают из:

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

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

Ответ 3

Как насчет того, чтобы посмотреть источник одного. Это где я начну.

http://www.tokamakphysics.com/