羅新曼
(臨汾職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)系,山西 臨汾 041000)
近年來,隨著“互聯(lián)網(wǎng)+”被納入國家戰(zhàn)略,移動互聯(lián)網(wǎng)技術(shù)、信息技術(shù)迅速發(fā)展,直接影響著我們的生活習(xí)慣和學(xué)習(xí)、工作方式.計(jì)算機(jī)動畫技術(shù)也隨之飛速崛起,它的應(yīng)用領(lǐng)域日益擴(kuò)大,帶來的社會效益和經(jīng)濟(jì)效益也不斷增長.現(xiàn)階段主要被廣泛應(yīng)用于電影業(yè)、電視片頭、廣告、科學(xué)計(jì)算和工業(yè)設(shè)計(jì)、模擬、教育、娛樂以及虛擬現(xiàn)實(shí)與3D、Web等諸多領(lǐng)域.而在計(jì)算機(jī)動畫中,繪圖速度和圖像的清晰程度是至關(guān)重要的.由于動畫需要每秒產(chǎn)生20~30幀的畫面,因此對動畫中圖形的繪制速度有一定的要求,當(dāng)圖形的數(shù)據(jù)信息量較大時,繪圖的過程需花費(fèi)的時間也會隨之加長,在這個過程中可能還會伴隨有其它現(xiàn)象出現(xiàn)(如:圖形不斷閃爍).這時如果采用OpenGL提供的雙緩沖技術(shù)來完成圖形的繪制過程,這些問題便可以迎刃而解,從而為動畫的制作完成奠定了堅(jiān)實(shí)基礎(chǔ).
OpenGL[1]通俗來說就是一個軟件包,它的性能卓越,是專門針對三維圖形而制訂的一個通用標(biāo)準(zhǔn).對于窗口系統(tǒng)和操作系統(tǒng)來說,它是獨(dú)立的個體,利用它可開發(fā)出多種類型的應(yīng)用程序,這些應(yīng)用程序可以在各種不同的平臺間靈活地被移植而不受影響;同時它還能與Visual C++緊密接口,使得機(jī)械手的有關(guān)計(jì)算和圖形算法完整實(shí)現(xiàn),既能充分保證算法的正確性,又能保證其可靠性;另一方面,雖然OpenGL使用時較簡單,但是效率卻是極高的.
1) 建模功能:圖形庫中不但包含有繪制基本的點(diǎn)、線、多邊形的簡單函數(shù),同時還有很多復(fù)雜函數(shù),可完成對一些較復(fù)雜的三維物體(球、錐、多面體、茶壺等)以及帶有曲線、曲面的物體線、面的繪制,能完成快速建模.
2) 變換功能:OpenGL圖形庫的變換可分為基本變換和投影變換兩類.它的變換方法與機(jī)器人運(yùn)動學(xué)中的坐標(biāo)變換方法完全一致,對減少算法的運(yùn)行時間,提高三維圖形的顯示速度是很有利的.
3) 顏色模式設(shè)置功能:OpenGL顏色模式包括RGBA模式和顏色索引模式兩種.
4) 光照和材質(zhì)設(shè)置功能:OpenGL光有四種,即輻射光、環(huán)境光、漫反射光和鏡面光.材質(zhì)是用光反射率來表示.光的紅綠藍(lán)分量與材質(zhì)紅綠藍(lán)分量的反射率相乘后形成的顏色才是場景中物體最終反映到人眼中的顏色.
5) 紋理映射:OpenGL所提供的紋理映射功能對于表達(dá)物體表面的一些細(xì)節(jié)十分有利,仿真度極高.
6) 位圖顯示和圖像增強(qiáng)功能:圖像功能既包括基本的拷貝和像素讀寫,同時還有融合、反走樣和霧三種特殊圖像效果處理.而經(jīng)過這三種特殊效果處理,被仿真物的真實(shí)感會更強(qiáng),圖形顯示的效果也會隨之增強(qiáng).
7) 雙緩存(Double Buffering)動畫:所謂雙緩存,具體是指前臺緩存和后臺緩存,它們各司其職.具體來說,計(jì)算場景、生成畫面的任務(wù)由后臺緩存負(fù)責(zé),而前臺緩存則負(fù)責(zé)后臺緩存已畫好的畫面的完整顯示.另一方面,OpenGL還能使深度暗示、運(yùn)動模糊等特殊效果順利實(shí)現(xiàn),從而完成消隱算法.
所謂動畫,通常是指連續(xù)播放一組靜態(tài)畫面相互銜接而形成的動態(tài)效果.它是利用人眼具有視覺暫留這一特性,讓一幅幅靜態(tài)畫面 “動”起來的動態(tài)呈現(xiàn)過程.如果要活靈活現(xiàn)地展現(xiàn)一個事件的發(fā)展變化過程就可以使用動畫的方式來清晰、完整地進(jìn)行表現(xiàn).目前對動畫的定義公認(rèn)為:它實(shí)際是一門產(chǎn)生運(yùn)動視覺的技術(shù),是將一組組單個且具有連續(xù)性的畫面拍攝在膠片上,從而產(chǎn)生視覺運(yùn)動的技術(shù)手段,這種視覺技術(shù)是通過將膠片以一定的速度放映的形式而具體體現(xiàn)出來的.
計(jì)算機(jī)動畫[2]是指采用一種先進(jìn)技術(shù)讓靜止圖像進(jìn)行連續(xù)播放,從而呈現(xiàn)出物體不同運(yùn)動狀態(tài)的一種動態(tài)效果,也就是利用計(jì)算機(jī)產(chǎn)生圖形、圖像運(yùn)動的技術(shù).計(jì)算機(jī)動畫通過對圖形和圖像采用綜合處理技術(shù),再通過程序編寫軟件和制作動畫軟件相結(jié)合設(shè)計(jì)出多組動態(tài)畫面.將前一幀的內(nèi)容設(shè)計(jì)為物體的某個特定狀態(tài),而當(dāng)前幀的內(nèi)容則修改為它的另一個狀態(tài),利用動畫軟件形成動態(tài)效果.動畫制作軟件系統(tǒng)主要包括以下幾種:(1)腳本系統(tǒng).它是早期的動畫制作系統(tǒng);(2)程序動畫.是采用一系列程序來定義在特定時段某一角色的運(yùn)動,這些程序是采用角色的物理規(guī)則和動畫的生成方法來生成的;(3)表示動畫.這種動畫允許在動畫過程對象的形狀發(fā)生變化;(4)隨機(jī)動畫.這種動畫采用隨機(jī)過程來控制角色的運(yùn)動;(5)行為動畫.這種動畫系統(tǒng)中的物體或角色定義中就已經(jīng)明確規(guī)定了這些物體或角色應(yīng)處在什么樣的環(huán)境中,以及要遵循什么樣的規(guī)則.計(jì)算機(jī)將根據(jù)這些要素構(gòu)造一個虛擬的動畫世界,其中虛擬出來的一些景物、建造體、物體和虛擬攝像機(jī)的運(yùn)動過程,完全是由我們選用的計(jì)算機(jī)系統(tǒng)的基本處理功能來決定的.
計(jì)算機(jī)動畫的關(guān)鍵技術(shù)體現(xiàn)在計(jì)算機(jī)動畫制作軟件和硬件上.動畫軟件、硬件的功能不同,則可實(shí)現(xiàn)的的動畫效果也不同.從計(jì)算機(jī)動畫軟件實(shí)現(xiàn)的角度來看,其關(guān)鍵技術(shù)主要包括以下幾種類型.
(1) 關(guān)鍵幀動畫:計(jì)算機(jī)動畫模仿傳統(tǒng)動畫的生成方法,先繪制出關(guān)鍵幀,然后再根據(jù)關(guān)鍵幀進(jìn)行插值,繪出中間幀,因此稱為關(guān)鍵幀動畫.設(shè)置為關(guān)鍵幀的位置一般是指在此處會出現(xiàn)動作上的某種變化,對一些連續(xù)動作起著關(guān)鍵的轉(zhuǎn)折作用.關(guān)鍵幀技術(shù)通過對運(yùn)動物體的運(yùn)動參數(shù)插值實(shí)現(xiàn)對動畫的運(yùn)動控制.
(2)運(yùn)動軌跡法:基本運(yùn)動學(xué)描述,通過指定物體的空間運(yùn)動路徑來確定物體的運(yùn)動,并在物體的運(yùn)動過程中允許對物體實(shí)施各種幾何變換(如縮放、旋轉(zhuǎn)等),但不引入運(yùn)轉(zhuǎn)的力.
(3)運(yùn)動動力學(xué)法:基于具體的物理模型,運(yùn)動過程由描述物理定律的力學(xué)公式來得到.該方法綜合考慮到物體的質(zhì)量、慣性、摩擦力、引力、碰撞力等多個物理因素.其他還包括人體動畫、基于物理特征的動畫等[3].
在計(jì)算機(jī)動畫中,由于需要每秒產(chǎn)生20~30幀的畫面,因此對圖形的繪制速度有一定的要求,當(dāng)圖形的數(shù)據(jù)信息量較大時,繪圖的過程需花費(fèi)的時間也會隨之加長,在這個過程中可能還會伴隨有其它現(xiàn)象出現(xiàn)(如:圖形不斷閃爍).這時如果采用OpenGL提供的雙緩沖技術(shù)來完成圖形的繪制過程,則可以有效防止這些問題的出現(xiàn).雙緩沖是指在計(jì)算機(jī)內(nèi)存中創(chuàng)建一個對象區(qū)域,讓其與屏幕上的繪圖區(qū)域保持一致,首先在內(nèi)存中的這個區(qū)域中完成圖形的全部繪制操作,然后將內(nèi)存中對象上的圖形一次性完整地復(fù)制到屏幕上繪圖的區(qū)域,經(jīng)過如此處理可快速完成圖形的繪制.
OpenGL支持雙緩沖,它是可以通過一個函數(shù)調(diào)用來實(shí)現(xiàn)前、后緩沖區(qū)之間信息交換的.OpenGL雙緩沖技術(shù)使用如下:
Windows編程環(huán)境下調(diào)用如下函數(shù):
SwapBuffers( );
控制臺編程環(huán)境下調(diào)用的函數(shù)為:
glutSwapBuffers( );
glutnisDisplayMode(GLUT_DOUBLE|GLUT_RGB);//指定一個雙緩沖窗口,完成所有繪圖代碼都在畫面外的緩沖區(qū)進(jìn)行渲染.
計(jì)算機(jī)動畫還需要進(jìn)行窗口定時刷新:
glutPostRedisplay( );//刷新當(dāng)前窗口
glutTimeFune(int interval,void*TimeFunc,1);//登記一個回調(diào)函數(shù),經(jīng)過設(shè)定的時間值后由GLUT調(diào)用該函數(shù).
下面以完成一個逆時針旋轉(zhuǎn)的茶壺動畫為例說明其實(shí)現(xiàn)過程.首先在屏幕上繪制一個繞經(jīng)點(diǎn)(0,0,0),(1,1,1)的矢量圖形茶壺,動畫實(shí)現(xiàn)逆時針旋轉(zhuǎn),每隔50 ms刷新一次窗口.
代碼如下:
#include
Double dlst=0;
Void Timerloop(int);
Void Render(void);
Void main(void)//主函數(shù)入口
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutCreate Window(“Animation”);
glutDisplayFunc(Render);
……
glutTimeFunc(50,TimerLoop,1);
……
glutMainloop();
}
Void Render(void)
{//計(jì)算旋轉(zhuǎn)角度
dist+=10.0f;
if(dist>360.0f)
dist =10.0f;
//繪圖
glClear(GL_COLOR_DUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glClear;
glColor3f(255,0,0);
glPushMatrix( );
glRotatef(dist,1.0f,1.0f,1.0f);
glutSolidTeapot(0.4);
glPopMatrix( );
glFinish( );
glutSwapBuffers( );//在雙緩沖模式下進(jìn)行一次緩沖區(qū)交換
}
Void TimerLoop(int value)
{glutPostRedisplay( );//刷新當(dāng)前窗口
glutTimerFunc(50,TimerLoop,1);
}
當(dāng)前我們正處于互聯(lián)網(wǎng)飛速發(fā)展的時代,計(jì)算機(jī)動畫技術(shù)作為一種新的信息制作與傳播方式,在各個領(lǐng)域的應(yīng)用價值都是不可估量的.隨著計(jì)算機(jī)動畫應(yīng)用的不斷深入,動畫中對圖形圖像的繪制速度和質(zhì)量的要求必將會更快更高,而OpenGL所提供的雙緩沖技術(shù)首先在內(nèi)存中的這個對象上完成圖形繪制的所有操作,然后再將該圖形一次性完整地復(fù)制到屏幕上,如此既可以快速完成,同時還能保證清晰度不受影響.計(jì)算機(jī)動畫將會給我們帶來一個比現(xiàn)實(shí)更加豐富多彩的世界,呈現(xiàn)給我們一個新奇的視覺效果和視覺體驗(yàn).