0

这是我的碰撞响应代码,用于模拟 2 个移动球碰撞的台球。我使用牛顿方程定律,然后对速度矢量的分量进行参数化,

Alpha 是球 1
的轨迹 Beta 是球 2 的轨迹
Theta 是中心线相对于轴的角度

我的想法是在 2 个球的局部框架中为碰撞响应提出一个通用公式,然后将其重新投影回我的固定框架,但我注意到存在一些角度问题,我无法弄清楚我的生活是什么条件应该是 ie alpha

最后一点只是为了确保球在碰撞后不会重叠并陷入无限循环的碰撞

    def collision(b1,b2):

        dx=b1.x-b2.x
        dy=b1.y-b2.y
        Theta = atan2(dy,dx)
        Vx1=b1.speedx
        Vy1=b1.speedy


        Vx2=b2.speedx
        Vy2=b2.speedy

        V1 = sqrt((Vx1)**2+(Vx1)**2)
        V2 = sqrt((Vx2)**2+(Vx1)**2)
        Alpha = asin(Vx1/V1)
        Beta = asin(Vx2/V2)


       b1.speedx = (((1-e)/2)*V1*sin(Alpha-Theta) - ((1+e)/2)*V2*sin(Beta-Theta))*sin(Theta) - V1*cos(Alpha-Theta)*cos(Theta)
       b1.speedy = (((1-e)/2)*V1*sin(Alpha-Theta) - ((1+e)/2)*V2*sin(Beta-Theta))*cos(Theta) + V1*cos(Alpha-Theta)*sin(Theta)
       b2.speedx = (((1+e)/2)*V1*sin(Alpha-Theta) - ((1-e)/2)*V2*sin(Beta-Theta))*sin(Theta) + V2*cos(Beta-Theta)*cos(Theta)
       b2.speedy = (((1+e)/2)*V1*sin(Alpha-Theta) - ((1-e)/2)*V2*sin(Beta-Theta))*cos(Theta) - V2*cos(Beta-Theta)*sin(Theta)
4

1 回答 1

0

不要使用 asin 来计算角度。如果你坚持使用角度(而不是向量),你应该使用 atan2。

于 2013-01-22T23:11:39.560 回答