【问题标题】:particle system: particle generation粒子系统:粒子生成
【发布时间】:2011-02-09 20:58:36
【问题描述】:

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

【问题讨论】:

    标签: c++ opengl particles


    【解决方案1】:

    您需要小心,创建粒子的幼稚方法会让您为 n 的低值创建分数粒子(可能不是您想要的)。而是创建一个累加器变量,该变量与每帧的 delta_time 值相加。每帧检查它,看看你需要多少粒子来创建该帧并减去适当的数量:

    void GenerateParticles(double delta_time) {
      accumulator += delta_time;
      while (accumulator > 1.0 / particles_per_second) {
        CreateParticle(...);
        accumulator -= 1.0 / particles_per_second;
      }  
    }
    

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

    【讨论】:

      【解决方案2】:

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

      double n = delta_time * frequency
      int i = (int)n;
      f = n - i;
      

      基本上你可以发射i粒子。

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

      f_sum += f;
      if (f_sum > 1.0) {
          int j = (int)f_sum;
          f_sum -= j;
          i += j;
      }
      

      但是,以下是粒子分数的另一个有趣的解决方案。

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

      if (f >= r()) // Assumes r() is a PRNG generating a random value in [0, 1) 
          i++;
      

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • delta_time 通常是小于零的双精度数。假设我无法创建粒子的一小部分。
        • @Myx:我认为你的意思是它小于一个?正如@Ron 指出的那样,这并不是真正的问题,尽管积累n * delta_time 并将其与1. 进行比较更简单、更快捷...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多