Box2D joints: Weld Joint

Weld — крепкое соединение. Как правило оно не может растягиваться или сжиматься (расстояние между телами стремится быть постоянным), а так же тела не могут поворачиваться относительно друг друга (угол между телами стремиться быть постоянным). Получается жёсткое фиксирование тел относительно друг друга с соединением их в определённой точке.

Я продемонстрирую несколько основных видов объектов с применением данного соединения:

  • прикрепление обычного динамического тела к мировому телу;
  • скрепление 2-х тел (квадратов);
  • шестерёнка или её подобие;
  • упругая антенна — интересный болтающийся объект.

Вот как это выглядит

Контролы: P — скрыть\показать профайлер; R — пересоздать сцену; LMB — таскать объекты мышью.

 

Полный код примера

Всё самое важное и новое для нас находится в функции createObjs(), в ней создаются все объекты и соединения.

На данном этапе нужно хорошо понять 2 вещи: относительность точки соединения и угла соединения.

На Рисунке 1 представлена наглядность для понимания координат точки соединения localAnchor.

Box2D local coordinates joint anchor
Рис. 1. Локальные координаты точки соединения

Теперь разберёмся с углом соединения referenceAngle. Если мы укажем угол соединения следующим образом:

то угол между телами станет = 30 градусов. Т.е. если первое тело будет статично (как в случае соединения мира и тела «a» в примере), то второе тело будет повернуто по часовой стрелке на 30 градусов.

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

На Рисунке 2 схематично отображено соединение с углами 45, -135, 270 градусов.

box2d joints referenceAngle
Рис. 2. Зависимость поворота тел от referenceAngle
Скачать исходники примера