система частиц: генерация частиц - PullRequest
4 голосов
/ 20 апреля 2010

У меня есть система, которая генерирует частицы из источников и обновляет их позиции. В настоящее время я написал программу на OpenGL, которая вызывает мои GenerateParticles(...) и UpdateParticles(...) и отображает мой вывод. Одна функциональность, которую я хотел бы, чтобы моя система имела возможность генерировать n частиц в секунду. В моих функциях GenerateParticles(...) и UpdateParticles(...) я принимаю 2 важных параметра: current_time и delta_time. В UpdateParticles(...) я обновляю положение моей частицы согласно следующей формуле: new_pos = curr_pos + delta_time*particle_vector. Как я могу использовать эти параметры и глобальные переменные (или другие механизмы) для получения n частиц в секунду?

Ответы [ 3 ]

2 голосов
/ 20 апреля 2010

Вы должны быть осторожны, наивный способ создания частиц заставит вас создавать дробные частицы для низких значений 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;
  }  
}

Убедитесь, что вы ввели какое-то ограничение, чтобы при большой временной разнице вы не создавали миллион частиц одновременно.

1 голос
/ 15 ноября 2012

Количество частиц, испускаемых в кадре, можно рассчитать по формуле:

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() для извлечения целой и дробной части числа с плавающей запятой.

0 голосов
/ 20 апреля 2010

Вам просто нужно создать n * delta_time частиц в GenerateParticles.

...