天天看點

《OpenGL ES 3.x遊戲開發(下卷)》一2.6 吹氣膨脹特效

本節書摘來異步社群《opengl es 3.x遊戲開發(下卷)》一書中的第2章,第2.6節,作者: 吳亞峰 責編: 張濤,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

通過前面幾節的學習,讀者應該對頂點着色器的使用有了一定的了解。本節将進一步給出通過使用頂點着色器實時改變3d模型中頂點的位置,以實作物體吹氣膨脹效果的案例。

介紹本節案例的具體開發之前,首先需要了解本節案例實作吹氣膨脹特效的基本原理,如圖2-20所示。

《OpenGL ES 3.x遊戲開發(下卷)》一2.6 吹氣膨脹特效

從圖2-20中可以看出,實作吹氣膨脹特效時,由頂點着色器根據收到的參數将目前處理的頂點位置沿目前頂點的法向量方向移動一定的距離。每次處理時移動距離的大小由傳入的參數控制,這樣就可以非常友善地實作吹氣膨脹的效果了。

上一小節介紹了實作物體吹氣膨脹特效的基本原理,本小節首先給出一個基于此原理開發的實作人物頭部3d模型不斷吹氣膨脹的案例sample2_6,其運作效果如圖2-21所示。

《OpenGL ES 3.x遊戲開發(下卷)》一2.6 吹氣膨脹特效
《OpenGL ES 3.x遊戲開發(下卷)》一2.6 吹氣膨脹特效

了解了本案例的運作效果後,接下來簡單介紹本案例的具體開發過程。由于本案例中的大部分代碼與本書前面的很多案例非常類似,是以這裡僅給出本案例中有代表性的部分,具體内容如下。

(1)首先介紹用于在程式運作過程中不斷修改吹氣膨脹程度系數(fatfacror變量)的drawself方法,此方法來自于loadedobjectvertexnormaltexture類。該類在上卷的第9章中介紹過,其對象表示從obj檔案中加載的3d模型。本案例用于加載包含了人物頭部的3d模型,其中drawself方法的具體代碼如下。

提示 上述代碼的主要功能為不斷地修改物體的吹氣膨脹系數,并把膨脹系數傳入着色器程式。

(2)接着介紹接收吹氣膨脹系數,并根據系數将頂點位置沿法向量方向移動一定距離的頂點着色器,其具體代碼如下。

從上述頂點着色器的代碼中可以看出,大部分都與上卷案例相同,如計算定位光光照等。最能展現本節案例特點的就是第43行的代碼,其在計算頂點經過變換後的最終位置時不是直接針對頂點的坐标計算的。而是首先将頂點坐标沿着頂點的法向量方向移動一定的距離(移動距離的大小由接收的吹氣膨脹系數ufatfactor來确定),然後再與變換矩陣相乘。

另外,本案例所采用的思路不但可以用來實作吹氣膨脹特效,如果将案例中的obj模型替換為使用面法向量的模型,還可以實作簡單的爆炸效果。例如将上述吹氣膨脹特效案例中的頭部模型替換為一個使用面法向量的地雷模型(替換後的案例為sample2_7),再運作案例就會出現爆炸的效果,如圖2-22所示。

《OpenGL ES 3.x遊戲開發(下卷)》一2.6 吹氣膨脹特效
《OpenGL ES 3.x遊戲開發(下卷)》一2.6 吹氣膨脹特效
案例sample2_7與案例sample2_6的代碼完全一緻,隻是将案例sample2_6中采用點平均法向量的頭部模型head.obj替換為使用面法向量的地雷模型zd.obj。至于3d模型是采用點平均法向量還是面法向量,則是在3ds max中完成設定的,讀者可自行設定,在此不再贅述。不熟悉的讀者可以參考其他介紹3ds max的書籍或資料,非常友善。