python球物理模拟

时间:2013-01-03 10:55:02

标签: python pygame physics

我见过Peter Colling Ridge的伟大教程 http://www.petercollingridge.co.uk/pygame-physics-simulation/
我正在扩展PyParticles脚本
该代码可在网站上获得(免费),我正在使用PyParticles4.py

教程中使用的类

粒子类
圆形2d物体,半径,质量,速度,位置
春季班
弹簧绑定2个物体(粒子)并使用Hooke's law(F = -kx)来确定它们之间的相互作用
环境类
粒子相互作用的环境

我想知道我是否可以使用2个粒子并制作一个'Rod'类(如教程中的Spring类),它具有特定的长度并且不允许粒子靠近比这更远(指定) )长度 同时
向每个粒子施加一个力(如果需要),这样如果一个被拉向左边,另一个被拉向另一个,但是实际上...... 就像使用钢棒将2种不同类型的球(从中心)连接起来一样,但是在2-d ..中 我不想使用第三方模块

提前致谢..

修改/更新:
试图应用约束定理(失败)
这是代码:

class Rod:
    def __init__(self, p1, p2, length=50):
        self.p1 = p1
        self.p2 = p2
        self.length = length

    def update(self):
        'Updates The Rod and Particles'
        # Temp store of co-ords of Particles involved
        x1 = self.p1.x
        x2 = self.p2.x
        ###### Same for Y #######
        y1 = self.p1.y
        y2 = self.p2.y

        # Calculation of d1,d2,d3 and final values (x2,y2) 
        # from currently known values(x1,y1)...
        # From Constraint algorithm(see @HristoIliev's comment)
        dx1 = x2 - x1
        dy1 = y2 - y1
        # the d1, d2, d3
        d1 = math.hypot(dx1,dy1)
        d2 = abs(d1)
        d3 = (d2-self.length)/d2
        x1 = x1 + 0.5*d1*d3
        x2 = x2 - 0.5*d1*d3
        y1 = y1 + 0.5*d1*d3
        y2 = y1 - 0.5*d1*d3

        # Reassign next positions
        self.p1.x = x1
        self.p2.x = x2
        ###### Same for Y #######
        self.p1.y = y1
        self.p2.y = y2

1 个答案:

答案 0 :(得分:3)

2D中的杆具有3个自由度(2个速度/位置+ 1个旋转/角度频率) 我将代表中心的位置,该位置通过力以通常的方式进行修改,并使用旋转(为简单起见,关于系统的中心)变量计算粒子的位置。
旋转由力

修改
ang_accel = F * r * sin (angle(F,r)) / (2*M * r^2)

哪里

ang_accel是角加速度

F是一个作用于特定球的力量,所以有2 torques *加起来,因为有两个力加起来(矢量方式)以更新位置中心。

r是长度的一半 angle(F,r)是力矢量和半径矢量之间的角度(从中心到受力的粒子),

那样 F * r * sin (angle(F,r))是关于中心的torque,和 2*M * r^2是中心周围两点系统的moment of inertia