рендеринг форм box2d через direct2d - PullRequest
0 голосов
/ 02 ноября 2011

Я впервые использую box2d, и я настроил свои фигуры с помощью урока hello world.

Я создаю коробку так:

b2BodyDef bodyDef;
bodyDef.type = b2_kinematicBody;
bodyDef.position.Set(7.0f, 7.0f);
bodyDef.angle = 0;

m_body = m_world->CreateBody(&bodyDef);

b2PolygonShape shape;
shape.SetAsBox(1.5f, 0.5f);

b2FixtureDef fixtureDef;
fixtureDef.shape = &shape;
fixtureDef.density = 1.0f;

m_body->CreateFixture(&fixtureDef);

Теперь я готов отрисовать это поле, поэтому я вызываю:

b2Vec2 pos = m_body->GetPosition();

На данный момент мне нужно вызвать m_renderTarget-> SetTransform (), используя значения pos, но я не могу понять, какправильно визуализировать окно.Я попытался:

m_renderTarget->SetTransform(D2D1::Matrix3x2F::Translation(pos.x * 30, pos.y * 30));
m_renderTarget->DrawRectangle(D2D1::RectF(0.0f, 0.0f, 3.0f * 30.0f, 1.0f * 30.0f), m_brush);

И круг:

bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(7.0f, 1.0f);

m_circleBody = m_world->CreateBody(&bodyDef);

b2CircleShape circleShape;
circleShape.m_p.Set(0.0f, 0.0f);
circleShape.m_radius = 0.5f;

fixtureDef.shape = &circleShape;

m_circleBody->CreateFixture(&fixtureDef);

И сделать круг:

    b2Vec2 circlePos = m_circleBody->GetPosition();

    mpRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(circlePos.x * 30.0f, circlePos.y * 30.0f));

    mpRenderTarget->DrawEllipse(D2D1::Ellipse(D2D1::Point2F(0.0f, 0.0f), 30.0f, 30.0f), m_brush);

1 Ответ

0 голосов
/ 02 ноября 2011

Вы не рисуете прямоугольник по центру. Центр прямоугольника находится вверху слева.

m_renderTarget->DrawRectangle(D2D1::RectF(0.0f, 0.0f, 3.0f * 30.0f, 1.0f * 30.0f), m_brush);

Для правильного центрирования у вас должно быть Left = -Right, Top = -Bottom, вот так

m_renderTarget->DrawRectangle(D2D1::RectF(-1.5 * 30.f, -0.5 * 30.f, 1.5f * 30.0f, 0.5f * 30.0f), m_brush);

Вот диаграмма, объясняющая, почему центрирование важно:

diagram illustrating the importance of centering

Физически вы представляете обе фигуры правильно, но графически вы неосознанно добавили смещение к прямоугольнику. Кроме того, ваш масштаб отключен: вы принимаете 1 = 30 пикселей для прямоугольника и 0,5 = 30 пикселей для круга. Согласованность является ключевым моментом в симуляции, поэтому вы должны понизить радиусы вашего D2D1 :: Ellipse до 15 каждый.

...