2010-06-24 50 views
2

我成功地將Box2D安裝到我的項目中。但是我怎樣才能渲染一個身體?假設我正在使用支持繪製多邊形的東西。我只是想找出身體 - 多邊形頂點的當前位置,用引擎繪製它。Box2D:如何手動渲染一個物體

如果你能幫助我,我會非常感激。

回答

3

我發現了!

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

Box2D manual refers to a HelloWorld project捆綁在下載中。同樣的文檔也一步一步地通過它。引述手冊:

程序 創建一個大型地面盒和一個小 動箱。此代碼不包含任何圖形,其中 包含任何圖形。所有你會看到的 是隨着時間的推移在 框的位置控制檯的文本輸出。

如果你沒有一個矩形工作,這應該有助於你開始。

0

你應該用世界 - > SetDebugDraw(& myDebugDraw),並設置相應的圖紙標誌渲染物理世界的各個方面(形狀,關節,重心等)水彩標誌設置通過myDebugDraw.SetDebugFlags(標誌)。

myDebugDraw是b2Draw的一個實例(b2DebugDraw版本2.1.2及以前版本),大多數「平臺」都有一個可用的實現。在渲染回調期間,使用World-> DrawDebugData(),並通過myDebugData實例繪製適當的內容。

希望這不是因爲帖子的簡短而令人困惑。所有這些都包含在Box2d文檔中。

+0

感謝您的回答。但正如你所看到的,這個問題已經有1.5年曆史了。我現在已經很熟悉SDL,OpenGL和Box2D。 – 2011-12-20 22:47:25