天天看點

《Android 應用案例開發大全(第3版)》——第2.5節 輔助繪制類

本節書摘來自異步社群《android 應用案例開發大全(第3版)》一書中的第2章,第2.5節 輔助繪制類,作者 吳亞峰 , 蘇亞光 , 于複興,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

2.5 輔助繪制類

上一節介紹了實作桌面的開發,本節将對輔助繪制類的開發進行詳細介紹。在繪制百納水族館動态桌面中各個物體之前,必須要做好準備工作,而這些準備工作就包括輔助繪制類的開發。其中包括背景圖輔助繪制類background,氣泡輔助繪制類bubble,魚類輔助繪制類ms3dmodel以及模型輔助繪制類loadedobjectvertexnormaltexture,下面就對這些類的開發進行詳細的介紹。

2.5.1 背景輔助繪制類——background

本小節将對本案例的背景輔助繪制類進行詳細介紹,這個類的作用是繪制百納水族館的背景模型,在此逼真的深海背景下,所有的魚、珍珠貝以及氣泡都在此背景前呈現,使整個百納水族館更加地活靈活現。

(1)首先來看本類的架構結構,本類中包括對背景圖的頂點坐标及紋理坐标的初始化方法,以及對着色器初始化的initshader()方法和drawself()方法。仔細學習本類的結構,有助于讀者更快地掌握本類所講的知識,對讀者有很大的幫助。其具體代碼如下。

第6~9行是這個類的構造方法,此方法調用初始化頂點坐标與着色資料的initvertexdata()方法和初始化着色器的initshader(mv)方法。

第13~32行是對頂點坐标資料的初始化,用三角形卷繞方式建立一個背景模型,将頂點資料存到float類型的頂點數組中,并建立頂點坐标緩沖,同時對頂點位元組進行設定,然後放入頂點坐标緩沖區,設定緩沖區的起始位置。

第33~41行是對建立好的背景模型進行紋理建立,對頂點紋理s、t坐标進行初始化,将頂點紋理坐标資料存入float類型的紋理數組中,并建立紋理坐标緩沖,對紋理坐标進行設定然後送入緩沖區并設定起始位置。

(2)讀者對本類的架構掌握後,下面将為讀者介紹本類中對着色器初始化的方法initshader()方法以及繪制矩形的drawself()方法。drawself()方法最後為畫筆指定頂點位置資料和畫筆指定頂點紋理坐标資料,繪制紋理矩形。其具體代碼如下。

第1~14行是本類中對着色器的初始化,将着色器腳本内容加載并基于其頂點與片元着色器來建立程式供顯示卡使用,并從程式中擷取頂點位置屬性、頂點紋理坐标屬性、總變換矩陣屬性的id引用來使用。

第15~28行是本類中的drawslef()方法,其作用是繪制矩形,根據資料畫出需要的矩形。首先制定某套shader程式,将一些資料傳入shader程式,最後為畫筆指定頂點位置資料和為畫筆指定頂點紋理坐标資料,繪制紋理矩形。

2.5.2 氣泡輔助繪制類——bubble

本小節将對案例中的氣泡輔助繪制類進行詳細的介紹,在該桌面的場景中,有三處氣泡位置在不斷地冒出透明的氣泡,這些氣泡上升的高度不同,并且這些氣泡随着高度的不斷增加,大小也在不斷變大,要繪制這些氣泡,首先需要構造氣泡模型,其具體代碼如下所示。

第6~9行是這個類的構造方法,調用initvertexdata()方法對頂點坐标資料與頂點紋理坐标資料進行初始化,并調用initshader(mv)方法對着色器進行初始化。

第11~25行是對氣泡模型的頂點坐标資料的初始化,首先以三角形卷繞的方式組裝頂點資料并将資料存放到float類型的數組中,并建立頂點坐标資料緩沖,對頂點資料進行設定并放入緩沖區,設定緩沖區的起始位置。

第26~32行是對氣泡模型的頂點紋理坐标s、t進行初始化,其坐标的組裝需要與頂點卷繞方式、方向一緻,并将頂點紋理坐标資料存入float類型的數組中,建立頂點紋理坐标緩沖,設定頂點紋理坐标,放入緩沖區,并設定緩沖區的起始位置。

說明

因其模型輔助繪制類loadedobjectvertexnormaltexture與背景圖輔助繪制類background,氣泡輔助繪制類bubble中的代碼類似,是以隻對以上兩個小節的輔助繪制類做詳細介紹,其模型輔助繪制類loadedobjectvertexnormaltexture讀者可檢視随書CD光牒中的源代碼。

2.5.3 魚類輔助繪制類——ms3dmodel

