【问题标题】:Can't stop the particles from overshooting无法阻止粒子过冲
【发布时间】:2016-07-04 13:53:20
【问题描述】:

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

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;

但问题仍然存在。我无法找出问题所在。

这是发生过冲的快照。

【问题讨论】:

    标签: actionscript-3 simulation physics particle-system


    【解决方案1】:

    您可能在运行dist 计算之前或运行vel 计算之后声明了dist 值。相反,请确保您正在进行的 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. 
    

    【讨论】:

    • 是的,我在距离计算和更新速度部分之间进行了距离检查。您是说我可能仍然会得到不希望的结果,所以请您给我一个解决方案。
    • 显然 Vesper 解决了你的问题。你可以忽略我的建议。还是他的解决方案不起作用?
    【解决方案2】:

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

    【讨论】:

    • 我在原始代码中没有使用'static'作为变量名。
    • @SayamQazi,检查你的代码,你有static.x & static.y。称它为force,称它为atttractor 或其他任何非变量或类名称更改为与保留字相同的颜色。
    • 是的,我知道。我在谈论我的原始代码。我没有在 SO 上复制粘贴我的原始代码。
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多