2013-01-07

Знакомство с физическими движками

Давно хотел поразбираться с физическими движками и вот, наконец-то, дошли руки. Все движки похожи друг на дружку, то есть оперируют одинаковыми понятиями - есть физический мир, разные виды тел с физическими характеристиками, соединения, коллизии и прочее. Отличаются API, платформами/языками реализации и возможностями.
Для примера выбрал box2dweb - javascript-клон другого популярного движка.
Начинаем подготовку - подключим на страницу библиотеку и создадим объект canvas, который будет отображать сотворенный нами физический мирок.


В разных примерах и руководствах рекомендуют вынести в переменные из пространств имен, например:
var b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;
делается это для сокращения и упрощения написания кода, а то в серьезном проекте будет много кода, да и сама библиотека немаленькая.
Далее необходимо задать параметры физического мира (Box2D.Dynamics.b2World) и вдохнуть в него жизнь, то есть инициализировать игровой цикл для анимации.
Допустим, мир готов. Но он пуст, в нем есть только бесполезные законы физики - нечему существовать и действовать по этим законам, поэтому нужно создать тела с физическими характеристиками и разнообразным внешним видом и позиционированием.
Как и обычный мир, виртуальный мирок имеет гравитацию (задается в конструкторе мира) и она, естественно, действует на все существующие динамические объекты, то есть все тела в мире самостоятельно без нашего вмешательства падают в направлении вектора силы тяжести. Также, тела взаимодействуют (сталкиваются и отталкиваются) друг с другом и статическими объектами согласно своим физическим параметрам (плотность, трение, упругость и др.).
В некоторых случаях нам необходимо связать между собой тела. В наличии есть несколько простейших типов соединений, которые можно комбинировать, например:
  • DistanceJoint - жесткое соединение.
  • RevoluteJoint - болтовое соединение.
  • PrismaticJoint - призматическое соединение.
  • PulleyJoint - талевое соединение.
  • GearJoint - передаточное соединение.
  • MouseJoint - мышинное соединение.
  • WeldJoint - сварное соединение.
  • FrictionJoint - соединение трения.
  • LineJoint - линейное соединение.
Благодаря движку программисту не приходится реализовывать просчет столкновений с учетом всех сил действующих на тела и получаемых в результате этого импульсов, применяющихся к взаимодействующием телам. Все делается на уровне движка и скрыто от разработчика.
Небольшая демка http://yasla.net/box2d/test.html