理解Chipmunk2D-销关节约束

这一节让我们来理解下Chipmunk2D中的销关节约束。

首先看文档中的一些解释

1
2
3
cpPinJoint *cpPinJointAlloc(void)
cpPinJoint *cpPinJointInit(cpPinJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)
cpConstraint *cpPinJointNew(cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2)

a和b是被连接的两个刚体,anchr1和anchr2是这两个刚体的锚点。当关节被创建的时候距离便被确定,如果你想要设定一个特定的距离,使用setter函数来重新设定该值。

getter/setter函数

  • cpVect cpPinJointGetAnchr1(const cpConstraint *constraint)
  • void cpPinJointSetAnchr1(cpConstraint *constraint, cpVect value)
  • cpVect cpPinJointGetAnchr2(const cpConstraint *constraint)
  • void cpPinJointSetAnchr2(cpConstraint *constraint, cpVect value)
  • cpFloat cpPinJointGetDist(const cpConstraint *constraint)
  • void cpPinJointSetDist(cpConstraint *constraint, cpFloat value)

在Cocos2DX中,销关节被封装成了PhysicsJointDistance,我们先来看看该类头文件。

PhysicsJointDistance类

PhysicsJointDistance
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** Set the fixed distance with two bodies */
class PhysicsJointDistance : public PhysicsJoint
{
public:
static PhysicsJointDistance* construct(PhysicsBody* a, PhysicsBody* b, const Point& anchr1, const Point& anchr2);

float getDistance() const;
void setDistance(float distance);

protected:
bool init(PhysicsBody* a, PhysicsBody* b, const Point& anchr1, const Point& anchr2);

protected:
PhysicsJointDistance() {}
virtual ~PhysicsJointDistance() {}
};

PhysicsJointDistance这个名字和销关节的工作机制还是很贴切的。(在Box2D中也有距离关节,b2DistanceJoint)。当关节被创建的时候,刚体a和刚体b的锚点距离就被定了下来。假如后面我们要对该距离进行修改,可以通过setDistance()方法来设定距离值。当设定的值不等于刚体之前的锚点间距时,我们会发现画面上刚体锚点的间距会发生突变,那是Chipmunk在按照你新设定的间距在修正。

1.注意:anchr1anchr2针对的是刚体a和刚体b的局部坐标系。

2.注意:PhysicsJointPin可不是销关节,其实是枢轴关节(PivotJoint)!PhysicsJointDistance才是我们这里说的销关节。

为了更好的理解销关节的工作机制,我做了几个演示来说明下:

图示1

图示2(多个销关节对绳索的模拟)

图示3

图示3 Github地址

坚持原创技术分享,您的支持将鼓励我继续创作!