齿轮关节就是齿轮 。一个物体转动或运动带动领一个物体转动或运动。
效果如图:
首先:
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 方面的基本都完事了 .