box2d中的旋转关节的恒定旋转

我想有一条线连接到一个位置,并不断旋转(具有相同的速度),最大45到-45度(即我想它像一个绳子来回摆动90度)。

这是可能的,或者我应该使用非box2d对象来做到这一点(作弊box2d引擎)?

这当然是可能的,但是你可能会做一些testing来find所需的确切力量,以使其满意。

几乎所有的关节都可以有一个“电机”,您可以启用它并对关节施加一个力。 所以在你的情况下,你必须设置:

myJoint->EnableMotor(true); myJoint->SetMaxMotorTorque(yourTorque); myJoint->SetMotorSpeed(yourMotorSpeed); 

你将不得不尝试扭矩..我建议你从一个非常高的价值开始,以便电机不会受到其他物体或物体附着到关节太多的阻碍。 另外,如果要限制关节移动,则必须启用关节限制。 在下面的例子中,关节将被限制在-90到90度。

 myJoint->EnableLimit(true); myJoint->SetLimits(-90.0f * DEGTORAD, 90.0f * DEGTORAD); 

剩下的唯一要做的就是检查接头是否达到极限,然后切换方向。 所以在你的更新循环中你可以做如下的事情:

 float speed = myJoint->GetMotorSpeed(); float angle = myJoint->GetJointAngle(); if((speed < 0.0f && angle <= myJoint->GetLowerLimit()) || (speed > 0.0f && angle >= myJoint->GetUpperLimit()) ){ // reverse motor speed whenever we overshoot limits myJoint->SetMotorSpeed(speed * -1.0f); } 

这应该让你的关节摆动从-90到90度。

如果你想让它以恒定的速度旋转,那么没有理由使用物理引擎。 简单地画一条线然后另一条。

但是,如果你真的对摇摆动作感兴趣,恒速不会给出非常现实的解释。 查看摆动运动 ,查看摆动物体运动背后的math运算。 即使有摆锤,也不需要物理库来模拟它。 你没有提到你会有任何的交互,所以只需使用一个简单的谐波运动公式来运动。