js box2dweb как создать кольцо, внутри которого будет пусто

Я хочу создать кольцо на box2dweb, внутри которого я хочу чтобы прыгал шар. Шары, квадраты, полигоны я научился создавать без проблем. Но я без понятия как создать кольцо, центр которого будет на координатах 512, 256 и внутри него должно быть пусто и чтобы шар из него не мог выпасть. Вот мой код:

    class Ring extends GameObject{
  constructor(){
    super(new Vector3(0,0,0),new Size(1,1));

    this.circleThickness = 5;
    this.radius = 240;

    const circleRadius = this.radius * pxsi;
    const circleThickness = this.circleThickness * pxsi;

    var bodyDef1 = new b2BodyDef;
    bodyDef1.type = b2Body.b2_dynamicBody;
    bodyDef1.position.Set(512*pxsi, 256*pxsi);
    var body1 = pworld.CreateBody(bodyDef1);
    var shape1 = new b2CircleShape(240*pxsi); // радиус кольца
    body1.CreateFixture2(shape1, 1);

    var bodyDef2 = new b2BodyDef;
    bodyDef2.type = b2Body.b2_dynamicBody;
    bodyDef2.position.Set(513*pxsi, 256*pxsi); // смещаем по оси X
    var body2 = pworld.CreateBody(bodyDef2);
    var shape2 = new b2CircleShape(200*pxsi); // радиус внутреннего отверстия кольца
    body2.CreateFixture2(shape2, 1);
  }

  OnRender(rect){
    g.beginPath();
    g.arc(512,256, this.radius, 0, 2 * Math.PI);
    g.strokeStyle = 'white';
    g.lineWidth = this.circleThickness;
    g.stroke();
  }
}
class Player extends GameObject{
  constructor(){
    super(new Vector3(512,256,10), new Size(48,48));

    this.radius = 24;

    bodyDef.type = b2Body.b2_dynamicBody;
    fixDef.shape = new b2CircleShape(this.radius*pxsi);
    bodyDef.position.x = this.pos.x*pxsi;
    bodyDef.position.y = this.pos.y*pxsi;
    const body = pworld.CreateBody(bodyDef);
    this.body = body;
    this.fixture = body.CreateFixture(fixDef);
    body.SetUserData(this);

    this.OnUpdate = true;
  }

  OnRender(rect){
    g.beginPath();
    g.arc(0,0, this.radius, 0, 2 * Math.PI);
    g.fillStyle = 'white';
    g.fill();
  }

  Update(){
    const pbody = this.body;
    const pos_si = pbody.GetPosition();
    const pos = this.pos;
    pos.x = pos_si.x * sipx;
    pos.y = pos_si.y * sipx;
    this.Rotate = pbody.GetAngle();
  }
}
var   b2Vec2 = Box2D.Common.Math.b2Vec2
            ,  b2AABB = Box2D.Collision.b2AABB
            ,   b2BodyDef = Box2D.Dynamics.b2BodyDef
            ,   b2Body = Box2D.Dynamics.b2Body
            ,   b2FixtureDef = Box2D.Dynamics.b2FixtureDef
            ,   b2Fixture = Box2D.Dynamics.b2Fixture
            ,   b2World = Box2D.Dynamics.b2World
            ,   b2MassData = Box2D.Collision.Shapes.b2MassData
            ,   b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape
            ,   b2CircleShape = Box2D.Collision.Shapes.b2CircleShape;

var pworld = new b2World(new b2Vec2(0, 10),true);

var fixDef = new b2FixtureDef;
fixDef.density = 1.0;
fixDef.friction = 0.5;
fixDef.restitution = 0.9;
var bodyDef = new b2BodyDef;
const pxsi = 0.001;
const sipx = 1/pxsi;

Ответы (0 шт):