0

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

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

浮动 FirstAngle = firstArmJoint->GetJointAngle(); secondArmBody->SetTransform(b2Vec2((750.0/PTM_RATIO),(520.0f+100)/PTM_RATIO),hourAngle);

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

发生的情况是第二个主体在图像顶部而不是在锚点处旋转。

有任何想法吗?

4

1 回答 1

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

于 2012-07-28T15:59:21.537 回答