私はスヌーカーのゲームをコーディングしています。ボールを別のプログラムに衝突させる方法を理解するための最良の方法を決めました。かなり有能な数学者なので、私は座って、イベントを描いて実際に起こっていることの数学を見てきました。ボールが衝突する - vPythonの問題
私のアプローチは、xr成分が各ボールの中心を通るベクトルと一致する基準フレームにおいて、各ボールの初期速度をxr成分およびyr成分に分解し、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