2016-07-04 79 views
0

我想创建一个简单的粒子模拟。有两种类型的粒子静态和移动。静态粒子将运动粒子吸引到其中心。静态颗粒具有规定它们是如何硬拉动移动的颗粒无法阻止粒子过冲

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

回答

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中的保留字。

+0

我在原始代码中没有使用'static'作为变量名。 –

+0

@SayamQazi,检查你的代码,你有'static.x'和'static.y'。称它为'force',称之为'atttractor'或者其他只是不变的或类名变成与保留字相同的颜色。 –

+0

是的,我知道。我正在谈论我的原始代码。我没有在SO上拷贝我的原始代码。 –

2

在运行dist计算之前或运行vel计算之前,您可能会声明dist值。相反,请确保您正在做的dist检查在计算distvel之间。 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. 
+0

是的,我在距离计算和更新速度部分之间进行了距离检查。你说我可能还会得到不想要的结果,所以你可以给我一个解决方案。 –

+0

显然Vesper解决了你的问题。你可以忽略我的建议。或者他的解决方案不起作用? –