В "игровом" движке обычно хранятся указатели на все созданные физические тела. Поэтому, при необходимости, можно получить положение тела, например, для обновления графического объекта. Указатели на тела также необходимо сохранить, если их потребуется удалить.
5.2. Определение тела
Перед созданием тела, необходимо заполнить определение тела (b2BodyDef). b2BodyDef можно задать как в качестве локальной переменной, так и в качестве части структуры игровых данных. Выбор за вами.
Box2D копирует определение тела и не хранит указатель на полученное определение. Поэтому одно определение можно использовать для создания нескольких тел. Давайте рассмотрим основные части структуры b2BodyDef.
5.2.1. Масса
Есть несколько способов задания массы тела:
1. Задать значение массы непосредственно в определении тела.
2. Задать значение массы уже для тела, после его создания.
3. Вычислить массу, основываясь на плотности присоединенных фигур.
В большинстве игр имеет смысл вычислять массу, учитывая плотность фигур. Это позволяет проверить, имеют ли тела реалистичную массу.
Однако, иногда может потребоваться конкретное значение массы. Например, в механизме наподобие весов, который требует точные значения масс. Можно вручную установить массу в определении тела:
bodyDef.massData.mass = 2.Of; // масса тела в кг
bodyDef.center.SetZero(); // центр массы в локальных координатах тела bodyDef.I = 3.0f; // момет инерции в кг*мА2
Далее в руководстве будут использованы и другие способы задания массы.
5.2.2. Позицияиугол
Определение тела позволяет указать начальную позицию тела. Это быстрее, чем создавать тело, а затем перемещать его.
Тело имеет два важных параметра. Первый позиция тела. Фигуры и соединения создаются в координатах относительно позиции тела. Второй центр масс. Позиция центра масс определяется исходя из плотности фигур и их формы или непосредственно параметром massData определения тела. Большинство внутренних вычислений Box2D происходит с использованием центра масс. Например, b2Body хранит линейную скорость именно центра массы. При заполнении определения тела, может быть неизвестно, где находится центр масс, поэтому указывается позиция тела. Также можно указать угол поворота тела в радианах, который не зависит от позиции центра масс. Изменение
позиции центра масс не влияет на позицию тела и присоединенные фигуры и соединения.
bodyDef.position.Set(0.Of, 2.Of); // позиция тела bodyDef.angle = 0.25f * b2_pi; // угол поворота тела в радианах
5.2.3. Торможение
Торможение используется,
чтобы уменьшать скорость тел. Оно отличается от трения тем, что трение уменьшает скорость только при касании, а торможение действует постоянно. Таким образом, торможение не заменяет трение и они должны использоваться вместе. Параметр "торможение" должен иметь значение между нулем и бесконечностью, где 0 - отсутствие торможения, а бесконечность полное торможение. Чаще всего используется "торможение" из диапазона 0 0.1. Линейное торможение обычно не используется, т.к. оно делает тела похожими на находящиеся под водой.
bodyDef.linearDamping = O.Of; bodyDef.angularDamping = O.Olf;
При маленьком значении торможения эффект по большей части не зависит от величины временного шага, но при больших значениях будет заметно зависеть. Это не станет проблемой, при использовании фиксированной длины шага (как рекомендуется).
5.2.4. Параметрысна
Для чего нужен сон? Дело в том, что моделирование тел довольно дорогая задача и чем меньше объектов участвует в моделировании, тем лучше. Когда тело переходит в состояние покоя необходимо прекратить для него моделирование.
Когда тело (или группа тел) переходит в состояние покоя, Box2D переводит это тело в состояние сна, которое очень слабо загружает процессор. Если бодрствующее тело касается спящего, то спящее тело просыпается. Тела могут также просыпаться если разрушается соединение или контакт, присоединенный к нему. Также тело можно разбудить вручную.
Определение тела позволяет вам точно определить, может ли тело засыпАть и создается ли тело уже спящим.
bodyDef.allowSleep = true; bodyDef.isSleeping = false;
5.2.5. Снаряды
Игровое моделирование обычно генерирует последовательность изображений-кадров, которые показываются с определенной частотой (Frames Per Second, FPS). В таких условиях твердые тела могут передвигаться на большие расстояния за один шаг
расчетов. Если физический движок не предназначен для расчетов больших передвижений, то можно увидеть как одни объекты проходят сквозь другие. Этот эффект получил название туннельного .
По умолчанию, Box2D использует определение столкновений на протяжении пути (continuous collision detection, CCD) чтобы предохранить динамические объекты от проскакивания сквозь статичные объекты, т.е. от туннельного эффекта. Работает это очень просто: фигуры протягиваются от начальной до конечной позиции. Движок следит, не происходит ли столкновений в процессе перемещения тела между позициями и определяет время столкновения (time of impact,TOI). Тела перемещаются в точки соответствующие их первым TOI и моделирование продолжается до конца временного отрезка. Этот процесс повторяется столько раз, сколько понадобится.