2013-07-01 95 views
0

我已经创建了一个带电机的转动连接点,并且上限为较低的&。我想知道如何使revoluteJoint在较低的&上限之间摆动。目前,身体从较低的位置向上限摆动,然后停止。任何帮助将不胜感激。这是密码如何制作一个revoluteJoint振动?

final RevoluteJointDef revoluteJointDef2 = new RevoluteJointDef(); 
    revoluteJointDef2.initialize(legBody, circleBody1, circleBody1.getWorldCenter()); 
    revoluteJointDef2.enableMotor = true; 
    revoluteJointDef2.enableLimit = true; 
    rj2 = (RevoluteJoint) this.mPhysicsWorld.createJoint(revoluteJointDef2); 
    rj2.setMotorSpeed(2); 
    rj2.setMaxMotorTorque(10); 
    rj2.setLimits((float)(30 * (Math.PI)/180), (float)(270 * (Math.PI)/180)); 

如何制作关节反向并再次重复?

回答

0

我能够通过实现计时器任务创建一个摆动revoluteJoint。每当定时器发生火灾时,我都会反转电机转速,并使转动连接在较低的&上限之间振荡。

class RemindTask extends TimerTask { 
     RevoluteJoint rj1;; 
     RemindTask(RevoluteJoint rj){ 
     rj1 = rj; 
    } 
    @Override 
    public void run() { 
     Log.d("x","x" +"Reversing motor"); 
     reverseMotor();   
    } 

    public void reverseMotor(){ 
     rj1.setMotorSpeed(-(rj1.getMotorSpeed())); 
     rj1.setMaxMotorTorque(100); 

    } 
} 

的链接,实现和代码,请在我的博客文章http://gigadom.wordpress.com/2013/07/02/simulating-an-oscillating-revolutejoint-in-android/

0

做的每一步:

if ((joint->GetUpperLimit() - joint->GetJointAngle()) < yourSomeAlpha) 
{ 
    // Reached upper limit, go to another limit 
    joint->SetMotorSpeed(-2); 
} 
if ((joint->GetJointAngle() - joint->GetLowerLimit()) < yourSomeAlpha) 
{ 
    // Reached lower limit, go to another limit 
    joint->SetMotorSpeed(2); 
} 

参数yourSomeAlpha选择实验。试试,例如,0.01。

+0

帕维尔看一看,谢谢您的回答。我不确定你在每一步的意思。当我执行代码时,它会运行到上限。另外,如果我检查joint-> GetUpperLimit,它将在上面的代码中获得预定义的上限值270,并且不会返回关节的当前角度。我们如何检查? –

+0

每个时间步骤都是b2World :: Step的任何两次调用之间的平均值。换句话说,游戏的每一帧。联合的当前角度返回GetReferenceAngle,而不是GetUpperLimit。 – Pavel