Объект в Box2d не сидит отлично поверх другого объекта

У меня есть прямоугольник в классе моего со следующими свойствами

b2BodyDef player;
player.type = b2_dynamicBody;
player.position.Set(x + width, 10.17f - (y + height));

m_PhysicsBody = level->GetPhysicsWorld().CreateBody(&player);

b2PolygonShape shape;
shape.SetAsBox(width, height);

b2FixtureDef fixture;
fixture.shape = &shape;
fixture.density = 1.0f;
fixture.friction = 1.0f;

m_PhysicsFixture = m_PhysicsBody->CreateFixture(&fixture);
m_PhysicsFixture->SetUserData(this);

и еще один прямоугольник в моем классе уровня со следующими свойствами

b2BodyDef ground;

ground.position.Set(x + width, 10.17 - (y + height));

b2PolygonShape groundBox;
groundBox.SetAsBox(width, height);

b2Body* m_Body = m_PhysicsWorld.CreateBody(&ground);

b2FixtureDef fixture;
fixture.shape = &groundBox;

fixture.friction = 1.0f;

m_PhysicsFixture = m_Body->CreateFixture(&fixture);

m_PhysicsFixture->GetShape()->ComputeAABB(&aabb, m_Body->GetTransform(), 0);

Проблема заключается в том, что если объект игрока не является идеальным квадратом (ширина и высота точно такие же), он не будет сидеть точно поверх наземного объекта, который я создал в классе уровня. Он немного пересекает его, прежде чем отправиться на отдых. Я добавил фотографию, чтобы вы могли видеть.  введите описание изображения здесь>> </a> </p>

<p> Способ визуализации фигур выглядит следующим образом </p>

<pre><code>---- +: = 2 = + ----</code></pre>

<p> Я умножаю значения на 100.0f, чтобы сделать их больше, а y - высотой окна минус y. Это связано с тем, что я использую SDL, который устанавливает верхний левый угол в качестве источника 0,0. Таким образом, весь путь вверху, y = 0 и весь путь внизу, y = высота окна. </p></body></html>

4 голоса | спросил CareyOn 11 62017vEurope/Moscow11bEurope/MoscowSat, 11 Nov 2017 23:24:39 +0300 2017, 23:24:39

1 ответ


1

Объекты Box2D, сидящие друг над другом в ситуации, отличной от нулевой гравитации, будут иметь некоторое перекрытие, по крайней мере, перекрываться внутри своих «скинов» их фигур (их внешние формы). Это нормально и преднамеренно.

Шкуры - это буферные зоны, которые служат для устранения дрожания; чтобы помочь системе достичь устойчивого состояния. В Box2D размер скина определяется значением переменной b2Shape::m_radius.

Обычно перекрытие не видно. Он может стать видимым, если:

  1. Ваше представление больше масштабируется, чем обычно (например, если шкалы не указаны в рекомендуемых диапазонах), и вы просматриваете внешние фигуры или просматриваете их AABB.
  2. Плотность /масса элементов (ов) верхнего предмета значительно выше, чем плотность нижней части тела.
  3. Есть куча тел, уложенных друг на друга.
  4. Моделирование не использует достаточное количество итераций позиции.
  5. Моделирование не соответствует импульсам предыдущих идентификаторов контактов, которые иногда могут возникать в более динамических симуляциях, когда контакты сохраняются некоторое время, как в тесте Tumbler Testbed.

Изменение количества итераций позиции может повлиять на то, сколько перекрытий будет каждый шаг мира. Обычно я ожидаю увеличения итераций позиции для более быстрого устранения избыточного перекрытия. Это должно уменьшить перекрытие для ситуаций 2, 3 или 4. Изменение плотностей приборов, чтобы они были ближе друг к другу, также может помочь. Изменение масштаба (ов) может помочь в ситуации 1. Ситуация 5, похоже, не связана с тем, что вы описали, но для этого требуется изменить исходный код Box2D.

Вы можете наблюдать перекрытие в встроенном тестовом стенде Box2D, например, в тесте Sphere Stack, если вы увеличите масштаб на двух нижних кругах.

Надеюсь, это поможет!

ответил Louis Langholtz 12 72017vEurope/Moscow11bEurope/MoscowSun, 12 Nov 2017 19:41:20 +0300 2017, 19:41:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132