. 關(guān)于2D地圖擦除算法瘸羡,去年我寫過一個實現(xiàn),勉強實現(xiàn)了地形擦除操禀,但跟最終效果還相差甚遠寇蚊,這次我寫了一個完整的實現(xiàn)峭判,在此記錄,留個印象棕叫。
. 去年的版本<<算法 & 數(shù)據(jù)結(jié)構(gòu)——裁剪多邊形>>林螃,因為受限于當時框架用GDI實現(xiàn)的渲染器,只有擦除地形沒有擦除地圖俺泣,這次換了OpenGL渲染器疗认,終于可以實現(xiàn)最終效果了。
這個算法看似簡單伏钠,實際上就是很簡單横漏,大致可分為三個部分。
地圖擦除:擦除地圖的圖像熟掂,產(chǎn)生視覺效果缎浇。
地形擦除:擦除地圖的形狀,用于物理計算赴肚。
橡皮擦:用于定義擦除的形狀素跺。
地圖擦除
假設(shè)這是一副畫在紙上的彩筆畫,如果要擦除畫上的一部分誉券,有過生活經(jīng)驗的人立馬就能想到用橡皮擦就好了指厌,很多算法靈感來自生活,生活多姿多彩的人適合做程序員踊跟。這個實現(xiàn)過程大概就是:綁定地圖到當前渲染目標踩验,渲染“橡皮擦”讓其覆蓋范圍內(nèi)的像素,從而達到擦除效果商玫。
橡皮擦
接著上一個環(huán)節(jié)箕憾,“橡皮擦”可以是從文件讀取的一張圖,也可以是程序生成的一張圖拳昌。如果從文件讀取厕九,設(shè)置合適的BlendFunc,直接渲染覆蓋像素顏色就行了地回,本例使用程序生成的圖扁远,因為這個靈活度更高。
這是一個正10邊形的“橡皮擦”刻像,從圖中可看出畅买,里面有幾條線,把正10邊形分割成了8個三角形细睡,這8把三角形的面積和形狀等于這個正10邊形谷羞,如果你困惑為什么要切成三角形,你運氣很好,有一個大佬剛好懂你的困惑湃缎,并為你量身定做了一篇答案<<算法 & 數(shù)據(jù)結(jié)構(gòu)——任意多邊形填充>>犀填。
以上則是地圖的擦除效果,其中有一處細節(jié)嗓违,擦除的邊緣有點生硬九巡,如果要制作類似《彈彈堂》這樣的游戲,地圖是通過炮彈炸掉的蹂季,那么被擦除的邊緣應(yīng)該留下被炸過的痕跡冕广,不用做的太真實,只要讓邊緣產(chǎn)生一些不一樣的漸變色就行了偿洁,要實現(xiàn)這一點撒汉,只需擴展一下“橡皮擦”的邊緣。
柔滑邊緣涕滋,用于生成描邊睬辐。
拆分三角網(wǎng)格,用于渲染宾肺。
柔滑邊緣后的擦除效果溉委。
地形擦除
以上是一張加了地形的圖,你沒有看錯爱榕,就只是多了一個黑邊瓣喊。
現(xiàn)在要通過“橡皮擦”擦除這個黑邊,與地圖擦除不同的是黔酥,地圖擦除是覆蓋像素藻三,而地形則是幾何計算。
算法:
從“橡皮擦”與地形相交部分計算出N條切線跪者。
取第i(0 <= i < N)條切線將地形一分為二棵帽。
丟棄完全包含在“橡皮擦”內(nèi)的地形。
i + 1渣玲,返回 2逗概。
當前地形被切分完畢,如果還有下一個地形則返回 1忘衍,否則結(jié)束逾苫。
最終效果