2012-10-26 4 views
0

나는 box2dweb을 사용하여 2D에서 자동차와 비슷한 것을 만들려고합니다. 나는 차체와 두 개의 동그라미를위한 상자를 가지고 있는데, 바퀴와 같이 회전 조인트에 의해 연결되어있다. 모든 것이 잠시 동안 잘 작동하지만 바퀴의 중심과 부착 된 상자의 점 사이에 간격이 점차 커집니다. 솔버에 대한 반복을 더 많이 설정해도 도움이되지 않으며 조만간 바퀴가 상자에서 완전히 빠져 나옵니다. 그것은 어떤 종류의 누적 된 오류처럼 보입니다. 또한 바퀴가 충돌하여 땅에 충돌하는 것이이 문제의 가장 큰 원인입니다. 처음에는 왼쪽 그림에서처럼,하지만 난 바닥에 큰 공을 통해 몇 번을 운전 한 후, 그 방법 우측 그림에서와 같이 가져오고 유지 : 내가 사용Box2dWeb 회전 조인트 "stretching"

Left: initial state, right: after I drive it over the big circle several times.

을 이전 box2djs 라이브러리 이전에이 문제가있는 것 같지 않았습니다. 문제는 내가 코드를 box2dweb에 이식 한 후에 나타났습니다. 이 두 도서관에서 일들이 어떻게 만들어지는 지에는 몇 가지 차이점이 있습니다. 그래서 나는 뭔가를 놓쳤을 것입니다. 그러나 무엇을 모르겠습니다.

상자의 코드 : 바퀴를 들어

function createBox(world, x, y, width, height) 
{ 
    var fixDef = new b2FixtureDef; 
    fixDef.density = 1.0; 
    fixDef.friction = 1.0; 
    fixDef.restitution = 1.0; 

    var bodyDef = new b2BodyDef; 
    bodyDef.type = b2Body.b2_dynamicBody; 
    bodyDef.position.x = x; 
    bodyDef.position.y = y; 

    fixDef.shape = new b2PolygonShape; 
    fixDef.shape.SetAsBox(width, height); 

    var b = world.CreateBody(bodyDef); 
    b.CreateFixture(fixDef); 
    return b; 
} 

(거의 같은,이 생성을 제외하고 원) : 그래서

var jointDef_rear = new b2RevoluteJointDef(); 
jointDef_rear.Initialize(rear_wheel, car_body, rear_wheel.GetPosition()); 
jointDef_rear.maxMotorTorque = 10.0; 
jointDef_rear.enableMotor = true; 

rear_joint = world.CreateJoint(jointDef_rear); 

var jointDef_front = new b2RevoluteJointDef(); 
jointDef_front.Initialize(front_wheel, car_body, front_wheel.GetPosition()); 
jointDef_front.maxMotorTorque = 10.0; 
jointDef_front.enableMotor = true; 

front_joint = world.CreateJoint(jointDef_front); 

:

function createBall(world, x, y, r) 
{ 
    var fixDef = new b2FixtureDef; 
    fixDef.density = 1.0; 
    fixDef.friction = 1.0; 
    fixDef.restitution = 1.0; 

    var bodyDef = new b2BodyDef; 
    bodyDef.type = b2Body.b2_dynamicBody; 
    bodyDef.position.x = x; 
    bodyDef.position.y = y; 

    fixDef.shape = new b2CircleShape(r); 

    var b = world.CreateBody(bodyDef); 
    b.CreateFixture(fixDef); 
    return b; 
} 

그리고 관절

"내 코드가 뭐가 잘못 됐냐"고 묻는 것이 싫어 .- 내가 뭘 잘못 했니?

+0

코드를 업로드하여 실전에서 볼 수 있습니까? – Shekhar

+0

예. http://lazunin.com/ask/rotate.html 스트레칭을 보는 가장 빠른 방법은 "A"와 "D"키를 여러 번 사용하여 앞바퀴를 땅바닥에 대고 타는 것입니다 (ASD는 뒷바퀴를 제어합니다, JKL - 앞 바퀴. 여기 http://lazunin.com./poro/box2dweb 대신 box2djs를 사용하고 전혀 스트레칭을하지 않는 또 다른 예가 있습니다 – Headcrab

답변

0

이 문제가 제로 위치 반복에 의해 발생했다 나타납니다

world.Step(dt, iterations); 

이 Box2Djs의 이전 버전에서 함수의 프로토 타입이 정확히 같았다 것으로 보인다. 최신 버전에서는, 그러나, 모든 매개 변수 world.Step(dt, iterations) 다음, world.Step(dt, iterations, 0)에있는 여전히 "일종의"작품과 동일한 것처럼, 그것을 옛날 방식을 호출 0을 디폴트로

function (dt, velocityIterations, positionIterations) 

로 변경,하지만되었다 연결된 몸체의 상대 위치가 제대로 해석되지 않습니다. 내가 world.Step(dt, iterations, iterations)처럼 전화를 걸려고했는데 갑자기 반복 횟수가 3과 같이 적어도 모든 것이 고쳐졌습니다.

0

대부분의 이유는 신체의 질량입니다.

Box2D의 maunal는 말한다 : 가벼운 몸이 무거운 몸을 지원하고있는 경우 관절로 연결되어 몸의
체인을 늘릴 수 있습니다. 예를 들어, 가벼운 무게의 체인에 연결되는 난파구가 안정적이지 않을 수 있습니다. 질량비가 10 : 1이되면 안정성이 저하됩니다.

앞 바퀴가 너무 작아서 다른 신체와 같은 밀도를 가지고 있습니다. 그래서 질량은 차체의 질량과 매우 다릅니다. 예를 들어 차체 밀도 0.2, 후륜 밀도를 0.5 이상, 밀도 앞바퀴를 1.5 이상으로 설정하십시오. 또는 각자의 질량 매뉴얼을 b2Body::SetMassData으로 설정하는 것이 좋습니다. 내 생각 엔 바퀴를 더 무겁게 만드는 것이 낫다.

+0

나는 이것을 시도했지만 도움을받지 못했습니다. 그들은 여전히 ​​늘어나고 아주 우스 꽝합니다. – Headcrab