cocos2d-x box2d物理引擎深入研究 第一篇之平移关节详解(b2PrismaticJoint)

时间:2021-10-07 04:57:23

平移关节可能更多的俗称为滑动关节。关节上的两个物体相对于彼此来说保持固定的旋转,它们只能够沿着特定的轴线一起移动。平移关节可以进行限定,保证其只能沿着某个轴在一定范围内进行移动。还可以设定此关节的马达,连接的物体会以给定的力,以相应的速度进行移动。平移关节经常使用的场景为:

  • 电梯
  • 滑动门

     

    平移关节和旋转关节的属性很类似。只有一些细微的差别。

    下面来详细讲解平移关节的属性和这些属性对平移关节的影响。

    创建平移关节:

    平移关节第一次创建的时候需要先定义b2PrismaticJointDef并进行设置,然后作为参数传入CreateJoint方法,此方法返回b2PrismaticJoint对象。下面先对诸多关节的共有属性进行设置.这些共有属性包括 :关节连接的两个刚体和两个刚体是否发生碰撞。

    b2PrismaticJointDef prismaticJointDef;
    prismaticJointDef.bodyA = bodyA;
    prismaticJointDef.bodyB = bodyB;
    prismaticJointDef.collideConnected = false;


    在讲解关节的属性之前,让我先创建两个刚体。

    CCSize size = CCDirector::sharedDirector()->getWinSize();

    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    b2FixtureDef fixtureDef;
    //让刚体A特别的重
    fixtureDef.density = 10000;
    b2PolygonShape shapeA;
    //刚体A宽为4,高为2
    shapeA.SetAsBox(2,1);
    b2PolygonShape shapeB;
    //刚体B宽为2 高为4
    shapeB.SetAsBox(1,2);

    bodyDef.position.Set(size.width/2/PTM_RATIO-4,size.height/2/PTM_RATIO);
    fixtureDef.shape = &shapeA;
    fixtureDef.filter.categoryBits = uint16(2);
    m_bodyA = m_world->CreateBody(&bodyDef);
    m_bodyA->CreateFixture(&fixtureDef);

    bodyDef.position.Set(size.width/2/PTM_RATIO+4,size.height/2/PTM_RATIO);
    //刚体B特别轻
    fixtureDef.density = 1;
    fixtureDef.shape = &shapeB;
    fixtureDef.filter.categoryBits - uint16(4);
    m_bodyB = m_world->CreateBody(&bodyDef);
    m_bodyB->CreateFixture(&fixtureDef);


    下面讲解属性:

    1.关节轴线(localAxisA)

    根据名字就知道这个关节轴线和刚体A有关系,那么关系是什么呢?关系就是这个轴线是以刚体A的本地坐标系而言的。并且他是一个b2Vec2类型的变量,但是他不是一个点,而是一个向量,仅仅只表示方向。并且是一个单位向量。如果你在设置这个值的时候不是单位向量,则必须调用localAxisA.Normalize()来把此向量转换成一个单位向量.需要再次提醒注意的是:这个属性只表示方向,和刚体A中本地坐标系统中的点没有半毛钱关系.比如这个值为(0,1)表示方向朝上,(0,-1)表示方向朝下.

    下面以一副图来进行说明:

    cocos2d-x box2d物理引擎深入研究 第一篇之平移关节详解(b2PrismaticJoint)

    上图中最右边的图有条红色的虚线.这条虚线为什么要画在刚体A的外面呢?就是为了表示localAxisA和刚体A本地坐标系统中的点没有丝毫的关系.给个(0,1)仅仅表示方向朝上.

     

    2.本地锚点(Local anchors

    和旋转关节的锚点属性类似,他就是通过设置刚体A的锚点和刚体B的锚点,让两个刚体的锚点重合。让两个刚体固定在某一个位置上.见下图片

    cocos2d-x box2d物理引擎深入研究 第一篇之平移关节详解(b2PrismaticJoint)

    上图中,主刚体也就是刚体A 的宽是10高是6,所以锚点(6,-3)就是刚体A的右下角坐标是(5,-3),如果再往右边移动一点也就是(6,-3)这个锚点就在刚体A的外部了.刚体B的宽是2,高是8,所以锚点(-1,-4)就在刚体的左下角。他们的锚点都是以本地坐标系统为前提的.并且原点(0,0)是在刚体的中心位置.因为他们默认的锚点是(0.5,0.5).

    最开始的时候两个刚体创建后在窗口中显示的位置情况就是等号左边的两个刚体。

    当你在创建平移关节给属性localAnchorA = (6,-3),localAnchorB=(-1,-4)赋值之后。两个刚体的位置信息就是上图中等号右边的情况.看是不是两个刚体就在这两个锚点上重合了.是的,简单的说就是把刚体B左下角拖到主刚体也就是刚体A的本地坐标系统中设置的锚点上去.

     

    3.参考角度(reference angle)

    这个角度是刚体B-刚体A的角度值。如果把这个值设置成逆时针旋转5度。也就是prismaticJointDef.referenceAngle= 5 * DEGTORAD;

    注意DEGTORAD的值是 #define DEGTORAD 0.0174532925199432957f。

    效果见下图:

    cocos2d-x box2d物理引擎深入研究 第一篇之平移关节详解(b2PrismaticJoint)

    4.平移关节限制(enableLimit)

    和旋转关节限制不同的是,旋转关节的限制是限制的旋转角度.而平移关节限制的是平移的范围。以米为单位.

    超出lowerTranslation和upperTranslation指定的移动范围,刚体就不会继续平移了。就像有面墙挡住了一样。

     

    5.平移关节马达

    平移关节默认的行为是在没有任何阻力的情况下滑动。如果你想控制物体的运动要么对物体施加力或冲量,

    指定的速度不过是一个速度指标,也意味着关节不能保证一定可以达到这个速度。通过指定关节马达所允许的最大力,你可以控制关节要达到目标速度的加速度,有时候这甚至决定了关节是否能够达到目标速度。

    和旋转关节不通的是,旋转关节用的是力矩,而平移关节用的是力。力矩 = 力*力臂, 力臂是力和旋转轴之间的距离.

     

    先传源代码啊。貌似不可以传附件  CSDN博客纠结啊.