无法阻止粒子过冲

时间:2016-07-04 13:53:20

标签: actionscript-3 simulation physics particle-system

我正在尝试创建一个简单的粒子模拟。静态和移动有两种类型的粒子。静态粒子将移动的粒子吸引到其中心。静态粒子具有强度属性,决定了它们拉动移动粒子的难度

var angle:Number = Math.atan2(moving.y - static.y , moving.x - static.x);
var dist = Point.distance(new Point(moving.x,moving.y) , new Point(static.x,static.y));

moving.velX += Math.cos(angle + Math.PI) * static.strength / dist;
moving.velY += Math.sin(angle + Math.PI) * static.strength / dist;

问题在于当粒子刚刚穿过中心时距离非常小,导致非常大的速度值。

在计算速度之前,我额外检查了距离。

if (dist < 1)
    dist = 1;

但问题仍然存在。我无法弄清楚问题。

以下是发生过冲的快照。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可能在运行dist计算之前或运行dist计算之后声明vel值。相反,请确保您正在执行的dist检查是在dist计算和vel计算之间。 Vesper也是正确的,因为要获得正确的力效果,它应该使用距离平方。但即使这样做,您仍然可以得到不合需要的(尽管是完全准确的,数学上的)结果。

var angle:Number = Math.atan2(moving.y - static.y , moving.x - static.x);
var dist = Point.distance(new Point(moving.x,moving.y) , new Point(static.x,static.y));

if (dist < 1) dist = 1; // just make sure your constraint goes here.

moving.velX += Math.cos(angle + Math.PI) * static.strength / dist / dist; // this uses dist squared
moving.velY += Math.sin(angle + Math.PI) * static.strength / dist / dist; // but don't use this method in addition to Vesper's or you'll have dist to the power of 4. 

答案 1 :(得分:1)

法向力场使用距离的平方作为修正,你在这里使用单一的距离力,当然力场的表现不同。您应该将var dist行更改为以下内容:

var dist:Number = (moving.x-static.x)*(moving.x-static.x) + (moving.y-static.y)*(moving.y-static.y);

这种方式dist将保持实际距离的平方,因此除以dist将为您提供适当的力场配置。

并且,请重命名static,因为它是AS3中的保留字。