用马达关节创建Box2D锁链效果

作者: ladeng6666 分类: Box2D 发布时间: 2012-11-25 12:46 阅读: 8,942

今天我们来学习Box2D锁链效果。这个效果并不难,记得我们学过的Box2D 关节——”马达关节” b2RevoluteJoint吗?锁链效果其实就是用多个b2RevolueJoint连接多个刚体,很简单吧!

简单在用多个关节连接多个刚体,难也难在这里。我们还是先来看看效果吧。在下面的效果中我创建了两个锁链,一个是小桥,另一个是连接了一个圆形刚体的锁链。鼠标可以点击并拖动下面的刚体。

Sorry, either Adobe flash is not installed or you do not have it enabled

看过效果之后,我想你肯定也想到了,要用for循环来创建锁链。要用for循环就要有可以重复执行的过程,仔细想想这个过程并不难。

创建当前的刚体body,指定节点的位置anchor,创建节点为anchor的关节,链接当前刚体body和前一个刚体preBody。如下图所示。图中虚线框内是fox循环要重复执行的过程。anchor1用来连接preBody和Body。相信可能有人会跟我一样,犯下面的错误,把关节点设置为body的中心点。这样旋转后,会出现图中下面的效果。因为preBody和body都是围绕anchor1旋转的嘛,想想风扇效果?!

正确的做法是像下图一样,创建当前刚体时body时,让它偏移anchor1一点,偏移多少呢?最好是刚体的一半,这样节点就移到了刚体的边缘处了。旋转之后就会像图中下面的效果一样自然了。

另外设置刚体的宽度为两个节点之间的间距,这样刚体之间会紧密相连,效果就跟上的SWF示例一样了!

完整的代码和注释如下:

值得注意的是第121行和139行,将关节的起点和终点设置成了GetGroundBody()返回的刚体,用来固定住这两个位置,模拟小桥的效果。关于GetGroundBody()的用法请参考Box2D如何固定动态刚体

源文件下载地址

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

13条评论
  • vpen

    2012 年 11 月 25 日 下午 2:07

    哈哈。最近教程更新挺快的~

  • 一一遥遥

    2012 年 11 月 30 日 下午 9:15

    拉登兄,怎么使用键盘控制世界中物体的旋转,以中心点为旋转。

    1. ladeng6666

      2012 年 12 月 1 日 下午 7:19

      设置刚体的角速度就好了,查一下API我记得有这么个函数的

  • cailvenqq

    2012 年 12 月 3 日 上午 11:59

    拉登兄,你好,想请教一下,如何让一些物体的碰撞给过滤掉。我最近做了个东西就如同你的“桥”的做法,我做了4跟单头锁定的飘带并加了关节,但我不希望2根飘带之间碰撞,但同时又希望飘带自身是联动的。我尝试了简历几个世界但失败了,你能教教我怎么实现吗?谢谢

    1. ladeng6666

      2012 年 12 月 3 日 下午 9:06

      你应该已经在我的网站上找到相关的教程了,希望你能继续关注。

  • 简溪

    2012 年 12 月 13 日 下午 4:38

    一个节点可以创建多个关节吗?

    1. ladeng6666

      2012 年 12 月 13 日 下午 9:18

      不可以,一个关节只能连接两个关节!

  • 简溪

    2012 年 12 月 14 日 下午 7:36

    您好,请问怎样隐藏关节?
    谢谢您的回答

    1. ladeng6666

      2012 年 12 月 14 日 下午 9:14

      谢谢你的关注,隐藏关节有两种方法,一种是有b2DebugDraw,这时可以通过设置b2DebugDraw的绘制选项可以设置,具体可以参考b2DebugDraw到底是什么,如果没有b2DebugDraw的话,不会只关节的userData就可以了。

  • Pingback: 【HTML5物理小Demo】用Box2dWeb实现锁链+弹簧效果 | riaos
  • Pingback: [@Yorhom]HTML5物理小Demo:用Box2dWeb实现锁链+弹簧效果 | 天天三国杀
  • Pingback: 【HTML5物理小Demo】用Box2dWeb实现锁链+弹簧效果 | 游戏开发者
  • 饶忠雄

    2015 年 7 月 21 日 下午 12:05

    请教,我做了一个绳索桥,绑定方法如下,但是当我的主角走在桥上的时候,绳索就会断成一节一节的。。 ,怎么破?

    b2RevoluteJointDef jointDef;
    jointDef.Initialize(body1, body2, body1->GetWorldPoint(ToMeter1(anchor1)));
    m_world->CreateJoint(&jointDef);

发表评论

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