版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、VC++動(dòng)畫圖形繪制,概述,計(jì)算機(jī)動(dòng)畫:借助計(jì)算機(jī)生成一系列供動(dòng)態(tài)演示圖形的技術(shù)。動(dòng)畫技術(shù)在CAD、CAM、CAI等許多領(lǐng)域里都有廣泛應(yīng)用動(dòng)畫直觀、形象等特點(diǎn),在模擬仿真領(lǐng)域也有關(guān)非常重要的地位。如模擬航空器飛行,能使飛行員在計(jì)算機(jī)上處理實(shí)際飛行中可能出現(xiàn)的問題。計(jì)算機(jī)生成動(dòng)畫的兩種途經(jīng):利用現(xiàn)成的動(dòng)畫制作軟件,如二維的Flash工具、三維的3DMAX工具等。生成動(dòng)畫比較方便、快速,制作人員無需掌握編程知識(shí),在較短的時(shí)間內(nèi)就
2、能學(xué)會(huì)。直接通過編寫程序來生成動(dòng)畫要求制作人員具備一定的程序設(shè)計(jì)知識(shí),動(dòng)畫編程技巧。利用計(jì)算機(jī)編程可產(chǎn)生5種類型的動(dòng)畫:異或動(dòng)畫、調(diào)色板動(dòng)畫、偵動(dòng)畫、塊動(dòng)畫和實(shí)時(shí)動(dòng)畫。,動(dòng)畫類型簡介,異或動(dòng)畫:利用異或方式在原來位置重畫,就能快速地擦除剛才的畫的物體,然后在新位置顯示出來。異或操作:異或是一個(gè)數(shù)學(xué)運(yùn)算符。他應(yīng)用于邏輯運(yùn)算。 其運(yùn)算法則為a異或b=a‘b+ab’(a‘為非a)。例如:00001111異或11111111=11110
3、000調(diào)色板動(dòng)畫:通過將各個(gè)像素點(diǎn)的顏色按一定的方式進(jìn)行循環(huán)變化,就可以模仿出流動(dòng)的水、空氣和亮度等變化。偵動(dòng)畫:(翻頁式動(dòng)畫)是將動(dòng)畫所有的偵準(zhǔn)備好,然后快速地切換每一偵畫面,由此形成動(dòng)畫。塊動(dòng)畫:將顯示對象分為背景和前景兩部分,背景不發(fā)生改變面前景不斷變化,便顯示出動(dòng)畫效果。實(shí)時(shí)動(dòng)畫:在動(dòng)畫過程中實(shí)時(shí)地繪制圖形,至少需要兩個(gè)圖形頁,當(dāng)在一頁上繪制圖形時(shí)另一而被顯示出來,如此循環(huán)切換來顯示動(dòng)畫。,1 異或動(dòng)畫,1.1異或動(dòng)畫原
4、理繪制圖形時(shí)使用異或光柵操作代碼,即R2_XORPEN代碼, R2_XORPEN表將畫筆和屏幕顏色進(jìn)行異或運(yùn)算,它們是繪制圖形的基礎(chǔ),也是這種繪制方法名的由來。最后結(jié)果是兩種顏色的異或,異或運(yùn)算規(guī)則見下表:,1.1異或動(dòng)畫原理,第一次異或方式在屏幕上某一位置畫圖時(shí),最后的結(jié)果是畫筆顏色和屏幕顏色的異或。第二次在相同位置用異或方式重畫后,最后的結(jié)果又變回屏幕原來的顏色,也就是將第一次所畫的物體擦除了。由于是位運(yùn)算,速度非???,不會(huì)出
5、現(xiàn)閃爍現(xiàn)象。在某一開始位置用異或的方式畫一物體,然后隔一定的時(shí)間間隔在上次的位置再畫一次,然后沿某個(gè)方向移動(dòng)一微小距離,在新的位置將物體再畫一遍,如此循環(huán)下去,就可以看到一個(gè)物體在運(yùn)動(dòng),可形成動(dòng)畫。,1.2異或動(dòng)畫舉例,例子:在交互式繪圖中用戶想畫一條直線,首先按下鼠標(biāo)左鍵確定直線起點(diǎn),接著移動(dòng)鼠標(biāo),這時(shí)會(huì)有一條直線隨著鼠標(biāo)移動(dòng),直到用戶松開左鍵為止,這條隨鼠標(biāo)移動(dòng)的直線稱為“像皮筋”。第一步:定義兩個(gè)變量CPoint start
6、,end;//直線的起點(diǎn)和終點(diǎn)int flag;//標(biāo)志:第一次鼠標(biāo)左鍵:0 第二鼠標(biāo)左鍵:1在構(gòu)造方法中初始化flag=0;第二步:增加鼠標(biāo)左鍵消息處理及代碼,1.2異或動(dòng)畫舉例,CDC * dc = GetDC(); //取得繪圖設(shè)備環(huán)境上下文指針 CPen newpen(PS_SOLID,0,RGB(255,0,0)); //創(chuàng)建新的畫筆CPen * oldpen;if(flag ==0){ //第一次按下鼠標(biāo)
7、左鍵時(shí)flag=1;start=end=point;}else{ //第二次按下鼠標(biāo)左鍵時(shí)oldpen=dc->SelectObject(&newpen);//將新畫筆選進(jìn)設(shè)備上下文中,將原設(shè)備上下文存于舊畫筆中dc->SetROP2(R2_XORPEN); //設(shè)備畫線模式為異或dc->MoveTo(start); //移動(dòng)到起點(diǎn)dc->LineTo(end); //畫
8、線到終點(diǎn),將這前所畫線條用異或模式擦除end=point;//重新設(shè)置終點(diǎn)dc->SetROP2(R2_XORPEN);//設(shè)備畫線模式為異或dc->MoveTo(start);dc->LineTo(end);dc->SelectObject(oldpen); //將舊畫筆選進(jìn)設(shè)備上下文flag=0; //還原狀態(tài)}ReleaseDC(dc);,1.2異或動(dòng)畫舉例,第三步:增加鼠
9、標(biāo)移動(dòng)消息處理及代碼 CDC * dc = GetDC(); CPen newpen(PS_SOLID,0,RGB(255,0,0));CPen * oldpen=dc->SelectObject(&newpen);dc->SetROP2(R2_XORPEN);if(flag==1){dc->MoveTo(start);dc->LineTo(end);end = poi
10、nt;dc->MoveTo(start);dc->LineTo(end);}dc->SetROP2(R2_XORPEN);dc->SelectObject(oldpen);ReleaseDC(dc);,2 調(diào)色板動(dòng)畫,2.1調(diào)色板動(dòng)畫原理一個(gè)調(diào)色板包含一組256個(gè)24位的RGB顏色值。調(diào)色板不同顏色就不同,最多有256種,從0-255索引:在顯示緩存中,每個(gè)像素都有一個(gè)從0-25
11、5的值。這個(gè)像素值指出了使用調(diào)色板中的哪種顏色給該像素著色。改變像素顏色的方法:改變像素的索引值,使其指向調(diào)色板中拐一項(xiàng);改變調(diào)色板的RGB值。注意:第二種方法將導(dǎo)致屏幕上所有使用該調(diào)色板項(xiàng)值的像素的顏色都發(fā)生變化。缺點(diǎn):整個(gè)屏幕只能顯示256種顏色,而不是針對某個(gè)窗口或應(yīng)用程序。優(yōu)點(diǎn):使未壓縮的圖像文件比真彩色圖像小三分之二;可以使用Windows固有的調(diào)色板操作函數(shù)執(zhí)行一種比較流行且經(jīng)濟(jì)的動(dòng)畫--調(diào)色板動(dòng)畫。調(diào)色板動(dòng)畫就是
12、通過有規(guī)律地改變每個(gè)像素的索引值,使得屏幕上每個(gè)像素的顏色發(fā)生變化,形成一種動(dòng)感。能很好地模仿出流動(dòng)的水、空氣、亮度等變化效果。,2.2 生成調(diào)色板動(dòng)畫的步驟,2.2生成調(diào)色板動(dòng)畫的步驟1.聲明一個(gè)調(diào)色板對象,并將它初始化2.創(chuàng)建幾把畫刷,每把畫刷用標(biāo)志置成0x01的值以初始化,這表明每個(gè)畫刷的顏色都是一個(gè)指定調(diào)色板位置的索引3.設(shè)置一個(gè)定時(shí)器,用它來控制隔多長時(shí)間將屏幕重畫。4.用創(chuàng)建的每把刷子各畫一個(gè)物體。5.每隔一定時(shí)間
13、調(diào)用調(diào)色板的操作函數(shù)AnimatePalette來改變每把畫刷的索引最后的結(jié)果就是看起來屏幕上的每個(gè)物體在不停地移動(dòng),實(shí)際上是它們的顏色在發(fā)生改變。,2.3 調(diào)色板動(dòng)畫舉例,2.3 調(diào)色板動(dòng)畫舉例創(chuàng)建一個(gè)基于對話框的應(yīng)用程序,在對話框的四周車許多小圓表示燈炮,程序運(yùn)行時(shí)各個(gè)小圓的顏色發(fā)生變化,好像門上閃爍的燈。,3 幀動(dòng)畫,3.1幀動(dòng)畫原理幀動(dòng)畫也稱頁動(dòng)畫或全屏幕動(dòng)畫。動(dòng)畫程序預(yù)先建立許多幅全屏幕圖像,并將每幅圖像都存起來。每
14、幅圖像也稱為一幀面,播放時(shí)程序依次顯示每幅圖像,形成動(dòng)畫。常用于復(fù)雜的整屏三維動(dòng)畫。3.2制作幀動(dòng)畫首先:把第一幀畫面建立起來。一般情況每幀的場景都非常復(fù)雜,習(xí)慣上都是用其他圖形圖像處理軟件來實(shí)現(xiàn)。由于每一秒至少需要24幀畫面才能取得比較好的效果,所以工作量非常大,而且需要的時(shí)間也比較多。其次:用動(dòng)畫播放程序來播放每一幀畫面,當(dāng)每一幀都比較小時(shí)可以一次將所有幀都讀入內(nèi)存,然后按照一定時(shí)間間隔連續(xù)顯示每一幀畫面。,,onDr
15、aw函數(shù)CFrameDoc* pDoc = GetDocument();if(flag){//當(dāng)播放時(shí)pDC->SetStretchBltMode(COLORONCOLOR);//設(shè)置位圖拉伸模式(采用保存彩色位圖顏色模式)//將指定內(nèi)存位置大小的位圖在屏幕上顯示出來pDC->StretchBlt(100, 50, m_sizeDest.cx, m_sizeDest.cy,&m_pdcMemory[ind
16、ex], 0, 0,m_sizeSource.cx, m_sizeSource.cy, SRCCOPY);}定義菜單及消息(OnViewPlay)if(flag){ //如果flag為真,則播放動(dòng)畫,否則清屏flag=FALSE; Invalidate();}else flag=TRUE;,,增加定時(shí)器及響應(yīng)消息(onTimer)if(flag){ if(index==0)index=1;else
17、index=0;Invalidate();}初始化更新m_pBitmap[0].LoadBitmap(IDB_BITMAP1);//將位置裝入內(nèi)存m_pBitmap[1].LoadBitmap(IDB_BITMAP2);for(int i=0;i<2;i++){CClientDC dc(this);//創(chuàng)建關(guān)于窗口客戶區(qū)的設(shè)備上下文OnPrepareDC(&dc); // 在調(diào)用屏幕顯示的重繪函數(shù)前應(yīng)先調(diào)
18、用m_pdcMemory[i].CreateCompatibleDC(&dc);//創(chuàng)建兼容的內(nèi)存設(shè)備上下文m_pdcMemory[i].SelectObject(&m_pBitmap[i]);//將位圖選進(jìn)內(nèi)存設(shè)備上下文m_pBitmap[i].GetObject(sizeof(bm), &bm);//得到位圖的長和寬m_sizeSource.cx = bm.bmWidth;//初始化源塊大小m_si
19、zeSource.cy = bm.bmHeight;m_sizeDest = m_sizeSource; //將源塊大小賦予目標(biāo)區(qū)域dc.DPtoLP(&m_sizeDest);} //將設(shè)備坐標(biāo)轉(zhuǎn)換成邏輯坐標(biāo)int nTimer=SetTimer(1,200,NULL);//設(shè)置定時(shí)器ASSERT(nTimer!=0);,3 幀動(dòng)畫,3.2程序舉例及說明定義變量:CFrameDoc* GetDocument(
20、);CDC m_pdcMemory[2]; //設(shè)備上下文指針數(shù)組CBitmap m_pBitmap[2]; //位圖指針數(shù)組CSize m_sizeDest;//目標(biāo)區(qū)域大小CSize m_sizeSource;//源塊大小BOOL flag;//標(biāo)志,是否播放動(dòng)畫int index;//畫面序號(hào)設(shè)置默認(rèn)狀態(tài)(View的構(gòu)造函數(shù)中)Flag=FALSE;Index=0;,4 塊動(dòng)畫,4.1 塊動(dòng)畫原理
21、塊動(dòng)畫又稱為子畫面動(dòng)畫、部分屏幕動(dòng)畫顯示對象分成兩部分:背景和前景背景通過不發(fā)生變化,前景不斷地運(yùn)動(dòng)、改變,只要將背景畫一次,不斷更新前景就形成了塊動(dòng)畫。由于每次不需要刷新整個(gè)屏幕,而僅僅是一小部分,所以可以獲得很高的動(dòng)畫速度。許多電腦游戲中能看到這種動(dòng)畫,如背景上面有坦克或飛機(jī)到處移動(dòng)。4.2 塊動(dòng)畫的制作過程準(zhǔn)備好一幅背景圖畫和一幅前景圖(子畫面)顯示背景圖確定子圖畫面將顯示的位置,將可能被子畫面覆蓋的背景保存起來
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微波輻射強(qiáng)化制備改性膨潤土及其應(yīng)用的研究.pdf
- 鋰基微波介質(zhì)陶瓷低溫?zé)Y(jié)及其應(yīng)用基礎(chǔ)研究.pdf
- 松散狀路用木質(zhì)纖維制備及其應(yīng)用研究.pdf
- 煙桿裂解及微波膨化的研究.pdf
- 鋰基微波介質(zhì)陶瓷的制備與性能研究.pdf
- 木質(zhì)素基活性炭的制備及其應(yīng)用.pdf
- 四鈦酸鋇基微波介質(zhì)陶瓷的制備與改性研究.pdf
- 利用微波能量原理的微波介質(zhì)陶瓷應(yīng)用研究.pdf
- 微波陶瓷在微波爐中的應(yīng)用研究.pdf
- 尖晶石基透明陶瓷的制備及其光學(xué)、微波介電性能的研究.pdf
- 低介微波介質(zhì)陶瓷及BST基鐵電陶瓷的凝膠注模制備技術(shù)及其性能研究.pdf
- MgTiO3基微波介質(zhì)陶瓷的制備與性能研究.pdf
- 低介透明微波陶瓷制備及其性能研究.pdf
- 鋯鈦酸鑭鉛陶瓷制備及其應(yīng)用研究
- 鋯鈦酸鑭鉛陶瓷制備及其應(yīng)用研究.pdf
- 水污染的微波輻射特性及應(yīng)用研究.pdf
- 全極化微波輻射計(jì)海洋應(yīng)用研究.pdf
- 微波燒結(jié)制備陶瓷表面鈷基合金功能涂層的研究.pdf
- SrTiO3基微波介質(zhì)陶瓷的制備與改性研究.pdf
- 生物基納米膠乳的制備及其應(yīng)用研究.pdf
評論
0/150
提交評論