所以我編了一個斯諾克遊戲,我決定找出如何讓球相互碰撞的最好方法是在一個單獨的程序中這樣做,然後複製它。我是一位非常出色的數學家,所以我坐下來,畫出了這個事件,並通過了實際發生的事情的數學。球碰撞 - vPython問題
我的方法是將每個球的初始速度分解爲xr和yr分量,在xr分量與通過每個球中心的向量一致的參照系中,並且yr-組件與此垂直。然後我做一個球的xr分量的簡單切換,並保留yr分量,然後計算標準參考幀中速度的x分量和y分量。
由於某些原因,無論是通過數學或編程錯誤,我似乎無法讓它工作。以下是我目前爲止的內容,並且我瀏覽了互聯網上幾乎所有我能找到的相關頁面以及本網站上提出的所有類似問題。我也不是一個精通程序員。
from visual import *
dt = 0.01
r = 5
red = sphere(pos=(-25,25,0),radius = r,color=color.red)
green = sphere(pos=(25,-25,0),radius = r,color=color.green)
red.velocity = vector(10,-10,0)
green.velocity = vector(-10,10,0)
def posupdate(ball):
ball.pos = ball.pos + ball.velocity*dt
def ballhit(ball1,ball2):
v1 = ball1.velocity
v1x = ball1.velocity.x
v1y = ball1.velocity.y
v2 = ball2.velocity
v2x = ball2.velocity.x
v2y = ball2.velocity.y
xaxis = vector(1,0,0)
btb = ball2.pos - ball1.pos
nbtb = btb/abs(btb)
if abs(btb) < 2*r:
phi = acos(dot(nbtb,xaxis)/abs(nbtb)*abs(xaxis))
ang1 = acos(dot(v1,xaxis)/abs(v1)*abs(xaxis))
ang2 = acos(dot(v2,xaxis)/abs(v2)*abs(xaxis))
v1xr = abs(v1)*cos((ang1-phi))
v1yr = abs(v1)*sin((ang1-phi))
v2xr = abs(v2)*cos((ang2-phi))
v2yr = abs(v2)*sin((ang2-phi))
v1fxr = v2xr
v2fxr = v1xr
v1fyr = v1yr
v2fyr = v2yr
v1fx = cos(phi)*v1fxr+cos(phi+pi/2)*v1fyr
v1fy = sin(phi)*v1fxr+sin(phi+pi/2)*v1fyr
v2fx = cos(phi)*v2fxr+cos(phi+pi/2)*v2fyr
v2fy = sin(phi)*v2fxr+sin(phi+pi/2)*v2fyr
ball1.velocity.x = v1fx
ball1.velocity.y = v1fy
ball2.velocity.x = v2fx
ball2.velocity.y = v2fy
return ball1.velocity, ball2.velocity
while 1==1:
rate(100)
posupdate(red)
posupdate(green)
ballhit(red,green)
在此先感謝您提供的任何幫助。
編輯:碰撞檢測沒有問題,只是計算碰撞後球的速度矢量。道歉,我應該更清楚一點。
什麼是不工作? – Carcigenicate
大多數情況下球的走向是錯誤的。有一小部分,例如只沿着X軸運動才能正常工作,但總的來說,排斥的方向是錯誤的。 – Cowmilker