Ich habe ein Programm, wo Kreise in einander bouncen können. I folgte den Anweisungen von hier für die Vektoren zu drehen und die Größen Skalierung basierend auf der Kollisionswinkel: http://www.vobarian.com/collisions/2dcollisions2.pdfIch kann nicht finden, was mit dieser Circle-Bounce-Berechnung in Python falsch ist
ich diesen Code in Python geschrieben (der 0-Index der angibt x-Koordinate):
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]]
Das Problem ist, dass es manchmal funktioniert, aber nicht zu anderen Zeiten. Kann mir jemand sagen warum? Es sieht so aus, als ob die Bälle im rechten Winkel kollidieren, dann tauschen ihre Ausgangsbahnen oder etwas anderes. Ich schrieb dies in Codeskulptur-Browser: http://www.codeskulptor.org/#user39_8q0Xdp3Y4s_2.py
Kann jemand darauf hinweisen, wo ich falsch gelaufen bin?
EDIT: Könnte es sein, dass ich die Kollision verarbeite? Hier sind die Schritte:
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
Was ist Objekt2.2 auf Ihrer letzten Zeile dort? –
ein Tippfehler :) Ich habe den tatsächlichen Code ein wenig anders, um mit meinen Klassen zu interagieren, so musste ich hier einige neu schreiben. Verpasste diesen einen! – Apc0243
Wenn Sie nur das Problem lösen wollen und es nicht von Grund auf lösen wollen, dann können Sie stattdessen einfach eine Physik-Engine verwenden. –