我有一個程序,其中的圓圈可以互相反彈。我跟着從這裏的指示用於旋轉向量以及基於所述碰撞角度縮放幅度:http://www.vobarian.com/collisions/2dcollisions2.pdf我無法找到python中的此圓圈反彈計算有什麼問題
我在python寫這個代碼(0索引指示的x座標):
norm_vect = [(object2.pos[0] - object1.pos[0]), (object2.pos[1] - object1.pos[1])]
unit = sqrt((norm_vect[0]**2) + (norm_vect[1]**2))
unit_vect = [float(norm_vect[0])/unit, float(norm_vect[1]) /unit]
tan_vect = [-unit_vect[1], unit_vect[0]]
vel1 = object1.vel
vel2 = object2.vel
vel1_norm = vel1[0] * unit_vect[0] + vel1[1] * unit_vect[1]
vel1_tan = vel1[0] * tan_vect[0] + vel1[1] * tan_vect[1]
vel2_norm = vel2[0] * unit_vect[0] + vel2[1] * unit_vect[1]
vel2_tan = vel2[0] * tan_vect[0] + vel2[1] * tan_vect[1]
new_vel1_norm = (vel1_norm * (object1.mass - object2.mass) + 2 * object2.mass * vel2_norm)/(object1.mass + object2.mass)
new_vel2_norm = (vel2_norm * (object2.mass - object1.mass) + 2 * object1.mass * vel1_norm)/(object1.mass + object2.mass)
new_norm_vect1 = [new_vel1_norm * float(unit_vect[0]), new_vel1_norm * float(unit_vect[1])]
new_norm_vect2 = [new_vel2_norm * float(unit_vect[0]), new_vel2_norm * float(unit_vect[1])]
new_tan_vect1 = [new_vel1_norm * float(tan_vect[0]), new_vel1_norm * float(tan_vect[1])]
new_tan_vect2 = [new_vel2_norm * float(tan_vect[0]), new_vel2_norm * float(tan_vect[1])]
# Now update the object's velocity
object1.vel = [new_norm_vect1[0] + new_tan_vect1[0], + new_norm_vect1[1] + new_tan_vect1[1]]
object2.vel = [new_norm_vect2[0] + new_tan_vect2[0], + new_norm_vect2[1] + new_tan_vect2[1]]
問題有時它有效,但不適合其他時間。誰能告訴我爲什麼?看起來好像球是以正確的角度相撞,然後他們的出口軌跡交換了什麼。我在codekulptor瀏覽器中寫道:http://www.codeskulptor.org/#user39_8q0Xdp3Y4s_2.py
任何人都可以指出我出錯的地方嗎?
編輯:它可能是我處理碰撞的方式嗎?這裏是步驟:
1) Draw the balls on the screen
2) Create set of unique pairs of collidable objects
3) For each ball, move the ball's position 1 frame forward according to the velocity:
->1) Check to see if the ball is hitting a wall
->2) For each pairset, if the ball in question is a member of the pair:
-->1) If distance between centers is less than sum of radii:
-->1) Calculate rebound trajectories
---2) Find N such that position + rebound trajectory *N is out of collision zone
你最後一行的object2.2是什麼? – 2015-03-19 04:04:16
一個錯字:)我有實際的代碼有點不同於與我的類互動,所以我不得不在這裏重寫一些。錯過了那一個! – Apc0243 2015-03-19 04:40:24
如果你只是想解決這個問題,不關心從第一原理解決它,那麼你可以使用物理引擎來代替。 – 2015-03-19 04:47:39