Erіn Catto - Box2D v 2 стр 2.

Шрифт
Фон

вращаться вокруг гвоздя, т.е. мы лишили тело 2-х степеней свободы.

Контактноеограничение(contact constraint)

Специальное ограничение, предназначенное для предотвращения проникновения тел

друг в друга, а также моделирования трения и упругости тел. Вам не никогда не

придется создавать такие ограничения, т.к. они создаются Box2D автоматически.

Соединение(joint)

Это специальное ограничение, используемое для соединения двух и более тел. Box2D

поддерживает следующие типы соединений: "шарнирное", "призматическое", "жесткий

отрезок" и другие. Соединения могут играть роль ограничителей (limits) или мускулов

(motors). Ограниченноесоединение(joint limit)

Как следует из названия, диапазон движений такого соединения ограничен. В качестве

примера можно привести локоть человека.

Соединение-мускул(joint motor)

Приводит в движение все подсоединенные к нему тела в соответствии со степенями

свободы их соединений. Например, можно использовать мускул, чтобы заставить локоть

сгибаться и разгибаться.

Мир(world)

Мир объединяет все тела, фигуры и ограничения, взаимодействующие друг с другом.

Box2D поддерживает создание нескольких миров, но обычно это не требуется.

Глава 2. Привет Box2D

Содержание

2.1. Создание мира 2.2. Создание GroundBox'a (бокса Земли). 2.3. Создание Динамичного Тела (Dynamic Body) 2.4. Моделирование физического мира (Вох2Р) 2.5. Сбор мусора 2.6. Тестовый стенд

Дистрибутив Box2D содержит проект Hello World. Программа создает огромный бокс земли и маленький динамичный бокс. Ее код не содержит никакой графики, вся информация выводится в виде текста.

2.1. СозданиеМира

Каждая программа с использованием движка Box2D начинается с создания объекта мира. Этот объект центр управления памятью, объектами и процессами моделирования.

Для его создания мы должны сначала определить ограничивающий бокс. Ограничивающие боксы используются в Box2D для ускорения расчетов столкновений тел. Размер бокса не критичен,

но хороший его подбор увеличит производительность, впрочем, в случае выбора размера бокса применимо правило "лучше больше, чем

меньше".

Ь2ААВВ worldAABB;

worldAABB.lowerBound.Set(-100.Of, -100.Of);

worldAABB.upperBound.Set(100.Of, 100.Of);

Внимание

Размер AABB мира всегда должен быть больше, чем регион где располагаются ваши "тела". Еще раз напомним, лучше сделать ААВВ очень большим, чем слишком маленьким. Если тело (возможно в процессе моделирования) пересекает границу ААВВ мира, то оно замораживается и исключается из процесса моделирования.

Теперь определяем вектор гравитации. Да, кстати, вы может направить вектор гравитации в сторону, а не вниз (или можете просто повернуть свой монитор :) ). Также мы сообщаем миру, что телам позволено "засыпать" когда они находятся в состоянии покоя. Спящий объект не нуждается ни в каком моделировании поведения.

b2Vec2 gravity(0.Of, -10.Of); bool doSleep = true;

Теперь создадим сам объект. В обычных условиях вам следует создавать объект мира на хипе (в динамической памяти) и сохранять указатель в одной из структур вашей игры. Однако и создание мира на стеке (в статической памяти) в этом примере прекрасно работает.

b2World world(worldAABB, gravity, doSleep);

Ну что же, теперь у нас есть мир (мир физики!), давайте начнем добавлять в него всякий хлам :)

2.2. СОЗДаНИеGroundBox'a (бОКСЭЗвМЛИ).

Для создания тела (body) нужно выполнить следующие шаги:

1. Сформировать определение тела: позиция, амортизация и т.д.

2. Создать тело при помощи объекта мира

3. Сформировать определение фигур: геометрия, трение, плотность и т.д.

4. Создать фигуры на теле.

5. Опционально, установить массу соответствующую прикрепленным к телу фигурам. На шаге 1 мы создаем бокс земли. Для этого нам необходимо определение тела. В нем мы задаем начальную позицию тела.

b2BodyDef groundBodyDef;

groundBodyDef.position.Set(0.0f, -10.Of);

На шаге 2 определение тела передается в объект мира для создания самого тела. Объект мира не хранит ссылку на определение тела. Бокс земли создается как статичное тело.

Статичное тело не сталкивается с другими статичными телами и не способно двигаться. Box2D определяет, что тело статичное если его масса равна нулю. Тела имеют нулевую массу по умолчанию, следовательно, они по умолчанию статичные.

b2Body* ground = world.CreateBody(SgroundBodyDef);

На шаге 3 мы создаем определение полигона (многоугольника) земли. Для этого мы используем упрощенную функцию SetAsBox, чтобы сформировать полигон земли как бокс, центр которого находится в начале координат родительского тела.

b2PolygonDef groundShapeDef; groundShapeDef.SetAsBox(50.Of, 10.Of);

Функция SetAsBox принимает полуширину и полувысоту объекта. Так, в данном случае бокс земли имеет 100 единиц в ширину (ось X) и 20 единиц в высоту (ось Y). Box2d настроен для метров, килограмм и секунд. Таким образом, вы можете использовать размеры в метрах. Тем не менее, систему мер можно изменить, это тема обсуждается далее в этом документе. В шаге 4 мы заканчиваем создание тела земли созданием на нем полигона.

groundBody->CreateShape(SgroundShapeDef);

И снова напоминаем, Box2D не сохраняет ссылок на определения фигур и/или тел. Вместо этого он копирует данные внутрь структурыЬ2Воа!у.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке