2013-01-21 21 views
0

我有一個程序爲我的當前臺球模擬編寫簡單的2D碰撞檢測和處理,但是它是垃圾,我正在尋找一個涉及適當物理的解決方案,即牛頓運動定律coliisions。我有什麼,到目前爲止,它不conserverve勢頭,並簡化了物理是需要在Python中進行2D碰撞處理的解決方案

def collide(ball1,ball2): 
     dx = ball1.x - ball2.x 
     dy = ball1.y - ball2.y 

     dist = (dx)**2+(dy)**2 
     if dist < (ball1.radius + ball2.radius)**2: 

      tangent = atan2(dy, dx) 
      angle = 0.5 * pi + tangent 

      angle1 = 2*tangent - ball1.angle 
      angle2 = 2*tangent - ball2.angle 

      speed1 = ball2.speed*e 
      speed2 = ball1.speed*e 

      (ball1.angle, ball1.speed) = (angle1, speed1) 
      (ball2.angle, ball2.speed) = (angle2, speed2) 

      ball1.x += sin(angle) 
      ball1.y -= cos(angle) 
      ball2.x -= sin(angle) 
      ball2.y += cos(angle) 

和我有什麼運行的碰撞是這樣的,這裏的反彈()是撞到牆上

running = True 
    while running: 
     background() 

     for i,ball in enumerate(balls,1): 
      ball.bounce() 
      ball.move() 
      for ball2 in balls[i:]: 
       collide(ball,ball2) 
      ball.display() 


     pygame.display.flip() 

我仍然很新,所以請改變什麼是無用/愚蠢

+1

你是否在尋找能夠爲你做2D衝突(或者至少簡化事情)的庫的建議,或者你是否因爲教育原因而從頭開始編寫這些建議(在這種情況下,你仍然可能想要查看庫源代碼) – Foon

+0

將出於教育原因,這將是一件好事,從頭開始寫,但我有點新,所以我不知道從哪裏開始。如果有好的圖書館,請在那裏指出我的感謝 – user1998184

回答

1

我記得我做了一個簡單的檯球模擬器,而回來。正如你所提到的,這是爲了教育目的,我會免除你從整個代碼(我也沒有挖掘它的太:))

但基本上,我跟蹤了多長時間已經過去了最後一幀。我用這個時間來找出每個球的新位置,給出每個球的速度向量。對於幀中的碰撞,我必須弄清楚兩個球會在哪個確切時間發生碰撞,然後在該確切時間應用每次碰撞。僞代碼看起來是這樣的:

while running: 
    frame_time_ms = time elapsed since last frame 
    collisions = all collisions that will happen during this frame, with the exact time of collision. (1) 
    while collisions: 
    collision = first collision in collisions 
    collision_time_ms = time of collision (1) 
    move all balls to collision_time_ms 
    collide the two balls in the collision (2) 
    collisions = all remaining collisions after the time of collision (1) 
    move all balls to the end time of the frame 

所以,你需要帶回你的幾何和物理知識找出關鍵公式:

  1. 給定兩個球的開始和結束位置在一幀(或一幀的一部分)中,它們是否碰撞,並且它們在哪一點碰撞。 記得在這裏也包括球的半徑。這會給你的碰撞時間 。
  2. 給定兩個球在準確的碰撞位置,他們的新速度向量將如何看起來像事後。一些提示是使用彈性碰撞,並與它實際上是怎麼彈實驗: http://en.wikipedia.org/wiki/Elastic_collision加分,你 還可以包括球:)

好運的旋轉! =)

0

圓形碰撞的圓很簡單。採取中心點協調,減去它們來確定每個圓之間的距離。

然後,如果距離大於兩個圓的半徑之和,則比他們不碰。如果它們相等,則它們觸摸,如果它們更少,則它們重疊。

簡而言之,如果他們感動,讓他們相互排斥。你可以用幾種方法來做到這一點。如果你跟蹤他們移動的方向,讓他們朝相反的方向移動。

至於牆壁,只需使用每個牆> <語句。所以如果一個圓的位置的x座標小於西牆,那麼它就超過了牆。再次,讓他們擊退牆壁。

Circle Collison非常簡單,但是如果您想要做其他形狀的話,這將非常困難。除非你只是圍繞這些形狀挖坑,或者使用像素完美的碰撞(這是非常高的性能需求。)

如果你想要非常準確的非圓形碰撞,可以得到一個物理引擎。