2010-11-12 140 views
2

我一直在C#中編寫一個簡單的程序,其中一個 [X,Y]座標是週期遞增的。2D遊戲物理矢量問題

我已經設法實現了一個碰撞檢測方法,但我試圖確定如何在一個角度反射球沿着相同的線性路徑反彈回來。

dx = -dx //This bounces the ball back along the same linear path 
dy = -dy 

解決方案 三角

theta = range between 0<theta<=360 depending on where it bounced 
x = cos(theta)*time 
y= sin(theta)*time 

回答

9

牛頓物理學的整點是它是不是隨機,它是確定性。如果您將相同的球以相同的角度以相同的速度和相同的旋轉角度拋向同一牆壁,則每次都會到同一個地方。

這種程序對於編程和物理學都是一個非常好的學習機會。我鼓勵你做的是先寫一個模擬非常簡單的彈跳的程序。正如你所注意到的,當一個物體直線向下移動並碰到一個水平面時,你可以將反彈建模爲簡單地反轉垂直速度分量。只要做對了;沒有引力,沒有任何東西。這是一個很好的開始。

然後嘗試以同樣的方式添加水平牆壁的反彈。

然後嘗試添加與水平或垂直方向對齊的而不是的牆壁反彈。這就是你將不得不學習矢量和三角函數如何工作的地方,因爲你必須通過傾斜地撞擊牆壁來計算球的速度變化。

然後添加重力。然後增加空氣的摩擦力。然後添加球可以旋轉的事實。增加彈性,以便您可以模擬球的變形。

一旦你達到那一點,如果你想引入隨機性,你將能夠弄清楚如何去做。例如,你可能會引入隨機性,說:「當球撞擊牆壁並變形時,我會引入一個隨機元素,使其變形變化0-10%」。這將改變模擬如何反彈球。您可以嘗試不同種類的隨機性:例如,添加隨機氣流。

2

只要它是一個完美的表面不會反彈隨機一個完美的球。矢量和三角都不會給你任何隨機性。

+1

不!基本物理學不是隨機的。你需要量子物理學。或者只是將你的參數(反射角)乘以一些隨機係數。 ;) – AndreKR 2010-11-12 22:57:34

+2

雖然這是真的,但這並沒有回答這個問題。 – 2010-11-12 23:09:19

3

你必須自己添加隨機性。爲了改變你的問題:「確定性地,它以角度θ反彈,我怎樣才能讓它在角度θ+ε上反彈,其中ε是一些隨機值?」

要旋轉矢量,請參見this。你只需指定theta。

僞代碼:

RotateVector(vec): 
    bounce_vec = [-vec.x vec.y]; //deterministic answer is negative x, normal y 
    bounce_angle = acos(dot(vec,bounce_vec)/(norm(vec)*norm(bounce_vec))); 
    modified_angle = bounce_angle + random_number(); 
    ca = cos(modified_angle); 
    sa = sin(modified_angle); 
    rotation_matrix = [ca -sa; sa ca]; 
    return rotation_matrix * vec; 

3行使用law of cosines找出角度。在第4行中,該角度被隨機修改。該函數的其餘部分將以新角度旋轉原始矢量。

0

「隨機地,雖然適用於物理的基本定律」似乎是一種矛盾。然而...

如果你想讓它在隨機方向反彈,同時保持其當前速度,你可能會做這樣的事情(僞):

  • 第一,超生規範的方式(dx = -dx或dy = -dy取決於碰撞)
  • 然後將dx和dy轉換爲極座標(theta和r)
  • 抖動theta少量(+或 - 幾度,根據你的口味)
  • 確保THETA沒有標題到牆上的,你只是反彈
  • 轉換THETA和r回到dx和dy

,這將是節約標勢頭。

+2

P.S.正如@Xodarap所說,您可以使用旋轉矩陣,而不是轉換爲極座標。不直觀但更高效。 – LarsH 2010-11-12 23:04:48