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