Как ограничить вращательное соединение в box2d - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу ограничить переворот сустава.Нижний угол: -10 градусов, максимум: 10 градусов.Но несмотря на то, что я использовал этот код:

joint.lowerAngle = -10 * (Math.PI/180);
joint.upperAngle = 10 * (Math.PI/180);
joint.enableLimit = true;

, он не работает.Я хочу ограничить вращение вагонов: введите описание изображения здесь Как можно жестко ограничить этот сустав, чтобы, несмотря ни на что, вагоны не поворачивались друг относительно друга?Вот мой код:

const createVagon = function(num) {

    let fixDef = new box2d.b2FixtureDef();
    fixDef.density = 1;
    fixDef.friction = 1;
    fixDef.restitution = 0;

    let bodyDef = new box2d.b2BodyDef();
    bodyDef.type = box2d.b2Body.b2_dynamicBody;
    bodyDef.position.Set(toMeters(VAGON_FIRST_POSX - (VAGONS_DISTANCE+VAGON_WIDTH)*num), toMeters(0));
    // bodyDef.angle = 0;

    vagons[num].body = world.CreateBody(bodyDef);

    fixDef.shape = new box2d.b2PolygonShape();
    fixDef.shape.SetAsBox(toMeters(VAGON_WIDTH), toMeters(VAGON_HEIGHT));

    vagons[num].body.CreateFixture(fixDef);

    let wheel = world.CreateBody(bodyDef);

    fixDef.shape = new box2d.b2CircleShape(toMeters(VAGON_WHEEL));

    wheel.CreateFixture(fixDef);

    let joint = new box2d.b2Joints.b2RevoluteJointDef();
    joint.bodyA = vagons[num].body;
    joint.bodyB = wheel;
    joint.localAnchorA = new box2d.b2Vec2(toMeters(VAGON_WIDTH-VAGON_WHEEL/2), toMeters(VAGON_HEIGHT+VAGON_WHEEL/2));
    joint.maxMotorTorque = 1.0;
    // joint.motorSpeed = 30.0;
    joint.enableMotor = true;
    joint = world.CreateJoint(joint);

    vagons[num].backWheel = joint;

    wheel = world.CreateBody(bodyDef);

    fixDef.shape = new box2d.b2CircleShape(toMeters(VAGON_WHEEL));

    wheel.CreateFixture(fixDef);

    joint = new box2d.b2Joints.b2RevoluteJointDef();
    joint.bodyA = vagons[num].body;
    joint.bodyB = wheel;
    joint.localAnchorA = new box2d.b2Vec2(-toMeters(VAGON_WIDTH-VAGON_WHEEL/2), toMeters(VAGON_HEIGHT+VAGON_WHEEL/2));
    joint.maxMotorTorque = 1;
    // joint.motorSpeed = 0.0;
    joint.enableMotor = true;
    joint = world.CreateJoint(joint);

    vagons[num].frontWheel = joint;

    bodyDef = new box2d.b2BodyDef();
    bodyDef.type = box2d.b2Body.b2_dynamicBody;
    let frontBind = world.CreateBody(bodyDef);

    vagons[num].frontBind = frontBind;

    fixDef.shape = new box2d.b2PolygonShape();
    fixDef.shape.SetAsBox(toMeters(VAGON_WHEEL/2), toMeters(VAGON_WHEEL/2));
    fixDef.filter.maskBits = 0x0000;

    frontBind.CreateFixture(fixDef);

    joint = new box2d.b2Joints.b2RevoluteJointDef();
    joint.bodyA = vagons[num].body;
    joint.bodyB = frontBind;
    joint.lowerAngle = -10 * (Math.PI/180);
    joint.upperAngle = 10 * (Math.PI/180);
    joint.enableLimit = true;
    joint.localAnchorA = new box2d.b2Vec2(toMeters(VAGON_WIDTH+VAGON_WHEEL/2), toMeters(0));
    joint = world.CreateJoint(joint);

    let backBind = world.CreateBody(bodyDef);

    vagons[num].backBind = backBind;

    backBind.CreateFixture(fixDef);

    joint = new box2d.b2Joints.b2RevoluteJointDef();
    joint.bodyA = vagons[num].body;
    joint.bodyB = backBind;
    joint.lowerAngle = -10 * (Math.PI/180);
    joint.upperAngle = 10 * (Math.PI/180);
    joint.enableLimit = true;
    joint.localAnchorA = new box2d.b2Vec2(-toMeters(VAGON_WIDTH+VAGON_WHEEL/2), toMeters(0));
    joint = world.CreateJoint(joint);

}
...