Tôi có một chương trình mà các vòng kết nối có thể bị trả lại thành một vòng kết nối khác. Tôi làm theo các hướng dẫn từ đây để quay các vectơ và rộng độ lớn dựa trên góc độ va chạm: http://www.vobarian.com/collisions/2dcollisions2.pdfTôi không thể tìm thấy điều gì sai với tính toán trả về vòng kết nối này trong python
tôi đã viết mã này trong python (chỉ số 0 chỉ ra tọa độ 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]]
Vấn đề là nó hoạt động đôi khi, nhưng không phải lúc khác. bất cứ ai đó có thể trả lời tôi tại sao? Có vẻ như nếu các quả bóng va chạm ở góc bên phải thì quỹ đạo thoát của chúng hoán đổi hay gì đó. Tôi đã viết điều này trong trình duyệt codeskulptor: http://www.codeskulptor.org/#user39_8q0Xdp3Y4s_2.py
Có ai có thể chỉ ra nơi tôi đã đi sai?
EDIT: Có thể đó là cách tôi xử lý xung đột không? Đây là các bước:
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
đối tượng2.2 trên dòng cuối cùng của bạn ở đó là gì? –
một lỗi đánh máy :) Tôi có mã thực tế khác một chút để tương tác với các lớp của tôi vì vậy tôi phải viết lại một số ở đây. Bỏ lỡ cái đó! – Apc0243
Nếu bạn chỉ muốn giải quyết vấn đề và không quan tâm đến việc giải quyết nó từ nguyên tắc đầu tiên, sau đó bạn chỉ có thể sử dụng một công cụ vật lý để thay thế. –