我有一个系统可以从源生成粒子并更新它们的位置。目前,我在 OpenGL 中编写了一个程序,它调用我的GenerateParticles(...)
并UpdateParticles(...)
显示我的输出。我希望我的系统具有的一项功能是能够n
每秒生成粒子。在我的GenerateParticles(...)
andUpdateParticles(...)
函数中,我接受 2 个重要参数:current_time
和delta_time
. 在UpdateParticles(...)
中,我根据以下公式更新粒子的位置:new_pos = curr_pos + delta_time*particle_vector
。如何使用这些参数和全局变量(或其他机制)n
每秒产生粒子?
问问题
1665 次
3 回答
2
您需要小心,创建粒子的天真方法会让您为低值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;
}
}
确保你设置了一些限制,这样如果时间增量很大,你就不会一次创建一百万个粒子。
于 2010-04-19T20:55:20.523 回答
1
在一帧发射的粒子数可以通过以下方式计算:
double n = delta_time * frequency
int i = (int)n;
f = n - i;
基本上你可以发射i
粒子。
f
可以为后面的帧累积小数部分。当它累积大于 1 时,您可以发射整数个粒子:
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()
来提取浮点数的整数和小数部分。
于 2012-11-15T04:42:19.837 回答
0
您只需要n * delta_time
在GenerateParticles
.
于 2010-04-19T20:47:30.357 回答