Python球物理模拟
问题内容:
我在
http://www.petercollingridge.co.uk/pygame-physics-
simulation/
上看到了Peter Colling Ridge的精彩教程,
并且我正在扩展PyParticles脚本。
该代码可在网站上免费获得,我是使用PyParticles4.py
本教程中使用的类
粒子类
圆2d的半径,质量,速度,位置对象
的弹簧类
的弹簧,其结合2个对象(颗粒),并使用
虎克定律 (F =
-kx),以确定它们之间的交互
的环境类
的环境,其中粒子相互作用
我想知道我是否可以使用2个粒子并创建一个“ Rod”类(如本教程中的Spring类),该类具有特定的长度,并且不允许粒子更靠近该长度(指定的长度)。
同样,
对每个粒子施加力(如果需要),使得如果一个粒子向左拉,另一个粒子也向左拉,但实际上。.
就像使用钢将两种不同类型的球(从中心)连接在一起一样杆,但在2维中。
而且我 不想使用3rd party模块
提前致谢..
编辑/更新:
试图应用约束定理(失败)
这是代码:
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
问题答案:
2D杆具有3个自由度(2个速度/位置+ 1个旋转/角频率)。
我将代表中心位置,该位置已通过力以通常的方式进行了修改,并使用旋转(为简单起见,围绕系统中心)变量来计算粒子的位置。
旋转由力修改
ang_accel = F * r * sin (angle(F,r)) / (2*M * r^2)
哪里
ang_accel
是角加速度
F
是作用在特定球上的力,因此有2个扭矩*相加,因为有两个力相加(矢量方向)以更新中心的位置。
r
是长度的一半,
angle(F,r)
是力矢量和半径矢量之间的角度(从中心到受力的粒子),
因此,这
F * r * sin (angle(F,r))
是围绕中心的转矩,并且
2*M * r^2
是围绕中心的两点的系统的惯性矩。