Box2D关节——”距离关节”b2DistanceJoint

作者: ladeng6666 分类: Box2D 发布时间: 2012-08-28 22:32 阅读: 4,932

在上一篇文章中,我们初步认识了Box2D中的b2Joint关节类。今天我们开始学习具体的Box2D关节类,即b2Joint的子类。首先我们从b2DistanceJoint类开始。

b2DistanceJoint关节,从它的名字可以猜到距离关节的作用:通过固定长度的关节将两刚体联系到一起,使这两个刚体始终保持一定的距离。可以像想象的出来吗?如果这样解释很难理解,那就想想自行车吧。把自行车的两个轱辘当成刚体,车架就是关节,两个轱辘可以自由的旋转,但是因为有车架的限制,两个轱辘之间始终保持一定的距离。

了解了b2DistanceJoint的定义,下面我们来看看创建过程。在初认识Box2D中的b2Joint关节类中,我们知道所有的关节都可以用initialize方法来创建,b2DistanceJoint也不例外,它的initialize方法结构如下:

方法的每个参数功能如下:

  • bA:即bodyA,关节连接的一个刚体。
  • bB:即bodyB,关节连接的另一个刚体。
  • anchorA:关节的端点A,通常为bodyA的中心位置。
  • anchorB:关节的端点B,通常为bodyB的中心位置。

结合上图来看,两个车轮分别表示b2Distance的连接的两个刚体bA和bB,车轮中的两个红点分别表示关节的两个控制点,即车轮的中心点。

另外还可以用关节的collideConnected属性,设置关节连接的两个刚体之间是否进行碰撞检测。

在下面的示例中,我创建了两个大小不一的圆形刚体,大的为bodyA,小的为bodyB,选择右上角的radio选项,设置A或B为静态刚体,或者两个刚体都是动态刚体,同时给bodyA添加一个角速度,就成了一个简单的”自行车”。

完整的代码和注释如下:

代码中用到了我写的静态类LDEasyBox2D,可以有效的简化代码,具体请参考这里

点击刚体,还可以进行拖动,如果对鼠标拖动刚体,我建议你看看之前的让刚体听我的——鼠标拖动刚体

 源代码下载

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

2条评论
  • zzzz

    2012 年 9 月 14 日 下午 3:10

    如果要将距离关节也变为刚体的话,该怎么做呢?是否有专门的固定关节?

  • wAe]大兵

    2012 年 11 月 15 日 下午 4:38

    拉登,在你的LDEasyBox2D中,
    public static function createWrapWall(world:b2World,canvas:DisplayObject):void {
    var w:Number = canvas.width;
    var h:Number = canvas.height;
    var wallThick:Number = 20;//in pixels

    createBox(world, w / 2, 0, w , wallThick, true);
    createBox(world, w / 2, h, w , wallThick, true);
    createBox(world, 0, h / 2, wallThick, h , true);
    createBox(world, w, h / 2, wallThick, h , true);
    }
    其中的形参2:canvas:DisplayObject, 在主文件中,形参2被实参stage传递,
    有个问题,
    w = canvas.width;
    h = canvas.height;
    实参stage被传递过来后,往往会出现问题。
    w = stage.width;
    h = stage.height;
    我们知道stage.width/stage.height和stage.stageWidth/stage.stageHeight是有所不同的。
    stage.width指的是舞台上所有物体形成的矩形包裹框的长度,stage.height指的是矩形包裹框的高度。
    当舞台上没有物体的时候,stage.width和stage.height为0。
    这样会导致一个bug的出现,就是debugDraw不出来四周的墙壁。
    我很纳闷,你的演示文件中却正常的dubugDraw出来了四周的墙壁。

发表评论

电子邮件地址不会被公开。 必填项已用*标注