发布
社区首页 >问答首页 >如何在box2d中创建椭圆形状?

如何在box2d中创建椭圆形状?
EN

Stack Overflow用户
提问于 2012-04-05 16:53:47
回答 1查看 4.1K关注 0票数 3

我需要为身体创建椭圆形状,并且不知道如何在box2d中实现。

任何想法都可以通过使用带有很多顶点的而不是来实现。

EN

回答 1

Stack Overflow用户

发布于 2013-12-13 02:22:06

选项#1

使用一个有两个固定装置的身体:第一个是一个中心的圆形形状,给身体一些质量。第二个是椭圆,顶点由链状构造而成。

第一个夹具可以让你的身体表现得像一个有质量的身体,而第二个夹具可以让你正确地处理碰撞。

最近我为轮盘做了一个例子。我发布了下面的代码来创建它。将半径(OUTER_RADIUS)的常量替换为椭圆在维基百科上找到的半径的极坐标形式。

代码语言:javascript
代码运行次数:0
复制
void MainScene::CreateBody()
{
   const float32 INNER_RADIUS = 2.50;
   const float32 OUTER_RADIUS = 3.0;
   const float32 BALL_RADIUS = 0.1;
   const uint32 DIVISIONS = 36;

   Vec2 position(0,0);

   // Create the body.
   b2BodyDef bodyDef;
   bodyDef.position = position;
   bodyDef.type = b2_dynamicBody;
   _body = _world->CreateBody(&bodyDef);
   assert(_body != NULL);

   // Now attach fixtures to the body.
   FixtureDef fixtureDef;
   fixtureDef.density = 1.0;
   fixtureDef.friction = 1.0;
   fixtureDef.restitution = 0.9;
   fixtureDef.isSensor = false;

   // Inner circle.
   b2CircleShape circleShape;
   circleShape.m_radius = INNER_RADIUS;
   fixtureDef.shape = &circleShape;
   _body->CreateFixture(&fixtureDef);

   // Outer shape.
   b2ChainShape chainShape;
   vector<Vec2> vertices;
   const float32 SPIKE_DEGREE = 2*M_PI/180;
   for(int idx = 0; idx < DIVISIONS; idx++)
   {
      float32 angle = ((M_PI*2)/DIVISIONS)*idx;
      float32 xPos, yPos;

      xPos = OUTER_RADIUS*cosf(angle);
      yPos = OUTER_RADIUS*sinf(angle);
      vertices.push_back(Vec2(xPos,yPos));
   }
   vertices.push_back(vertices[0]);
   chainShape.CreateChain(&vertices[0], vertices.size());
   fixtureDef.shape = &chainShape;
   _body->CreateFixture(&fixtureDef);
    
}

您也可以查看这个职位的轮盘赌轮(加上图片好)解决方案。

选项2,而不是使用链/边形状,您可以创建一个三角扇形的夹具。一旦得到了椭圆的顶点,就可以执行如下操作:

代码语言:javascript
代码运行次数:0
复制
b2Vec2 triVerts[3];
triVerts[0] = Vec2(0,0);
for(int idx = 1; idx < vertices.size(); idx++)
{
   b2PolygonShape triangle;
   fixtureDef.shape = &triangle;
   // Assumes the vertices are going around
   // the ellipse clockwise as angle increases.
   triVerts[1] = vertices[idx-1];
   triVerts[2] = vertices[idx];
   triangle.Set(triVerts,3);
   _body->CreateFixture(&fixtureDef);
}

这对我们有帮助吗?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10032756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档