Actionscript 3 Can';不要阻止粒子过冲

Actionscript 3 Can';不要阻止粒子过冲,actionscript-3,simulation,physics,particle-system,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.vel

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

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;
if(距离<1)
dist=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中是一个保留字。

正常力场使用距离的平方作为修饰符,这里使用距离的单次幂,当然力场的性能不同。您应该将
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中是保留字。

您可能在运行
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. 
变量角度:Number=Math.atan2(moving.y-static.y,moving.x-static.x); var dist=点距离(新点(移动.x,移动.y),新点(静态.x,静态.y)); 如果(dist<1)dist=1;//只要确定你的限制在这里。 moving.velX+=Math.cos(角度+数学PI)*static.strength/dist/dist;//这使用dist平方 moving.velY+=Math.sin(角度+数学PI)*static.strength/dist/dist;//但是不要在Vesper的方法之外使用这个方法,否则你将有4次方的距离。
您可能在运行
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. 
变量角度:Number=Math.atan2(moving.y-static.y,moving.x-static.x); var dist=点距离(新点(移动.x,移动.y),新点(静态.x,静态.y)); 如果(dist<1)dist=1;//只要确定你的限制在这里。 moving.velX+=Math.cos(角度+数学PI)*static.strength/dist/dist;//这使用dist平方 moving.velY+=Math.sin(角度+数学PI)*static.strength/dist/dist;//但是不要在Vesper的方法之外使用这个方法,否则你将有4次方的距离。
我在原始代码中没有使用“static”作为变量名。@SayamQazi,检查您的代码,您有
static.x
&
static.y
。叫它
force
,叫它
atttractor
,或者叫它任何与保留字颜色相同的变量或类名。是的,我知道。我说的是我的原始代码。我没有复制粘贴我的原始代码,所以我没有在原始代码中使用“static”作为变量名。@SayamQazi,检查您的代码,您有
static.x
&
static.y
。叫它
force
,叫它
atttractor
,或者叫它任何与保留字颜色相同的变量或类名。是的,我知道。我说的是我的原始代码。我没有复制粘贴我的原始代码在这里,所以。是的,我有距离检查之间的距离计算和更新速度部分。你是说我可能仍然会得到不想要的结果,所以你能给我提出一个解决方案吗?显然维斯帕解决了你的问题。你可以无视我的建议。或者他的解决方案不起作用了?是的,我有距离计算和更新速度部分之间的距离检查。你是说我可能仍然会得到不想要的结果,所以你能给我提出一个解决方案吗?显然维斯帕解决了你的问题。你可以无视我的建议。还是他的解决方案不起作用?