J'ai un programme dans lequel les cercles peuvent rebondir les uns sur les autres. J'ai suivi les instructions d'ici pour faire tourner les vecteurs et mise à l'échelle des grandeurs en fonction de l'angle de collision: http://www.vobarian.com/collisions/2dcollisions2.pdfJe ne trouve pas ce qui ne va pas avec ce calcul de rebond de cercle en python
j'ai écrit ce code en python (l'indice 0 indique la coordonnée 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]]
Le problème c'est que ça marche parfois, mais pas d'autres fois. Quelqu'un peut-il me dire pourquoi? Il semble que si les balles entrent en collision à angle droit, alors leurs trajectoires de sortie s'échangent ou quelque chose. Je l'ai écrit dans le navigateur codeskulptor: http://www.codeskulptor.org/#user39_8q0Xdp3Y4s_2.py
Quelqu'un peut-il signaler où je me suis trompé?
EDIT: Est-ce que ça pourrait être la façon dont je traite la collision? Voici les étapes:
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
qu'est-ce que object2.2 sur votre dernière ligne? –
une faute de frappe :) J'ai le code réel un peu différent d'interagir avec mes classes, j'ai donc dû en réécrire ici. Manqué celui-là! – Apc0243
Si vous voulez juste résoudre le problème et que vous ne vous souciez pas de le résoudre à partir des principes de base, vous pouvez simplement utiliser un moteur physique à la place. –