2014-12-24 1 views
2

box2d와 libgdx를 사용하여 안드로이드 게임에서 레버를 만들려고합니다. 게임이 시작되면 레버의 두 플랫폼이 완벽하게 균형을 이루고 있으며 레버의 한 플랫폼에서 상자를 움직이면 예상대로 작동하지만 몸을 움직이면 두 플랫폼이 이전과 같이 다시 균형을 이루지 못합니다 .도르래 Joint odd behavior Box2D

private Body setupShape(World world, float cx, float cy, float cw, float ch){ 
    Body ptf; 
    PolygonShape shape = new PolygonShape(); 
    shape.setAsBox(cw/2, ch/2); 
    FixtureDef fdef = new FixtureDef(); 
    fdef.shape = shape; 
    fdef.density = 1.0f; 
    fdef.friction = 1.0f; 
    fdef.restitution = 0.0f; 
    BodyDef bd = new BodyDef(); 
    //bd.allowSleep = false; 
    bd.position.set(cx, cy); 
    bd.fixedRotation = true; 
    ptf = world.createBody(bd); 
    //lever.setGravityScale(10); 
    ptf.createFixture(fdef); 
    ptf.setType(BodyDef.BodyType.DynamicBody); 
    ptf.setUserData("Lever"); 
    shape.dispose(); 
    return ptf; 
} 

그리고 "PulleyJoint"를 사용하여 레버를 만들기위한 코드 :

나는 2 플랫폼을 만들려면이 코드를 사용하고

PulleyJointDef pulleyDef = new PulleyJointDef(); 
    Vector2 bodyoneanchor = new Vector2(Constants.Pixel2SIf(360), Constants.Pixel2SIf(400)); 
    Vector2 bodytwoanchor = new Vector2(Constants.Pixel2SIf(660), Constants.Pixel2SIf(400)); 
    pulleyDef.initialize(bodyA, bodyB, bodyoneanchor, bodytwoanchor, bodyA.getWorldCenter(), bodyB.getWorldCenter(), 1); 
    world.createJoint(pulleyDef); 
내가 좋아하는 것

가 잘못 알고 내 코드 및 레버를 다시 움직여 레버 균형을 다시 잡는 방법에 대해 설명합니다. 당신이 그 문제를 해결 나를 도울 수 있다면 매우 이해할 수있을 것이다 http://costheta.net/quest.png

:

여기에 더 명확하게 내 문제를 설명하는 도면이다.

감사합니다. UPDATE

: 여기 프리즘 관절을 추가 한 후 내 새 코드입니다 :

PulleyJointDef pulleyDef = new PulleyJointDef(); 
    Vector2 bodyoneanchor = new Vector2(Constants.Pixel2SIf(360), Constants.Pixel2SIf(400)); 
    Vector2 bodytwoanchor = new Vector2(Constants.Pixel2SIf(660), Constants.Pixel2SIf(400)); 
    pulleyDef.initialize(bodyA, bodyB, bodyoneanchor, bodytwoanchor, bodyA.getWorldCenter(), bodyB.getWorldCenter(), 1); 
    world.createJoint(pulleyDef); 

    BodyDef bd0 = new BodyDef(); 
    bd0.position.set(bodyoneanchor.x, bodyoneanchor.y); 
    Body ptf0 = world.createBody(bd0); 
    PrismaticJointDef pjd0 = new PrismaticJointDef(); 
    pjd0.initialize(ptf0, bodyA, ptf0.getWorldCenter(), new Vector2(0, 1)); 
    pjd0.motorSpeed = 200f; 
    pjd0.maxMotorForce = 30.0f; 
    pjd0.enableMotor = true; 
    pjd0.lowerTranslation = -Math.abs(bodyA.getWorldCenter().y - bodyoneanchor.y); 
    pjd0.upperTranslation = 0;//Math.abs(bodyA.getWorldCenter().y - bodyoneanchor.y); 
    pjd0.enableLimit = true; 
    world.createJoint(pjd0); 

    BodyDef bd1 = new BodyDef(); 
    bd1.position.set(bodytwoanchor.x, bodytwoanchor.y); 
    Body ptf1 = world.createBody(bd1); 
    PrismaticJointDef pjd1 = new PrismaticJointDef(); 
    pjd1.initialize(ptf1, bodyB, ptf1.getWorldCenter(), new Vector2(0, 1)); 
    pjd1.motorSpeed = 200f; 
    pjd1.maxMotorForce = 30.0f; 
    pjd1.enableMotor = true; 
    pjd1.lowerTranslation = -Math.abs(bodyB.getWorldCenter().y - bodytwoanchor.y); 
    pjd1.upperTranslation = 0;//Math.abs(bodyB.getWorldCenter().y - bodytwoanchor.y); 
    pjd1.enableLimit = true; 
    world.createJoint(pjd1); 

답변

1

그들은해야하지 다시 균형 각면의 무게가 동일하고, 긴장이 결과, 서로 상쇄하기 때문에 더 운동 (일부 문자열을 얻고 실생활에서 설정을 구축).

균형을 다시 잡으려면 초기 위치와 상자 중심에 0의 길이로 각 플랫폼에 스프링을 추가하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는 정말로 물리학 자 아니야. 나는 그것을 몰랐다. 그러나 각 플랫폼에 프리즘 접합을 추가하는 스프링을 의미합니까? – Ramywhite

+0

@Ramywhite 소프트 거리 조인트 (플랫폼을 회전시키고 왼쪽에서 오른쪽으로 이동하려는 경우) 또는 부드러운 프리즘 조인 (플랫폼을 회전시키지 않고 위로/아래로 이동하려는 경우). –

+0

코드를 수정하고 2 개의 프리즘 접합을 플랫폼에 추가했지만 이제는 전혀 움직이지 않습니다. 새 코드로 내 질문을 편집했습니다. – Ramywhite