粒子系统:如何在到达前检查两点之间的距离?

问题描述 投票:0回答:1

我正在开发一个简单的基于时间的粒子系统。

我正在研究的一个方面是吸引子。这工作正常,但我很难让粒子到达吸引子后停止。原因是因为虽然我正在检查从粒子到吸引子的距离,但它会随着时间的推移每帧增加并最终超过 0.0.0。让我发布一个代码片段来解释。


float dx = pattractorforcex - posx;
float dy = pattractorforcey - posy;
float dz = pattractorforcez - posz;
float distance = sqrt(dx * dx + dy * dy + dz * dz);

float force = dx / distance;
float force = dy / distance;
float force = dz / distance;
float force = time * pattractorforceint;
float posx2 = posx + force * forceX * drag; 
float posy2 = posy + force * forceY * drag;
float posz2 = posz + force * forceZ * drag;
float dx2 = pattractorforcex - posx2;
float dy2 = pattractorforcey - posy2;
float dz2 = pattractorforcez - posz2;
float distance2 - sqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2);

if (distance2 > 0.05)
{
posx = posx2;
posy = posy2;
posz = posz2;
}
else
{
posx = pattractorforcex;
posy = pattractorforcey;
posz = pattractorforcez;
}

我意识到这是 highly 低效的代码,但这没关系,因为一旦我明白我做错了什么,我就可以优化它。

如您所见,我正在计算吸引子和粒子之间的距离,然后计算它所产生的推/拉粒子的力。

我必须执行第二次距离检查才能获得真正的距离检查。我意识到这是非常低效的。

Distance 每帧都会减少,当粒子到达吸引子时,它最终达到 0.0。但是接下来的下一次迭代,由于时间增加,开始增加距离并继续将粒子推到吸引子之外。

我想我需要以某种方式强制 time 在距离达到 0.0 时停止,或者也许有更好的方法来解决这个问题?如果距离为正负(我知道这是不可能的),我可以只在它大于 0.0 时进行计算,例如,很容易限制运动。

有什么帮助或建议吗?

c++ distance particles particle-system
1个回答
0
投票

看到更多的代码将有助于理解你的“时间”在某种意义上是如何工作的:比如你在运行一个线程、一个 for 循环、一个 while 循环等。基于此你可以尝试实现

break
哪个停止循环以防止发生更多事情(即时间或位置改变)

如何使用 break 的例子:

end = false;
do
{
    if (distance < 0.1)
        {
            break; //or end = true;
        }

}
while (!end)
© www.soinside.com 2019 - 2024. All rights reserved.