box2dweb之关节joint(连接器)

时间:2022-05-07 15:27:02

1 概述

  前篇基础文章看完后基本上就应该对box2dweb能上手了,下面来介绍一下box2dweb非常重要的一个概念,关节(joint)也有叫连接器的,总之是一个意思。下面是关节详细的类库说明:

BOX2D.Dynamics.Joints>>>动态关节包;
b2DistanceJoint 距离连接
b2DistanceJointDef 距离连接定义.
b2GearJoint 齿轮链接.
b2GearJointDef 齿轮连接定义.
b2Joint 连接基类.
b2JointDef 连接定义基类.
b2JointEdge 用于组合刚体或连接到一起.刚体相当于节点,而连接相当于边
b2MouseJoint 鼠标连接.
b2MouseJointDef 鼠标连接定义.
b2PrismaticJoint 移动连接.
b2PrismaticJointDef 移动连接定义.
b2PulleyJoint 滑轮连接.
b2PulleyJointDef 滑轮连接定义.
b2RevoluteJoint 旋转连接.
b2RevoluteJointDef 旋转连接定义.

当然,创建的时候用连接器定义类,创建出来的时连接器类。下面我们来一一来看。

2.1 距离连接器b2DistanceJoint

  距离连接器就是以固定的距离来连接两个body,这其中就有4个固有概念,两个物体,两个物体上的连接点。

  首先,我们先定义两个body:

//定义两个body
var bodydef=new b2BodyDef();
bodydef.type = b2Body.b2_dynamicBody;
var fixDef=new b2FixtureDef();
fixDef.sharp=new b2CircleShape(0.2)
fixDef.density = 5.0;
fixDef.friction = 0.4;
fixDef.restitution =0.3; var body1 = world.CreateBody(bodyDef);
body1.SetPosition(new b2Vec2(2,2));
body1.CreateFixture(fixDef); var body2 = world.CreateBody(bodyDef);
body2.SetPosition(new b2Vec2(4,3));
body2.CreateFixture(fixDef);

然后我们用距离连接器将这两个物体连接起来:

var disjoint=new b2DistanceJointDef();
//设置要连接的两个物体
disjoint.bodyA=body1;
disjoint.bodyB=body2;
//设置连接在两个物体上相对于中心点的位置(如果不设置,默认为中心点)
disjoint.localAnchorA.Set(0.1,0.1);
disjoint.localAnchorB.Set(0,0);
//设置距离,如果不设置则为两物体之间的实际距离,如果设置的距离与实际距离不符,则拉伸至设置的距离
disjoint.length=1;
world.CreateJoint(disjoint);

下面来看效果

 

  距离连接器还有几个有趣的参数,collideConnected   是否允许关联的两个物体碰撞,默认是不计算的。另外两个参数与关节的弹性相关,频率(frequency)和阻尼率(damping ratio),其中频率指谐振时候的快慢,一般该值要小于时间歩频率(世界刷新频率)的一半,阻尼率是一个0~1之间的数值,值为1时将没有振动。下面我们来加弹性参数:

disjoint.frequencyHz = 4;
disjoint.dampingRatio = 0.2;

看效果