设置b2revolutejoint的角度

时间:2012-07-28 14:27:11

标签: ios cocos2d-iphone box2d-iphone

根据我所读到的,在Box2d中,您可以获得与GetJointAngle函数的旋转关节的角度,但在尝试设置角度时,成员m_referenceAngle受到保护。角度不能以编程方式设置吗?

我发现我可以将角度从一个关节应用到另一个关节:

float FirstAngle = firstArmJoint-> GetJointAngle(); secondArmBody->的setTransform(b2Vec2((750.0 / PTM_RATIO),(520.0f + 100)/ PTM_RATIO),hourAngle);

我把它放在ccTouchesMoved中,这样当用户拖动第一个对象(从中检索到FirstAngle)时,第二个对象(secondArmBody)也会被移动。

第二个身体在图像顶部而不是在锚点处旋转。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

SetTransform()可用于设置身体的位置和旋转。这完全独立于身体上的任何关节。例如,如果您想确保在给定时刻身体完全正直,您可以致电

body->SetTransForm(body->GetPosition(), 0);

将0作为角度值(直立)。我从来没有尝试过这个有关节的身体,但我怀疑它会正常工作。

当我遇到必须以某个角度制作旋转关节点的问题时,我通过在关节上启用电机并调节电机速度直到角度与我想要的角度匹配来解决它。这模拟了关节的逼真运动。例如:

创建联合

b2RevoluteJointDef armJointDef;
armJointDef.Initialize(body1, body2,
    b2Vec2(body1->GetPosition().x,
    ((body1->GetPosition().y/PTM_RATIO));
armJointDef.enableMotor = true;
armJointDef.enableLimit = true;
armJointDef.motorSpeed = 0.0f;
armJointDef.maxMotorTorque = 10000.0f;
armJointDef.lowerAngle = CC_DEGREES_TO_RADIANS(lowerArmAngle);
armJointDef.upperAngle = CC_DEGREES_TO_RADIANS(upperArmAngle);
_world->CreateJoint(&armJointDef);

指向关节

float targetAngle = SOME_ANGLE;
b2JointEdge *j = body->GetJointList();
b2RevoluteJoint *r = (b2RevoluteJoint *)j->joint;
if(r->GetAngle() > targetAngle){
    r->SetMotorSpeed(-1);
} else { r->SetMotorSpeed(1); }

基本上,您可以看到目标角度所在的当前角度的哪一侧,然后设置电机速度以使接头以正确的方向移动。希望有所帮助!

http://www.box2d.org/manual.html