使用python模拟2D弹性碰撞

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python模拟2D弹性碰撞相关的知识,希望对你有一定的参考价值。

我已经在Python 3中编写了一个脚本来模拟二维的弹性碰撞。我不知道我在做什么错,因为当我运行它时,这些球似乎相互粘连,有时会出现毛刺而变成一个球。另外,当单个球撞击屏幕的任何边缘时,它都会弹起,但是当另一个球粘在其上时,它将导致其中一个球从屏幕上脱落。

Eqautions that I used

代码段:

class Particle(Sprite):
    def __init__(self, image):
        super(Particle, self).__init__(image)
        self.Vxi, self.Vyi = random.randint(-3, 3), random.randint(-3, 3)
        self.mass = random.randint(1, 100) / 1000

        self.schedule_interval(self.update, 1/60)

    def update(self, dt):
        self.xpos, self.ypos = self.position

        if self.xpos <= self.width/2 or self.xpos >= scr_width - self.width/2:
            self.Vxi *= -1
        if self.ypos <= self.width/2 or self.ypos >= scr_height - self.height/2:
            self.Vyi *= -1

        for particle in director.scene.children[0][1].particles:
            particle_xpos, particle_ypos = particle.position

            if abs(self.xpos - particle_xpos) <= self.width/2 + particle.width/2:
                if abs(self.ypos - particle_ypos) <= self.height/2 + particle.height/2:
                    xmomentum = (particle.mass * particle.Vxi) + (self.mass * self.Vxi)
                    ymomentum = (particle.mass * particle.Vyi) + (self.mass * self.Vyi)
                    Vxf = (xmomentum - particle.mass * (self.Vxi - particle.Vxi)) / (particle.mass + self.mass)
                    Vyf = (ymomentum - particle.mass * (self.Vyi - particle.Vyi)) / (particle.mass + self.mass)
                    self.Vxi = Vxf
                    self.Vyi = Vyf

        self.xpos += self.Vxi
        self.ypos += self.Vyi
        self.position = self.xpos, self.ypos
答案

我认为您忘记了在碰撞时更新另一个粒子的速度。

之前

self.Vxi = Vxf
self.Vyi = Vyf

也应该有

particle.Vxi = Vxf + (self.Vxi - particle.Vxi)
particle.Vyi = Vyf + (self.Vyi - particle.Vyi)

样式明智,我认为可以更好地命名变量。粒子对象不应具有称为VxiVxf的属性。就物理粒子而言,它只有一个速度。初始/最终速度的概念与数值模拟相关联,粒子类的属性不应建模。在您当前的代码中,self的“最终”速度被更新为其初始速度,这可能会造成混淆。

[VxiVyi)的初始速度应取自self.Vx开头的self.Vyupdate。最后,VfxVfy应该更新为self.Vxself.Vy

此外,最好在局部变量(例如V1_x_initialV2_x_initial等中指示它是哪个粒子

以上是关于使用python模拟2D弹性碰撞的主要内容,如果未能解决你的问题,请参考以下文章

第四讲:弹性体模拟-弹性力学基础

Unity精灵动画 2D碰撞

POJ 3684 Physics Experiment(弹性碰撞)

二维非对心弹性碰撞的算法

Egret中使用P2物理引擎

js实现小球的弹性碰撞。