在2D无限空间内,我有两个圆形精灵,代表了外太空中的巨大物体。
每个身体都有一对x
,y
坐标,mass
,speed
和direction
(弧度)。
在每个动画帧上,我为每个主体运行以下代码(其中this
是正在更新的主体,other
是另一个主体):
x, y = other.x - this.x, other.y - this.y
angle = atan2(y, x)
distance = root(square(x) + square(y))
force = this.mass * other.mass / square(distance)
注意:我忽略了G,因为它只是一个乘数。
我知道如何根据它们的坐标,速度和方向移动物体,但不知道如何更新this.speed
和this.direction
来模拟重力。
作用于给定物体的重力表示为矢量,并产生加速度的成分(ax
和ay
),这些是基于你已经拥有的成分计算的:
squared_distance = square(x) + square(y)
distance = sqrt(squared_distance)
accel = other.mass / squared_distance
ax = accel * x / distance
ay = accel * y / distance
请注意,不需要angle
(力/加速度方向)。
每个身体应该有一个相关的速度(而不是speed
),它应该是一个双组分矢量(vx
和vy
)。它是这样更新的(其中dt
是更新之间的时间间隔):
this.vx += ax * dt
this.vy += ay * dt
一旦更新了给定物体的速度,就可以重新定位(更新其x
,y
坐标),如下所示:
this.x += this.vx * dt
this.y += this.vy * dt
如果需要,您可以计算速度和方向,但这里不需要它们。