張笑一
摘要:為模擬波濤洶涌的波浪的動(dòng)畫(huà),設(shè)計(jì)與開(kāi)發(fā)網(wǎng)格波動(dòng)效果界面;借鑒余弦函數(shù)以及相應(yīng)的變換建立問(wèn)題解決模型;利用C++的OpenGL開(kāi)發(fā)動(dòng)畫(huà)程序;程序?qū)崿F(xiàn)網(wǎng)格隨機(jī)擺動(dòng)。
關(guān)鍵詞:網(wǎng)格波動(dòng);余弦函數(shù);OpenGL技術(shù);C++;程序開(kāi)發(fā)
中圖分類號(hào):TP37 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)12-0220-02
Abstract: To simulate the roaring waves animation, design and achieve the grid fluctuation effect interface; Refer to cosine function and some transformations about cosine function to construct the problem solving model; Using of OpenGL of the C++ to develop animation program; The program achieve random fluctuation grid .
Key words: Grid fluctuation; Cosine function; OpenGL technology; C++; program development
1 概述
網(wǎng)格波動(dòng)界面的探索可以應(yīng)用于影視、廣告以及科研領(lǐng)域的仿真研究上,是一個(gè)值得探索的問(wèn)題。
文獻(xiàn)[1]描述利用海浪頻譜和方向函數(shù)生成每一張海面圖片的高度場(chǎng)。文獻(xiàn)[2]研究工作中涉及了波浪和浮體聯(lián)合作用的研究。文獻(xiàn)[3]研究?jī)?nèi)容涉及對(duì)波浪扭曲時(shí)的建模方式的探討。文獻(xiàn)[4]研究的內(nèi)容涉及對(duì)海波使用紋理映射的討論。
2問(wèn)題提出
利用C++的OpenGL渲染技術(shù),通過(guò)在事先定義的三維空間的若干頂點(diǎn)上增加隨機(jī)運(yùn)動(dòng)方式算法可在之后程序畫(huà)圖時(shí)實(shí)現(xiàn)網(wǎng)格波動(dòng),利用C++的窗口界面程序的開(kāi)發(fā)方法和引入相關(guān)后綴名為“.h”的文件的語(yǔ)法以及OpenGL技術(shù),可實(shí)現(xiàn)所開(kāi)發(fā)的界面播放OpenGL動(dòng)畫(huà)程序。將這兩點(diǎn)有機(jī)結(jié)合后,提出開(kāi)發(fā)帶有網(wǎng)格波動(dòng)虛擬影像的播放界面。
3 建立運(yùn)動(dòng)方式模型
倘若定義若干行三維空間中的頂點(diǎn),可把行數(shù)定義為變量n,各行頂點(diǎn)數(shù)目與行數(shù)相等,則可以在OpenGL程序每回畫(huà)出一張圖畫(huà)前通過(guò)使用循環(huán)語(yǔ)句執(zhí)行算法的途徑讓各個(gè)頂點(diǎn)的空間位置發(fā)生變化或者不變。當(dāng)每次畫(huà)出圖片前頂點(diǎn)可組成多條波動(dòng)曲線的形狀時(shí),則可讓這些圖片在因?yàn)槌绦驁?zhí)行引起的連續(xù)放映形成網(wǎng)格搖擺的動(dòng)畫(huà)。本次n取80。
循環(huán)語(yǔ)句所表達(dá)的初始頂點(diǎn)在任意單位循環(huán)時(shí)刻應(yīng)具備的運(yùn)動(dòng)方式模型抽象為如下內(nèi)容:(1)所有頂點(diǎn)的初始位置都保證它們?cè)谌S坐標(biāo)系中的y為零,第一行第一個(gè)頂點(diǎn)處在(0,0,0)點(diǎn)位置,之后的此行中,各頂點(diǎn)與上一頂點(diǎn)相隔長(zhǎng)度為m,第二行相隔上一行距離的長(zhǎng)度是m,第二行各個(gè)鄰居頂點(diǎn)間隔都是m,此后各行與上一行間隔是m并且本行鄰居位置的頂點(diǎn)間隔也為m,所有頂點(diǎn)構(gòu)成長(zhǎng)寬等距的矩形網(wǎng)格并與負(fù)z軸、坐標(biāo)為(0,0,0)的點(diǎn)和正x軸接壤;(2)假定在單位循環(huán)時(shí)刻圖片畫(huà)出前都從各行的前m個(gè)頂點(diǎn)中隨機(jī)選取一個(gè)頂點(diǎn)放一個(gè)帶指針的圓形紙片,各指針尾部按在各紙片中心,各針尖最前端與各紙片邊緣某處重合,各紙片和坐標(biāo)軸x平行;(3)各紙片的指針與頂點(diǎn)構(gòu)成的長(zhǎng)寬等距的矩形垂直,各紙片的指針和整個(gè)正y軸和負(fù)y軸組成的連線平行,指針?biāo)阜较蛩硎镜南蛄亢脱刂鴜軸的正無(wú)窮遠(yuǎn)延伸的方向所表示的向量構(gòu)成的角度為零,并且各紙片的中心位置與選取的隨機(jī)頂點(diǎn)重合;(4)各紙片以數(shù)值一樣的轉(zhuǎn)速圍著紙片中心勻速原地旋轉(zhuǎn)并且都沿著正x軸朝正無(wú)窮遠(yuǎn)延伸的方向做著相同速度的加速度為0的直線運(yùn)動(dòng);(5)各紙片在每次畫(huà)出圖片前都按相同的規(guī)定時(shí)間運(yùn)動(dòng);(6)當(dāng)長(zhǎng)寬等距的矩形上某個(gè)頂點(diǎn)被某個(gè)紙片中心經(jīng)過(guò)時(shí),把指針的針尖與紙片的重合位置的y值作為此刻頂點(diǎn)的y值,這個(gè)值可用余弦函數(shù)以及相應(yīng)的三角函數(shù)變換根據(jù)本次循環(huán)中運(yùn)動(dòng)開(kāi)始后當(dāng)前紙片在此時(shí)旋轉(zhuǎn)產(chǎn)生的角度計(jì)算;(7)當(dāng)各行的紙片在規(guī)定時(shí)間內(nèi)運(yùn)動(dòng)結(jié)束,使用OpenGL的語(yǔ)法連線、渲染和畫(huà)圖;(8)下一張圖片(也就是下一個(gè)單位循環(huán)時(shí)刻)依然按照前七步繪制。這里m為30。
4網(wǎng)格波動(dòng)界面關(guān)鍵內(nèi)容介紹
網(wǎng)格波動(dòng)界面使用C++與用戶界面程序開(kāi)發(fā)有關(guān)的開(kāi)發(fā)技術(shù)進(jìn)行搭建。在利用C++語(yǔ)法加入OpenGL有關(guān)的文件后,將運(yùn)動(dòng)方式算法和每一時(shí)刻的與畫(huà)圖有關(guān)的語(yǔ)句放到合適的位置進(jìn)行使用。由此,可以實(shí)現(xiàn)網(wǎng)格波動(dòng)界面的動(dòng)畫(huà)。
網(wǎng)格波動(dòng)界面程序邏輯上分為三大部分,第一部分為網(wǎng)格波動(dòng)界面的處理用戶與界面交互主函數(shù),第二部分為網(wǎng)格波動(dòng)界面的交互信息處理函數(shù),第三部分是與畫(huà)每一張圖片有關(guān)的函數(shù)。建立三部分之間聯(lián)系的方法是在處理用戶與界面交互主函數(shù)中利用while循環(huán)去檢測(cè)預(yù)先定義的交互信息結(jié)構(gòu)體有無(wú)內(nèi)容,有就用C++自帶的處理交互信息的函數(shù)發(fā)送到交互信息處理函數(shù)處理,處理后,程序?qū)⒗^續(xù)執(zhí)行處理用戶和界面交互主函數(shù)的那個(gè)循環(huán),這由運(yùn)行該波動(dòng)界面的電腦自身控制,沒(méi)有交互發(fā)生就執(zhí)行畫(huà)圖函數(shù)的調(diào)用語(yǔ)句。在處理用戶與界面交互主函數(shù)中,涉及的內(nèi)容從上到下接連為:初始化網(wǎng)格波動(dòng)界面語(yǔ)句塊,加載波動(dòng)界面畫(huà)圖設(shè)備函數(shù)體的調(diào)用語(yǔ)句,循環(huán)檢測(cè)(這是之前提到的while循環(huán)),界面銷毀句塊。交互信息處理函數(shù)使用C++的分叉條件判別語(yǔ)法編寫(xiě),它處理用戶按下鍵盤(pán)、按緊和松開(kāi)鼠標(biāo)、手握鼠標(biāo)滑動(dòng)、網(wǎng)格界面大小變化、銷毀網(wǎng)格波動(dòng)界面的交互信息。
網(wǎng)格波動(dòng)界面的關(guān)鍵部分起到的作用的闡述如下:(1)處理用戶與界面交互主函數(shù)的初始化網(wǎng)格波動(dòng)界面語(yǔ)句塊包含對(duì)波動(dòng)界面的屬性的定義、交互信息結(jié)構(gòu)體的定義以及注冊(cè)波動(dòng)界面和與建立波動(dòng)界面相關(guān)的操作。其中,波動(dòng)界面的屬性和交互信息的定義都是通過(guò)聲明擁有與網(wǎng)格波動(dòng)界面程序中的界面執(zhí)行相關(guān)聯(lián)屬性的結(jié)構(gòu)體的變量來(lái)在程序中使用它們。(2)處理用戶與界面交互主函數(shù)的加載波動(dòng)界面畫(huà)圖設(shè)備函數(shù)體的調(diào)用語(yǔ)句調(diào)用的是開(kāi)發(fā)波動(dòng)界面時(shí)編寫(xiě)的與向系統(tǒng)申請(qǐng)畫(huà)圖環(huán)境有關(guān)操作的函數(shù),它的內(nèi)容概括起來(lái)是利用windosws用戶界面開(kāi)發(fā)中需要的相關(guān)描述表去在一個(gè)操作系統(tǒng)的存儲(chǔ)區(qū)域內(nèi)分配一個(gè)用于進(jìn)行OpenGL畫(huà)圖動(dòng)作的工作區(qū)。(3)當(dāng)處理用戶與界面交互主函數(shù)的循環(huán)檢測(cè)發(fā)現(xiàn)交互信息結(jié)構(gòu)體有內(nèi)容,如之前所說(shuō),交互信息處理函數(shù)使用的C++的分叉條件判別語(yǔ)法會(huì)根據(jù)判別條件到相應(yīng)的位置去操作預(yù)先定義的全局變量或執(zhí)行C++自帶的會(huì)最終通知系統(tǒng)結(jié)束波動(dòng)界面運(yùn)行的語(yǔ)句。比如,當(dāng)判定交互信息是銷毀波動(dòng)界面時(shí),程序就會(huì)執(zhí)行這個(gè)最終將結(jié)束波動(dòng)界面運(yùn)行的語(yǔ)句。交互信息處理函數(shù)中的全局變量被執(zhí)行后,并且當(dāng)循環(huán)檢測(cè)執(zhí)行到相應(yīng)的畫(huà)圖函數(shù)時(shí),畫(huà)圖函數(shù)根據(jù)它們的某些元素影響這個(gè)函數(shù)中相應(yīng)分叉判別語(yǔ)句內(nèi)部的OpenGL函數(shù)的生效,這實(shí)現(xiàn)了用戶和波動(dòng)界面的交互產(chǎn)生時(shí)應(yīng)當(dāng)引發(fā)的內(nèi)容。當(dāng)沒(méi)有交互信息時(shí),循環(huán)檢測(cè)執(zhí)行相應(yīng)畫(huà)圖函數(shù)的調(diào)用語(yǔ)句,這個(gè)調(diào)用語(yǔ)句所關(guān)聯(lián)的函數(shù)體也是波動(dòng)界面的開(kāi)發(fā)中自行編寫(xiě)的。它解釋OpenGL在波動(dòng)界面每一張圖片繪畫(huà)時(shí)起到怎樣的作用,就是說(shuō)怎樣利用該技術(shù)提供的函數(shù)來(lái)刻畫(huà)圖片呈現(xiàn)給用戶的效果。不僅如此,這個(gè)自行編寫(xiě)的函數(shù)體還將上一節(jié)的模型通過(guò)程序?qū)崿F(xiàn)。(4)循環(huán)檢測(cè)的終止條件是當(dāng)交互信息結(jié)構(gòu)體的message屬性收到離開(kāi)循環(huán)的信息。當(dāng)離開(kāi)循環(huán)檢測(cè),程序就執(zhí)行界面銷毀句塊。它包含釋放界面和繪畫(huà)的工作區(qū)工作時(shí)所占的存儲(chǔ)空間。
5 效果展示
6結(jié)束語(yǔ)
1) 如圖1所示,在波動(dòng)界面的運(yùn)行場(chǎng)所中點(diǎn)擊啟動(dòng)調(diào)試后,可看到網(wǎng)格的波浪隨機(jī)擺動(dòng)的動(dòng)畫(huà);
2) 如圖2所示,由于用戶按下相應(yīng)鍵盤(pán),切換效果;
3) 如圖3所示,用戶利用鼠標(biāo)改變網(wǎng)格波動(dòng)界面大??;
4) 如圖4所示,網(wǎng)格波動(dòng)界面的畫(huà)面可以隨著用戶鼠標(biāo)的滑動(dòng)而變換視角;
5) 雖然實(shí)現(xiàn)了波濤洶涌的效果,但是,圖2效果不夠美觀,這是不足之處,可通過(guò)改進(jìn)3節(jié)模型規(guī)則后經(jīng)過(guò)程序?qū)崿F(xiàn)來(lái)改善放映效果。
參考文獻(xiàn):
[1] 羅玉. 3D海浪動(dòng)畫(huà)模擬技術(shù)研究[D]. 武漢理工大學(xué),2008:3.
[2] 鄒耀斌. 風(fēng)浪的行為特征建模[D]. 武漢理工大學(xué), 2007:5.
[3] 曾建英. 海浪的行為特征建模與實(shí)時(shí)繪制研究[D]. 武漢理工大學(xué),2009:6.
[4] 賈佳. 海面建模與繪制技術(shù)研究[D]. 天津大學(xué),2011:12.