線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2063
推到 Plurk!
推到 Facebook!

2D特效之火焰

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-21 13:37:28 IP:61.218.xxx.xxx 未訂閱
作者: 劉小軍 資料來源:http://www.cpp3d.com/articles/show.asp?aid=25 Fire源碼下載 (13 KByte) 火焰算法在2D特效中可以說是最最簡單的一種,但是要真正做到“象火焰”卻不那麼容易,你在標題欄看到的靜態效果是在本文例程運行時捕捉到的一幀,例程源碼編譯需DX6SDK,DXGuide,VC ,給出的源碼只是方便參考之用,如有小bug請不要介意,just a sample!另為了方便Win32編程者,特效專欄所有特效部分源碼,都可從工程文件里分離出來重新整理編譯(如果你特別反感DXGuide的話)。 好了,言歸正傳,火焰算法之所以說它簡單,是因為它只需幾個加法和位移就可實現。下面先介紹一下算法的原理: 火焰的形成需要下面幾個條件或過程: # 熱源 # 熱傳播 # 熱損失(冷卻) 熱源可利用各種隨機函數在發熱體表面隨機撒播一些火種就行了,這個過程的關鍵是選擇恰當的隨機函數。 熱傳播的算法很多,不過都大同小異。讀過我們的《2D特效之水波》沒有,其中水波的傳播公式就是了。fire1.gif (365 字節)如左圖,按常理火焰是從下往上傳播,計算時求出每一點熱能的平均值后,將所有點往上平移一個單位就行了。熱能的平均算法一般取當前點周圍各點的平均值,根據傳播方向,如有可能盡量取當前點偏下的點來計算。所以計算之后左圖中黃點的熱能可以是黃點、綠點、藍點、黃綠點的平均值,也可以是黃點、綠點、紫點、黃綠點的平均值,當然還可以其它各點的平均值,只要計算方便快捷就行了。我們在例子用的公式是: P[I, j] = (P[I, j] P[I-1, j 1] P[I 1, j 1] P[I, j 2])>>2 熱損失這過程只是為了讓你能調節火焰的高度,還可讓你的火焰看起來更象一些,前面兩過程是火焰算法的軀體,而熱損失這一過程是火焰算法的精神。前面兩過程產生出來的火焰可以說是死火,毫無生氣,因為在現實中有氣流的存在,火焰在向上傳播的過程中要受氣流的影響。只有將現實中的種種幹擾因素考慮進來,這樣生成的火焰才富有生命力。熱能損失的算法要複雜一些,最有效的可能是建一個經過平滑處理過的查找表,表項取值範圍可定在0到6之間,計算時能量減去相應位置的表項值就可以了。為了說明算法的原理,我們在例子中熱能損失只取平均值,想進一步完善火焰的效果的,可根據思路自己想辦法實現。 為了讓火焰看起來更生動,你還可以讓火焰左右擺動,這是風產生的氣流對火焰的影響。這可通過平面圖形扭曲來實現,這里暫不介紹扭曲算法,如有興趣,請繼續關注我們的2D特效專欄 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2002/08/21 13:38:35
系統時間:2024-04-25 16:38:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!