2011-08-03 3 views
3

여러분, 내가 공을 각도로 벽 안타 충돌에 특정 동작을 구현하기 위해 노력하고있어Box2D의

사용하여 반사 각도를 감소. 나는 볼을 최대한의 속도로 유지하기를 원하지만, 반사 각도가 다소 음소거되어 있기 때문에 오히려 그것이 반사 된 방향으로 되돌아 가도록하고 싶습니다.

저는 마찰, 제동 및 손해를 가지고 놀았지만 아무 것도 돌아 오는 바운스 각도에 변화를주지는 않습니다.

누군가 내가 할 수있는 일을하기 위해 box2d를 얻을 수있는 방법을 알고 있습니까? 도움을 반사

image http://i.stack.imgur.com/lMwLN.png

볼 각도는

감사합니다,! ken

+0

내가 Box2D의에 대해 아무것도 몰라 의미하지만, 물리학의 관점에서, 바운스에 영향을 미치는 일 두 가지가 무엇인지 이해할 수 있기를 바랍니다 : (1) 벽에 부딪히는 것에 따른 운동 에너지의 손실은 가장 왼쪽 방향으로 볼을 감속시키고, (2) 볼의 아래쪽 마찰은 볼을 아래 방향으로 감속시킵니다. 확실하지는 않지만 어떤 경우에는 그 효과가 서로 가려져 마찰이나 KE의 손실이없는 것처럼 대략 동일한 각도의 반사를줍니다. –

+0

예, Box2D에 물리적인 동작을 변경하도록 요청하고 있음을 알고 있습니다. 내 경우에는 마찰이없는 벽을 때리는 마찰없는 공을 사용하여 속도가 떨어지지 않습니다. –

+0

아마도 가장 좋은 방법은 충돌이 처리 된 후 자신의 충동을 추가하는 것입니다. PostSolve에서 충돌 법선 벡터와 접선 벡터를 구할 수 있습니다. 이들 중 일부 조합을 통해 만든 충동은 트릭을 수행해야하지만 올바른 금액을 계산하면 스스로 해결할 수 있습니다. PostSolve는 하나의 충돌에 대해 여러 단계의 시간 간격으로 호출 될 수 있습니다. 그러나 한 번만 추가해야합니다. EndContact에서 나는 당신이 만들고있는 것과 어떻게 다소 음소거가되어 있는지에 대해 궁금합니다. – iforce2d

답변

2

먼저 세계에서 contactListener를 설정 한 다음 볼과 벽 사이의 충돌을 정확하게 확인할 수 있습니다. 둘째, 충돌 지점을 찾으십시오. 마지막으로 충돌 지점과 차체 중심 간의 각도를 계산하십시오.

void contactListener::BeginContact(b2Contact *contact) 
{ 
    //find out the collision between the ball and the wall. 
    .... 

    //find out the collision point 
    b2WorldManifold worldManifold; 
    contact->GetWorldManifold(&worldManifold); 
    b2Vec2 collisionPoint = worldManifold.points[0]; 

    //calculate the angle between collision point and body center. 
    b2Vec2 bodyCenter = body->GetWorldCenter; 
    ... 
} 

으로 난 당신이 내가

관련 문제