不会开机的男孩

Box2d 05 RevoluteJoint and b2WeldJoint

| Comments

资料代码,思路来自 raywenderlich。这个只是自己学习时的笔记,非原创。

b2RevoluteJoint

  • 将刚体固定在一个点上,刚体可以围绕这个点旋转
  • 可以提供马达,提供刚体旋转的动力

所以,通过b2RevoluteJoint的第一个特性,我们可以很方便的模拟跷跷板。而第二个特性,我们可以很方便的实现汽车运动,或是弹弓类似的东西,今天实现一个类似疯狂小鸟的demo

创建b2RevoluteJoint很简单,但是里面有一些属性还是让人比较纠结,特别是好多中文blog,不知道是笔误还是无心,都是错的 =, =!

b2RevoluteJointDef armJointDef;
armJointDef.Initialize(groundBody, armBody, b2Vec2(233.0 / PTM_RATIO, FLOOR_HEIGHT / PTM_RATIO));

armJointDef.enableLimit = true;
armJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(9);
armJointDef.upperAngle = CC_DEGREES_TO_RADIANS(75);

armJointDef.enableMotor = true;
armJointDef.maxMotorTorque = 200;
armJointDef.motorSpeed = - 10;

armJoint = (b2RevoluteJoint *)world->CreateJoint(&armJointDef);

这3个很好理解,就是对我们的旋转做限制。单位是弧度。

  • enableLimit
  • lowerAngle
  • upperAngle

这3个稍微不好理解

  • enableMotor: 表示是否开启我们的旋转马达
  • motorSpeed: 表示我们希望马达给我们提供的速度是多少,小于0表示顺时针
  • maxMotorTorque: 表示马达给我们提供的扭矩有多少。

简单的说,就是maxMotorTorque为我们提供改变速度的力。motorSpeed表示我们希望达到的最大速度是多少。

b2WeldJoint

b2WeldJoint又是一个很好理解的连接器。b2WeldJoint通过一个点把2个刚体绑定在一起运动。

b2WeldJointDef weldJointDef;
weldJointDef.Initialize(bulletBody, armBody, b2Vec2(230.0f/PTM_RATIO,(155.0f+FLOOR_HEIGHT)/PTM_RATIO));
weldJointDef.collideConnected = false;

bulletJoint = (b2WeldJoint*)world->CreateJoint(&weldJointDef);

在弹弓实例下,我们可以将炮弹绑定在我们的发射架上,当发射架运动到一定角度时,我们可以释放这个连接器,炮弹就可以射出了。

source code

Comments