Обычно CCD не используется для расчетов столкновений между динамичным телами. Это сделано чтобы сохранить разумную скорость работы. В некоторых игровых ситуациях вам может понадобится использовать CCD для динамичных тел. Например вы можете захотеть выстрелить высокоскоростной пулей в тонкую стену. Без CCD, пуля, скорее всего, пролетела бы сквозь стену.
Быстродвижущиеся объекты в Box2D именуются "снарядами" (от англ. bullet пуля, ядро).
bodyDef.isBullet = true;
Установка флага "снаряда" действенна только для динамичных тел.
CCD это дорогая операция так что, лучше не отмечать все движущиеся тела как "снаряды". Так в Box2D по умолчанию CCD используется только между парами динамичное тело - статичное тело. Этот подход эффективен, если необходимо не дать телам покинуть ваш игровой мир. Однако вы можете иметь несколько быстродвижущихся объектов которые потребуют постоянного использования CCD.
5.3. Фабрикател
Тела создаются и уничтожаются с использованием методов-фабрик объекта b2Worid. Это позволяет миру создать тело с использованием эффективного аллокатора (SOA) и добавить его в мир.
Тела могут быть динамичными или статичными в зависимости от массы. Оба типа тел создаются и уничтожаются при помощи одних и тех же методов.
b2Body* dynamicBody = myWorld->CreateBody(SbodyDef); ... сделать что-нибудь ... myWorld->DestroyBody(dynamicBody); dynamicBody = NULL;
Внимание
Никогда не используйте new или malloc для создания тел. Мир не будет знать о существовании этого тела и оно не будет
правильно настроено.
Статические тела не перемещаются под воздействием других тел. Можно вручную
перемещать статичные тела, но следует быть осторожным, чтобы не раздавить динамичные тела, находящиеся между двумя или несколькими статичными. Трение не работает при перемещении статичного тела, а также статичные тела никогда не взаимодействуют друг с другом. При создании статичной геометрии игрового уровня, быстрее подсоединить несколько фигур к одному статичному телу, чем создавать несколько статичных тел. Box2D устанавливает массу и обратную массу статичных тел равными нулю, поэтому для внутренних алгоритмов моделирования нет разницы между статичными и динамичными телами.
Box2D не хранит ссылки на определение тела или любые находящиеся в нем данные (за исключением указателя на пользовательские данные). Поэтому можно объявлять определения как локальные переменные и использовать одно и то же определение для создания нескольких тел.
Box2D избавляет вас от необходимости удалять каждого тело вручную, т.к. при удалении мира, он (мир) сам выполняет всю работу по сборке мусора. Однако после этого необходимо обнулить все указатели на физические тела в игровом движке.
При удалении тела, все присоединённые к нему фигуры и соединения удаляются автоматически. Эта деталь имеет большое значение при использовании указателей на фигуры и соединения. Более подробная информация доступна в 9.2 Неявное уничтожение.
Допустим необходимо соединить динамическое тело с неподвижной точкой. Для этого необходимо соединить динамичное тело со статичным телом. Если статичного тела нет, то можно использовать общий бокс земли.
b2Body* ground = myWorld->GetGroundBody(); ... создать соединение используя статичное тело земли ...
5.4. Использованиетел.
После создания тела, над ним можно производить множество операций. Включая настройку параметров массы, получение позиции и скорости тела, приложение к нему сил, преобразование точек и векторов между локальными и мировыми координатами.
5.4.1. Данные о массе
Можно задавать массу прямо во время выполнения программы. Обычно, это делается когда создается или уничтожается фигура тела. Может потребоваться задать массу тела исходя из данных о присоединенных к нему фигурах.
void SetMassFromShapes() ;
Также бывает необходимо установить массу для тела вручную. Например, если необходимо изменить фигуры, но при этом использовать свои собственные формулы для расчета массы.
void SetMass(const b2MassData* massData);
Данные о массе тела доступны через следующие функции:
float32 GetMass() const; float32 Getlnertia() const; const b2Vec2& GetLocalCenter() const;
5.4.2. Информацияосостояниитела
Состояние тела имеет много аспектов. Можно получить доступ к данным о состоянии тела, используя следующие функции:
bool IsBullet() const; void SetBullet(bool flag);
bool IsStatic() const; bool IsDynamic() const;
bool IsFrozen() const;
bool IsSleeping() const; void AllowSleeping(bool flag); void WakeUp();
Состояние снаряда описано в разделе 5.2.5, "Сняряды". Состояние замороженности описано в разделе 9.1, "Границы мира".
5.4.3. Положение и скорость
Обычно необходимо узнать позицию и угол поворота физического тела, например для отображения соответствующего графического объекта. Можно вручную установить позицию тела, но так делают редко, обычно для моделирования перемещений используется Box2D.
bool SetXForm(const b2Vec2& position, float32 angle); const b2XForm& GetXForm() const; const b2Vec2& GetPosition() const; float32 GetAngle() const;
Можно узнать мировые координаты центра масс тела. В большинстве внутренних алгоритмов Box2D для моделирования используется именно центр масс. Но обычно знать координаты центра масс не требуется, чаще нужно знать позицию тела.