Box2D: как вручную визуализировать тело - PullRequest
2 голосов
/ 24 июня 2010

Мне удалось установить Box2D в мой проект.Но как я могу сделать тело?Предположим, я использую что-то, что поддерживает рисование полигонов.Я просто хочу узнать текущее положение вершин многоугольника тела, нарисовать его с помощью движка.

Если вы можете мне помочь, я буду очень благодарен.

Ответы [ 3 ]

3 голосов
/ 24 июня 2010

Я нашел это !!!

void Box2DUtils::DrawBody(SDL_Surface *buffer, b2Body *body, int fr, int fg, int fb, int falpha, int lr, int lg, int lb, int lalpha, bool aa)
{
    const b2Transform& xf = body->GetTransform();
    for (b2Fixture* f = body->GetFixtureList(); f; f = f->GetNext())
    {
        switch (f->GetType())
        {
        case b2Shape::e_circle:
        {
            b2CircleShape* circle = (b2CircleShape*) f->GetShape();

            b2Vec2 center = b2Mul(xf, circle->m_p);
            float32 radius = circle->m_radius;
            b2Vec2 axis = xf.R.col1;

            //m_debugDraw->DrawSolidCircle(center, radius, axis, color);
            if (falpha > 0)
            {
                filledCircleRGBA(buffer, center.x, center.y, (int) radius, fr, fg, fb, falpha);
            }
            if (lalpha > 0)
            {
                if (aa)
                {
                    aacircleRGBA(buffer, center.x, center.y, (int) radius, lr, lg, lb, lalpha);
                } else
                {
                    aacircleRGBA(buffer, center.x, center.y, (int) radius, lr, lg, lb, lalpha);
                }
            } else if (aa)
            {
                aacircleRGBA(buffer, center.x, center.y, (int) radius, fr, fg, fb, falpha);
            }

        }
            break;

        case b2Shape::e_polygon:
        {
            b2PolygonShape* poly = (b2PolygonShape*) f->GetShape();
            int32 vertexCount = poly->m_vertexCount;
            b2Assert(vertexCount <= b2_maxPolygonVertices);
            b2Vec2 vertices[b2_maxPolygonVertices];
            Sint16 xv[b2_maxPolygonVertices];
            Sint16 yv[b2_maxPolygonVertices];
            for (int32 i = 0; i < vertexCount; ++i)
            {
                vertices[i] = b2Mul(xf, poly->m_vertices[i]);
                xv[i] = (int) vertices[i].x;
                yv[i] = (int) vertices[i].y;
            }
            if (falpha > 0)
            {
                filledPolygonRGBA(buffer, xv, yv, (Sint16) vertexCount, fr, fg, fb, falpha);
            }
            if (lalpha > 0)
            {
                if (aa)
                {
                    aapolygonRGBA(buffer, xv, yv, (Sint16) vertexCount, lr, lg, lb, lalpha);
                } else
                {
                    polygonRGBA(buffer, xv, yv, (Sint16) vertexCount, lr, lg, lb, lalpha);
                }
            } else if (aa)
            {
                aapolygonRGBA(buffer, xv, yv, (Sint16) vertexCount, fr, fg, fb, falpha);
            }
            //m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color);
        }
            break;
        }
    }
}
2 голосов
/ 24 июня 2010

Руководство Box2D относится к проекту HelloWorld , который входит в комплект загрузки.Та же самая документация также проходит через это шаг за шагом.Цитирование руководства:

Программа создает большой блок заземления и небольшой динамический блок.Этот код не содержит графики.Все, что вы увидите, это вывод текста в консоли о позиции блока во времени.

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

0 голосов
/ 21 декабря 2011

Вы должны использовать World-> SetDebugDraw (& myDebugDraw) и установить соответствующие флаги рисования для визуализации различных аспектов физического мира (формы, соединения, центр тяжести и т. Д.). Флаги рисования устанавливаются с помощью myDebugDraw.SetDebugFlags (flags ).

myDebugDraw является экземпляром b2Draw (b2DebugDraw в версиях 2.1.2 и более ранних), который на большинстве «платформ» имеет легкодоступную реализацию. Во время обратного вызова рендеринга используйте World-> DrawDebugData (), и соответствующий контент будет отрисован через ваш экземпляр myDebugData.

Надеюсь, это не смутило, учитывая краткость сообщения. Все это описано в документации Box2d.

...