2010-09-05 92 views
2

我想寫一個C#和XNA中的乒乓球,用摩擦力和反彈。我試圖實施碰撞作爲described by Garet Rees in a previous question乒乓球中的「現實」碰撞

下面是基本的算法,我使用的乒乓球:

  1. 單獨的碰撞對象,使他們不再發生碰撞。
  2. 獲取碰撞響應的表面法線。
  3. 計算新的速度 - 這是我的問題。

這是我目前使用的碰撞響應代碼:

Vector2 normalizedVelocity = Velocity; 
normalizedVelocity.Normalize(); 

Vector2 u = -Velocity * Vector2.Dot(normalizedVelocity, normal); 
Vector2 w = Velocity - u; 

Velocity = w - u; 

出於測試目的,我不承擔任何摩擦和完美的彈性。這段代碼工作正常,只是在一個方向上移動物體,如:

Velocity.X = 100; 
Velocity.Y = 0; 

Velocity.X = 0; 
Velocity.Y = 100; 

但是,當我與對角線移動球,如測試:

Velocity.X = 100; 
Velocity.Y = 40; 

由此產生的速度不是我所假設的。

回答

4

我想你想要做的

Velocity = Velocity + 2 * normal * Vector2.Dot(Velocity, normal); 

(其中normal是歸一化表面法線指向出球與碰撞表面

不是

Vector2 u = -Velocity * Vector2.Dot(normalizedVelocity, normal); 
Vector2 w = Velocity - u; 

Velocity = w - u; 

因爲velocity * Vector2.Dot(...)的方向與速度相同,但彈跳時彈球通常會改變方向...

如果你還想要摩擦,你將不得不模擬球的旋轉,公式會變得更加複雜。

1

您應該簡單地在與牆壁,窗戶等碰撞時顛倒x或y值(更改符號)。