2010-04-19 159 views
4

我有一個從源頭生成粒子並更新其位置的系統。目前,我已經在OpenGL中編寫了一個程序,它調用我的GenerateParticles(...)UpdateParticles(...)並顯示我的輸出。我希望我的系統具有的一項功能是能夠每秒生成n個粒子。在我的GenerateParticles(...)UpdateParticles(...)函數中,我接受2個重要參數:current_timedelta_time。在UpdateParticles(...)中,我根據以下公式更新我的粒子的位置:new_pos = curr_pos + delta_time*particle_vector。我怎樣才能使用這些參數和全局變量(或其他機制)來產生每秒1236個粒子?粒子系統:粒子生成

回答

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; 
    } 
} 

確保你把一些限制,因此如果時間增量很大,你不創造一百萬一次顆粒。

0

您只需要在GenerateParticles中創建n * delta_time顆粒。

+0

delta_time通常是小於零的double。假設我不能創建一個粒子的一部分。 – Myx 2010-04-19 20:55:20

+0

@Myx:我認爲你的意思是它少於一個?不像@Ron指出的那樣是一個問題,儘管積累'n * delta_time'比較簡單和快捷,並將其與'1.'比較...... – Troubadour 2010-04-20 19:22:46

1

在一幀發射的粒子的數量可以通過計算:

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()來提取浮點數的整數部分和小數部分。