我正在尝试创建一个简单的粒子模拟。静态和移动有两种类型的粒子。静态粒子将移动的粒子吸引到其中心。静态粒子具有强度属性,决定了它们拉动移动粒子的难度
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;
但问题仍然存在。我无法弄清楚问题。
以下是发生过冲的快照。
答案 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中的保留字。