代码之家  ›  专栏  ›  技术社区  ›  Martijn Courteaux

Box2D:如何手动渲染实体

  •  2
  • Martijn Courteaux  · 技术社区  · 15 年前

    我成功地将Box2D安装到我的项目中。但我怎样才能呈现一个身体呢?假设我使用的是支持绘制多边形的东西。我只想找出物体多边形顶点的当前位置,用引擎画出来。

    如果你能帮助我,我将非常感激。

    3 回复  |  直到 12 年前
        1
  •  3
  •   Martijn Courteaux    15 年前

    我找到了!!!

    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
  •  2
  •   Peter Jaric    15 年前

    这个 Box2D manual refers to a HelloWorld project

    程序 包含任何图形。你将看到的一切 盒子的位置随时间变化。

    如果你还没有一个矩形的工作,这应该可以帮助你开始。

        3
  •  0
  •   Tom Guinther    13 年前

    您应该使用World->SetDebugDraw(&myDebugDraw)并设置适当的绘图标志以呈现物理世界的各个方面(形状、关节、重心等)。绘图标志通过myDebugDraw.SetDebugFlags(标志)设置。

    myDebugDraw是b2Draw(版本2.1.2及之前版本中的b2DebugDraw)的一个实例,大多数“平台”都有现成的实现。在渲染回调期间,使用World->DrawDebugData()和相应的内容将通过myDebugData实例绘制。