您的位置:首页 > 其它

学习 Box2D 个人笔记(九)b2GearJoint

2013-01-03 02:28 218 查看
齿轮关节就是齿轮 。一个物体转动或运动带动领一个物体转动或运动。

效果如图:





首先:

GearJoint需要两个关节,RevoluteJoint或PrismaticJoint。

所以首先我们要定义一个 RevoluteJoint:

// 转动关节
b2RevoluteJoint * revolutejoint;
b2RevoluteJointDef rjd;
rjd.collideConnected = true;

{
//这是设置 驱动力,以及转动最大的速度
rjd.motorSpeed = -4;
rjd.maxMotorTorque = 40;
rjd.enableMotor=true;
}

rjd.Initialize(groundBody,bodyB,bodyB->GetWorldCenter());//前两个参数设置要转的body和相对的body,第三个指位置。
revolutejoint = (b2RevoluteJoint*)world->CreateJoint(&rjd);
{
//设置limit 让节点在一定的范围内转动
// revolutejoint->SetLimits(0, 3.14/6);
// revolutejoint->EnableLimit(true);

}


接下来 我们要定义一个PrismaticJoint(当然也可以定义两个转动的 两个圆形相互转动)
//限制移动方向的关节
b2PrismaticJoint *prismaticjoint;
b2PrismaticJointDef pjd;
pjd.collideConnected = true;
pjd.Initialize(bodyA, groundBody, bodyA->GetWorldCenter(),b2Vec2::b2Vec2(1,0));
prismaticjoint = (b2PrismaticJoint*)world->CreateJoint(&pjd);

接下来就是最后一步了 .生成b2GearJoint
//齿轮关节
b2GearJoint *gearjoint;
b2GearJointDef gjd;
gjd.bodyA = bodyA;
gjd.bodyB = bodyB;
gjd.joint1 = prismaticjoint;
gjd.joint2 = revolutejoint;
gjd.ratio = -1.0f / (20.0/PTM_RATIO);
gearjoint = (b2GearJoint*)world->CreateJoint(&gjd);

注意这两个body我都没有设置摩擦力,也许有的人想,通过摩擦力来实现齿轮关节的效果可以么  ,可以。
但是那样不方便控制 ratio。也就是说移动的比例。还有方向。
ok。   Joint 方面的基本都完事了 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: