首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >粒子系统:粒子生成

粒子系统:粒子生成
EN

Stack Overflow用户
提问于 2010-04-20 04:42:55
回答 3查看 1.7K关注 0票数 4

我有一个系统,可以从源生成粒子并更新它们的位置。目前,我已经用OpenGL编写了一个程序,它调用我的GenerateParticles(...)UpdateParticles(...)并显示我的输出。我希望我的系统具有的一个功能是能够每秒生成n粒子。在我的GenerateParticles(...)UpdateParticles(...)函数中,我接受两个重要的参数:current_timedelta_time。在UpdateParticles(...)中,我根据以下公式更新粒子的位置:new_pos = curr_pos + delta_time*particle_vector。如何使用这些参数和全局变量(或其他机制)每秒生成n粒子?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-20 04:55:21

您需要小心,创建粒子的天真方式将使您为较低的n值创建分数粒子(可能不是您想要的)。相反,创建一个累加器变量,该变量将在每一帧中与您的delta_time值相加。每个帧检查它以查看需要创建该帧的粒子数,并减去适当的量:

代码语言:javascript
复制
void GenerateParticles(double delta_time) {
  accumulator += delta_time;
  while (accumulator > 1.0 / particles_per_second) {
    CreateParticle(...);
    accumulator -= 1.0 / particles_per_second;
  }  
}

确保你设置了一些限制,这样如果时间增量很大,你就不会一下子创建一百万个粒子。

票数 2
EN

Stack Overflow用户

发布于 2012-11-15 12:42:20

在一帧中发射的粒子数可以通过以下方法计算:

代码语言:javascript
复制
double n = delta_time * frequency
int i = (int)n;
f = n - i;

基本上,您可以发射i粒子。

可以为后面的帧累加小数部分f。当它累积大于1时,可以发射整数个粒子:

代码语言:javascript
复制
f_sum += f;
if (f_sum > 1.0) {
    int j = (int)f_sum;
    f_sum -= j;
    i += j;
}

然而,下面是关于粒子分数的另一个有趣的解决方案。

通过使用伪随机数生成器(PRNG),我们可以使用它来确定是否应该发射粒子:

代码语言:javascript
复制
if (f >= r()) // Assumes r() is a PRNG generating a random value in [0, 1) 
    i++;

当频率随时间变化时,这种方法很有用。它消除了存储额外变量的需要。

这种方法的另一个好处是,粒子系统看起来不那么均匀。例如,如果频率为1.5,增量时间为1,则使用第一种方法,帧将发出1,2,1,2,...粒子。第二种方法可以打破这种模式。

此外,您可以使用modf()来提取浮点数的整数和小数部分。

票数 1
EN

Stack Overflow用户

发布于 2010-04-20 04:47:30

您只需在GenerateParticles中创建n * delta_time粒子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2670727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档