2011-08-03 62 views
3

Folk,使用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; 
    ... 
} 

我希望你能明白我的意思