我有一個從源頭生成粒子並更新其位置的系統。目前,我已經在OpenGL中編寫了一個程序,它調用我的GenerateParticles(...)
和UpdateParticles(...)
並顯示我的輸出。我希望我的系統具有的一項功能是能夠每秒生成n
個粒子。在我的GenerateParticles(...)
和UpdateParticles(...)
函數中,我接受2個重要參數:current_time
和delta_time
。在UpdateParticles(...)
中,我根據以下公式更新我的粒子的位置:new_pos = curr_pos + delta_time*particle_vector
。我怎樣才能使用這些參數和全局變量(或其他機制)來產生每秒1236個粒子?粒子系統:粒子生成
4
A
回答
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
顆粒。
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()
來提取浮點數的整數部分和小數部分。
相關問題
- 1. 粒子系統
- 2. AndEngine粒子系統
- 3. SFML.NET粒子系統
- 4. 粒子系統libGDX
- 5. 粒子系統DontDestroyOnLoad
- 6. 統一3d - 粒子系統
- 7. SFML粒子系統架構
- 8. 粒子系統錯誤
- 9. 如何給粒子系統
- 10. C++粒子系統Allegro 5
- 11. XNA粒子系統性能
- 12. 粒子系統設計?
- 13. OpenGL的粒子系統
- 14. 自定義粒子系統
- 15. libGdx中的粒子系統
- 16. OGRE - 創建粒子系統
- 17. 如何使用粒子對象優化畫布粒子系統
- 18. 使用獲取/設置粒子來實例化粒子系統
- 19. 粒子系統中的粒子表現怪異
- 20. Unity粒子系統到精靈表
- 21. 如何獲得粒子系統之一?
- 22. cocos2d粒子系統自動刪除
- 23. 帶Open GL ES的UIKit粒子系統?
- 24. 粒子系統無法播放()
- 25. Cocos2d/Cocos2d-x粒子系統暫停
- 26. unity3d打開關閉粒子系統
- 27. 如何使粒子系統可點擊
- 28. 如何停止粒子系統
- 29. 2d中的粒子系統入門
- 30. cocos2d中的多粒子系統
delta_time通常是小於零的double。假設我不能創建一個粒子的一部分。 – Myx 2010-04-19 20:55:20
@Myx:我認爲你的意思是它少於一個?不像@Ron指出的那樣是一個問題,儘管積累'n * delta_time'比較簡單和快捷,並將其與'1.'比較...... – Troubadour 2010-04-20 19:22:46