本小節将對魚類輔助繪制類ms3dmodel進行詳細的介紹,在該桌面中的魚不但可以遊來遊去,而且魚的本身也是有動作的,含有動畫的模型就是骨骼動畫。本小節将介紹如何對有骨骼動畫的ms3d檔案類型進行加載,并存儲其動畫的相關資料,以及執行模型繪制的ms3dmodel類。

(1)下面将詳細介紹的是ms3dmodel類的架構結構,這個類的主要作用是用于存儲從ms3d檔案中加載的動畫相關資料,以及執行模型繪制。讀者了解其代碼架構,有助于更好地對本案例中魚類的加載有更加深刻的了解。其代碼架構如下。

第4~18行定義了一些本類中需要的一些成員變量,其中最為重要的是第8~17行的成員變量,這些成員變量分别對應于ms3d檔案頭資訊、頂點資訊、三角形索引、組資訊等重要資料,讀者了解後有助于更好地了解本類。

第23~30行為更新關節、頂點資料到動畫中指定時刻及繪制模型的animate方法,若需要更新到的動畫時刻與目前不同,則首先需要更新關節資料,再更新頂點資料,再執行模型的繪制,否則直接繪制模型。

第31~37行為更新關節資料的updatejoint方法,首先判斷新的目前時間是否大于總的動畫時間,若大于總的動畫時間則将其設定為0,表示一輪動畫播放完畢後從頭開始。接着對每個關節進行周遊,調用每個關節資訊對象的update方法更新每個關節。

第38~50行為省略掉的一些重要的功能方法,将在後面的步驟中詳細介紹。

(2)下面介紹的是步驟(1)中省略的ms3dmodel類中用于繪制模型的draw方法,此方法是将加載ms3d檔案中的各種資料進行組裝送入緩沖區,然後進行繪制的重要功能方法,讀者了解其功能,有助于讀者更好地了解本類。其具體代碼如下。

第2~10行是首先指定某套shader程式,然後将矩陣複制。本案例中因為給魚類加上了燈光,是以就需要把總變換矩陣、變換矩陣、錄影機位置、燈光位置傳入以進行操作。這樣就可以在着色器中根據燈光位置、錄影機位置來給魚類添加燈光特效。

第18~28行是對紋理坐标資料的操作,用一輪周遊來周遊擷取目前組資訊對象、組内三角形的索引數組及組内三角形的數量。并根據一個标志位來判斷是否有材質,來斷定是否需要紋理貼圖,然後将紋理坐标緩沖送入渲染管線,啟用紋理坐标數組。

第29~39行是動态的計算有動畫的模型的頂點資料,是以在頂點資料有更新的情況下,根據三角形組裝資訊(組成三角形的3個頂點的索引)重新填充模型頂點坐标資料緩沖,以便繪制出最新姿态的模型,并将頂點坐标緩沖送入渲染管線。

第41~49行首先将頂點法向量資料送入渲染管線,然後開啟頂點坐标資料、頂點法向量數組,并将紋理綁定。因為本案例中魚類本身有逼真的深水明暗條紋,是以需要将明暗采樣紋理傳入着色器以進行操作,最後用定點法進行繪制。

(3)接下來介紹的是ms3dmodel類中省略的用于更新頂點資料的updatevectexs方法,以及用于更新指定索引頂點資料updatevectex方法,具體代碼如下。

第1~5行為更新頂點資料的updatevectexs方法,其中對每一個頂點進行周遊,調用updatevectex方法更新每一個頂點的資料。

第6~16行為更新指定索引頂點資料的updatevectex方法,其中對有關關節控制的頂點根據關節的實時變換情況計算出定點經關節影響後的位置。

(4)接下來介紹步驟(1)中的用于從指定ms3d模型檔案的輸入流中加載ms3d模型的load方法。該方法并不複雜,它按照ms3d檔案資料組織格式依次加載了各部分的資料。讀者了解這部分有助于提高對ms3d檔案的認知。其具體代碼如下。

第3~4行首先拿到ms3d模型的引用,然後再拿到特殊輸入流對象smallendianinputstream的引用,為後面的模型導入做準備。

第6~32行是按照ms3d檔案資料組織格式依次加載了各部分的資料,依次加載的資料為檔案頭、頂點、三角形組裝、組、材質、幀速率、目前播放時間,關鍵幀數量關節資訊,進行異常檢查,保證加載的正确性,并傳回模型。

本節中用于從輸入流加載ms3d模型的load方法并不複雜,它按照ms3d檔案格式依次加載各部分的資料。各部分資料的具體加載并不是在此方法中實作的,而是在各部分資料對應的類中實作的,讀者可檢視随書CD光牒中的源代碼。另外,此方法中包含的一個輸入流類——smallendianinputstream,并不複雜,讀者可檢視随書CD光牒中的源代碼。

繼續閱讀