const b2Vec2& GetWorldCenter () const; МОЖНО получить доступ К ЛИНеЙНОЙ И УГЛОВОЙ
скорости тела. Линейная скорость устанавливается для центра масс.
void SetLinearVelocity(const b2Vec2& v); b2Vec2 GetLinearVelocity() const; void SetAngularVelocity(float32 omega); float32 GetAngularVelocity() const;
5.4.4. Силыиимпульсы
К телу можно применять силы, моменты и импульсы. При применении силы или импульса указывается мировая координата их приложения. Часто при этом возникает момент вращения вокруг центра масс.
void ApplyForce(const b2Vec2& force, const b2Vec2& point); void ApplyTorque(float32 torque); void Applylmpulse(const b2Vec2& impulse, const b2Vec2& point);
Применение силы, момента или импульса выводит тело из состояния сна. Иногда требуется применить силу только для бодрствующих тел, для этого случая подойдет следующий код:
if (myBody->IsSleeping() == false)
{
myBody->ApplyForce(myForce, myPoint);
}
5.4.5. Преобразованиекоординат
Класс b2Body имеет вспомогательные функции для преобразования точек и векторов между локальными и мировыми координатами. Если вам неясны эти понятия, то можно ознакомиться с книгой "Essential Mathematics for Games and Interactive Applications" авторов Jim Van Verth и Lars Bishop. Эти функции не ресурсоёмкие, так что ими можно смело пользоваться.
b2Vec2 GetWorldPoint(const b2Vec2& localPoint); b2Vec2 GetWorldVector(const b2Vec2& localVector); b2Vec2 GetLocalPoint(const b2Vec2& worldPoint); b2Vec2 GetLocalVector(const b2Vec2& worldVector);
5.4.6. Списки
При желании можно получить доступ ко всем фигурам заданного тела. Что очень удобно если необходимо получить пользовательские данные для каждой фигуры присоединенной к определенному телу.
for (b2Shape* s = body->GetShapeList(); s; s = s->GetNext())
{
MyShapeData* data = (MyShapeData*)s->GetUserData(); ... сделать что-то ... }
Таким же образом можно пройтись по всем соединениям тела.
Глава 6. Фигуры
Содержание
6.1. О фигурах 6.2. Определение фигуры 6.2.1. Коэффициенты трения и восстановления 6.2.2. Плотность 6.2.3. Фильтрация столкновений 6.2.4. Сенсоры 6.2.5. Определение Окружности 6.2.6. Определение Полигона 6.3. Фабрика фигур 6.4. Использование фигур
6.1. Офигурах
Фигуры это геометрия, которая подсоединяется к телам и используется для проверки столкновений между ними. Фигуры также используются для определения массы тела. Это позволяет определить массу тела лишь задав плотность, Box2D сделает все вычисления сам.
Фигуры имеют коэффициенты трения и упругости. В фигурах содержится информация о фильтрах столкновений, что позволяет не проверять столкновения между определенными игровыми объектами (скажем можно сделать стенку через которую можно будет стрелять но нельзя будет пройти -- прим. перев.)
Фигуры всегда принадлежат определенному телу. К одному телу можно присоединить несколько фигур. Фигуры являются абстрактными классами, поэтому в Box2D могут быть реализованы различные их типы. Поэтому при желании можно создать свой собственный тип фигур и соответствующие алгоритмы расчета столкновений между ними.
6.2. Определениефигуры
Определения фигур используются для создания фигур. В определении b2ShapeDef присутствует как общая для всех информация, так и специфичная информация для отдельных типов фигур.
6.2.1. Коэффициенты трения и упругости
Трение используется для создания реалистичного скольжения одних объектов по другим. Box2D поддерживает статическое и динамичное трение, но использует один и тот же параметр для обоих. Трение в Box2D моделируется безошибочно, и сила трения пропорционально зависит от величины нормальной силы (трение Колумба). Параметр трения имеет значение в пределах от 0 до 1. Ноль соответствует отсутствию трения, а единица максимальному трению. При вычислении трения между двумя телами, Box2D должен использовать коэффициенты трения обоих тел. Результирующее трение вычисляется по следующей формуле:
float32 friction; friction = sqrtf(shapel->friction * shape2->friction);
Коэффициент упругости используется при столкновении тел. Значение коэффициента может быть из диапазона от 0 до 1. Например, при падении шара на стол, значение О означает, что шар не отскочит - это называется не упругое столкновение, при единице же шар отскочит с той же скоростью -- это абсолютно упругое столкновение. При столкновении двух тел результирующий коэффициент вычисляется
по следующей формуле:
float32 restitution;
restitution = Ь2Мах(shapel->restitution, shape2->restitution);
Если тела имеют несколько точек соприкосновения, то восстановление моделируется приближенно. Это происходит из-за того, что Box2D использует итеративный "разрешальщик" столкновений. Box2D также использует не эластичные столкновения, если скорость столкновения мала. Это необходимо для предотвращения дрожания тел.
6.2.2. Плотность
При необходимости Box2D может вычислить массу и момент инерции тел, используя плотность присоединенных фигур. Указание массы тела вручную, часто приводит к плохому моделированию, поэтому, лучшим путём задания массы тела будет сначала указание плотностей всех фигур тела, а затем вызов b2Body::SetMassFromShape.