




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、用計(jì)算機(jī)程序制作三維立體畫摘 要 該文介紹了三維立體畫的原理和制作方法,并給出了用c語言編寫的源程序。借助于pbrush.exe,讀者可以自己設(shè)計(jì)和欣賞各式各樣的三維立體畫。 目前,市面上正在流行各式各樣的立體畫,其特點(diǎn)是從外表來看與一般的圖案很相似,但是雙眼緊盯著注視片刻后,一恍惚之間眼前便出現(xiàn)了畫中畫立體像。筆者第一次看到這種畫便被發(fā)明者的創(chuàng)意所傾倒。利用眾所皆知的雙眼視差原理,竟能在一張平面紙上制造出如此奇幻。但是立體畫本身除了其發(fā)明者的靈感和畫面創(chuàng)作者的別出心裁之外,其原理上并無神秘之處。用計(jì)算機(jī)程序來實(shí)現(xiàn)它,可說是易如反掌。筆者用一個(gè)晚上時(shí)間,便在微機(jī)上用basic語言實(shí)現(xiàn)了簡(jiǎn)單形體
2、平面圓餅的立體畫。當(dāng)然,要使該程序具有完善的功能,提高其制作速度,還是應(yīng)該用編譯語言(如c語言)來編寫。本文中給出的源程序借助于windows中的.bmp圖形文件,可使大家自己制作任意形態(tài)的立體畫。一、立體畫的原理 看過立體電影的人都知道,當(dāng)人的雙眼分別接收不同視角拍攝的圖像時(shí)便會(huì)產(chǎn)生立體感。這是由于人眼長(zhǎng)期觀察的習(xí)慣造成的。和立體電影原理相同的立體攝影風(fēng)景照片也很早就已出現(xiàn)。圖1中給出了這種立體照片的示意圖。左、右照片分別是人的雙眼角度上觀察一棱錐體時(shí)左右眼看到的圖像(圖2)。左眼看到的是棱錐的頂端向右錯(cuò)動(dòng)了一些的圖像,右眼的看到則是棱錐的頂端向左錯(cuò)動(dòng)了一些的圖像。如果用一張硬卡片隔開兩張照
3、片(如圖3),09a04000.gif;圖109a04001.gif;圖209a04002.gif;圖3雙眼分別看兩張畫,會(huì)看到一個(gè)立體的棱錐體。這種立體照片的觀察方法在測(cè)繪學(xué)中也早已采用。但是,目前的三維立體畫在形式上與這些很不相同。它是怎樣在同一張畫面上呈現(xiàn)立體的呢?首先,分析一下人們是怎樣從這些立體畫中看出“立體形體”的。從前面所說的可以知道,人眼要得到立體感,雙眼必須有視差,即雙眼看到的圖像應(yīng)該有差異。人們?cè)诳戳Ⅲw畫時(shí),都有“恍惚”一下的過程。在這過程中,雙眼的視中心發(fā)生了錯(cuò)動(dòng)(如圖4)。這樣09a04003.gif;圖4左眼看到的是畫面的“偏左像”,右眼看到的是畫面的“偏右像”。只要
4、“偏左像”和“偏右像”的內(nèi)容相當(dāng)于圖1的左、右照片,雙眼就會(huì)感到立體形體。那么,能否把圖1的左、右照片分別當(dāng)做“偏左像”和“偏右像”,簡(jiǎn)單重疊來得到立體畫呢?顯然不行。能夠合成立體畫的“偏左像”和“偏右像”是要滿足一定條件的。如果圖5中表現(xiàn)的棱錐體的表面上有圖案的話,09a04004.gif;圖5像素a和像素a''應(yīng)該具有相同的顏色,因?yàn)樗鼈兪菑牟煌暯怯^察的同一個(gè)實(shí)體點(diǎn)。像素b和像素b''、像素c和像素c''的情況與此相同。把兩幅畫分別當(dāng)作“偏左圖”和“偏右圖”,部分重疊成為同一畫面時(shí),在新的畫面上這種關(guān)系仍應(yīng)該表現(xiàn)為a=a''
5、,b=b'',c=c''(如圖6)。但這時(shí)應(yīng)該注意到,在這張合成09a04005.gif;圖6畫面上,點(diǎn)a''既是“偏右圖”上的點(diǎn)a'',又是“偏左圖”上的點(diǎn)b。而一張畫面上相同坐標(biāo)點(diǎn)的像素只可能是一種顏色,因此,產(chǎn)生了新的像素關(guān)系a''=b。另外,點(diǎn)a既是“偏左圖”上的點(diǎn)a,又是“偏右圖”上的點(diǎn)c'',所以,a=c''。以此類推,點(diǎn)b''和點(diǎn)c也有類似的情況。因此出現(xiàn)了新的關(guān)系表示式,.''=c=c''=a=a''=b
6、=b''=.。這就構(gòu)成了立體畫面上像素必須要滿足的條件:“等顏色像素鏈”。立體畫上的所有點(diǎn)都從屬于某一條“等顏色像素鏈”。這就是所有立體畫圖案都呈現(xiàn)出某種程度上的水平周期性的原因。因此,對(duì)于任意立體形狀,只要構(gòu)造出相應(yīng)的這種“等像素鏈”,并按其規(guī)律充填圖案即可得到立體畫。但是正如前面所述,由于這種“等像素鏈”條件的約束,人們雖然可以隨意構(gòu)造出各種形體的立體畫,但其立體形體的表面圖案是不能完全隨人意愿的。二、制作立體畫的計(jì)算機(jī)程序由于人的雙眼的水平性,以上的“等像素鏈”只按水平方向分布,與垂直方向無關(guān)。因此,在程序中,各個(gè)像素行的處理過程是相互獨(dú)立的。制作立體畫的程序主結(jié)構(gòu)圖如圖
7、7。09a04006.gif;圖7 制作立體畫的程序主結(jié)構(gòu)圖在以上結(jié)構(gòu)圖中,關(guān)鍵是如何建立“等像素鏈”。具體的處理如下。對(duì)于立體形體上的每一個(gè)點(diǎn),首先求出該點(diǎn)在“偏左圖”和“偏右圖”上的坐標(biāo)。以圖1中的棱錐頂點(diǎn)為例,實(shí)際上其x坐標(biāo)是在中心點(diǎn),但由于雙眼的位置并不在其正上方,頂點(diǎn)在“偏左圖”上向右位移,在“偏右圖”上向左位移,而且其位移值的大小顯然與其高度有關(guān),即該點(diǎn)坐標(biāo)越高位移值就越大。,b,c等點(diǎn)也都有這些位移。在求出一個(gè)點(diǎn)在“偏左圖”和“偏右圖”上的坐標(biāo)后,再算出在合成圖(如圖6)上的對(duì)應(yīng)坐標(biāo),以建立“等像素”關(guān)系,如a=a''。當(dāng)立體形體的一個(gè)水平剖面上的全部點(diǎn)經(jīng)過以上處
8、理后,合成圖的各條“等像素鏈”關(guān)系也就自然形成了。另外,由于有可能出現(xiàn)高點(diǎn)遮蓋低點(diǎn)的情況,“等像素鏈”的構(gòu)造應(yīng)該從低點(diǎn)到高點(diǎn)逐層進(jìn)行,高點(diǎn)的“等像素”關(guān)系將替代低點(diǎn)的“等像素”關(guān)系。這也是程序主結(jié)構(gòu)圖中“首先,對(duì)于沒有任何形體存在的背景平面構(gòu)造等像素鏈”的原因。下面給出了根據(jù)以上結(jié)構(gòu)圖用c語言編寫的源程序。程序中,每一個(gè)坐標(biāo)點(diǎn)對(duì)應(yīng)一個(gè)結(jié)構(gòu)型數(shù)據(jù),它包含“前像素”、“后像素”兩個(gè)指針?!扒跋袼亍敝羔樦赶蛟撟鴺?biāo)點(diǎn)作為“偏右圖”上的一點(diǎn),在“偏左圖”所對(duì)應(yīng)的點(diǎn)的坐標(biāo)?!昂笙袼亍敝羔樦赶蛟撟鴺?biāo)點(diǎn)作為“偏左圖”上的一點(diǎn),在“偏右圖”所對(duì)應(yīng)的點(diǎn)的坐標(biāo)。程序中,“立體形體水平剖面的高低坐標(biāo)數(shù)據(jù)”、“原始圖案
9、素材”和輸出的“立體畫”的文件格式都是采用了windows3.1 的pbrush產(chǎn)生的bmp圖形文件格式。圖幅大小要求都是640×400,用16種顏色方式。其中,立體形體上各點(diǎn)的高低坐標(biāo)用圖形文件中的顏色值表示,因此該圖形文件的圖形與帶顏色的等高線圖安全相同。通常情況下,在16色的bmp文件中顏色值從小到大的順序?yàn)?黑色、暗紅色、暗綠色、暗黃色、暗藍(lán)色、暗紫色、暗青色、暗灰色、灰色、明紅色、明綠色、明黃色、明藍(lán)色、明紫色、明青色、白色。本程序采用最簡(jiǎn)單的“圖案充填”方案,即各條“鏈”上的像素點(diǎn)皆采用該“鏈”上的第一個(gè)像素的顏色。程序中的常數(shù)eye-space表示“偏左圖”和“偏右圖”
10、之間的偏差,bo-dot是表明“鏈”的首或尾的指針標(biāo)志。該程序寄生在windows 3.1中的pbrush軟件上。借助于它來構(gòu)筑立體形體(即立體形體水平剖面高低坐標(biāo)數(shù)據(jù)文件圖8),設(shè)計(jì)原始圖案(圖9)。程序運(yùn)行后,逐行輸入并處理以上兩個(gè)文件中的圖形,然后輸出立體畫結(jié)果文件(圖10)。最后,用pbrush來觀賞立體畫result.bmp。當(dāng)然,要設(shè)計(jì)出令人賞心悅目的立體畫,必須在立體形體和圖案素材的選擇和搭配上做到天衣無縫,獨(dú)具匠心。09a04007.gif;圖809a04008.gif;圖909ain the file */bitmapfileheader;struct tagbitmapin
11、foheaderunsigned long int bisize,/* size of bitmapinfoheader */biwidth;/* width in pixels biheight;/* height in pixels */unsigned int biplanes, /* always 1 */bibitcount; /* color bits per pixel must be 1,4,8 or 24 */unsigned long int bicompression, /*bi-rgb,bi-rle 8 or 4*/bisizeimage, /*total bytes
12、in image */bixpelspermeter,/* 0,or opt,h res. */biypelspermeter,/* 0,or opt,h res. */biclrused, /* normally 0,can set a lower no. colors than bibitcount */biclrimportant; /* normally 0 */bitmapinfoheader;struct tagrgbquadunsigned char rgbblue, /* blue intensity,0-255 */rgbgreen, /* green intensity,0
13、-255 */rgbred, /* red intensity,0-255 */rgbreserved; /* reserved,set to zero */rgbquadnum-color;char *fn-layer="layer.bmp"char *fn-org="origin.bmp"char *fn-result="result.bmp"file *flayer,*forigin, *fresult;unsigned char tmp-byte1,tmp-byte2;unsigned int line,i-byte,i-pi
14、xel,x;unsigned int layer;int left-x,right-x;tmp-x;unsigned long int cur-offset;unsigned char hwidth,org-colorwidth;puts("-wintrick-");puts("-by li jisong -");if( (flayer=fopen(fn-layer,"rb") )!=null) fread(&bitmapfileheader,size-of-bitmapfilehader,1,flayer);fread(&a
15、mp;bitmapinfoheader,size-of-bitmapinfoheader,1,flayer);if( bitmapfileheader.bftype1=''b'' && bitmapfileheader.bftype2=''m''&& bitmapinfoheader.biwidth=width && bitmapinfoheader.biheight=num-line&& bitmapinfoheader.bibitcount=bits-per-pi
16、xel&& bitmapinfoheader.bicompression=compression)fread(rgbquad,size-of-rgbquad,num-color,flayer);elsefclose(flayer);printf("file %s is not fit for this program!n",fn-layer);getch();exit(1);elseprintf("file %s does not exist!n",fn-layer);getch();exit(2);if( (forigin=fopen(
17、fn-org,"rb")!=null) fread(& bitmapfileheader,size-of-bitmapfileheader,1,forigin);fread(& bitmapinfoheader,size-of-bitmapinfoheader,1,forigin);if( bitmapfileheader.bftype1=''b'' && bitmapfileheader.bftype2=''m''&& bitmapinfoheader.biwi
18、dth=width && bitmapinfohdader.biheight=num-line&& bitmapinfoheader.bibitcount=bits-per-pixel&& bitmapinfoheader.bicompression=compression)fread(rgbquad,size-of-rgbquad,num-color,forigin);else fclose(forigin);printf("file %s is not fit for this program!n",fn-org);get
19、ch();exit(3);else printf("file %s does not exist!n",fn-org);getch();exit(4);if( (fresult=fopen(fn-result,"wb")!=null)fwrite(&bitmapfileheader,size-of-bitmapfileheader,1,fresult);fwrite(& bitmapinfohiader,size-of-bitmapinfoheader,1,fresult);fwrite(rgbquad,size-of-rgbquad,n
20、um-color,fresult);else printf("file %s open error!n",fn-result);getch();exit(5);for(line=0;line<num-line;line+)printf("line=%dn",line);cur-offset=(unsigned long int)pixel-data-offset+(unsigned long int)byte-per-line*line;fseek (flayer,cur-offset,seek-set);fseek (forigin,cur-of
21、fset,seek-set);for(i-byte=0;i-byte<byte-per-line;i-byte+) fread(&tmp-byte1,1,1,flayer);fread(&tmp-byte2,1,1,forigin);for(i-pixel=0;i-pixel<pixel-per-byte;i-pixel+) x=i-byte*pixel-per-byte+i-pixel;if(x<width) hx=(unsigned char) (tmp-byte1<<(bits-per-pixel*i-pixel) /(unsigned ch
22、ar)0x80>>(bits-per-pixel-1);org-colorx=(unsigned char) (tmp-byte2<<(bits-per-pixel*i-pixel)/(unsigned char)0x80>>(bits-per-pixel-1);for(x=0;x<width;x+) dotx.color=0;dotx.nxt-x=no-dot;dotx.pri-x=no-dot;if(x+eye-space)<width) dotx.nxt-x=x+eye-space;if(signed)x-eye-space)>=0)dotx.pri-x=x-eye-space;for(layer=1;layer<num-color;layer+)for(x=0;x<width;x+) left-x=x-eye-space/2+(layer/2);right-x=x+eye-space/2-(layer
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政管理企業(yè)管理自考試題及答案
- 護(hù)士對(duì)臨床用藥的理解試題及答案
- 2025年經(jīng)濟(jì)法概論復(fù)習(xí)資料及試題答案
- 執(zhí)業(yè)護(hù)士備考期間自我激勵(lì)方法試題及答案
- 考試心得分享與執(zhí)業(yè)藥師試題及答案
- 2025中招考試英語專項(xiàng)訓(xùn)練-補(bǔ)全對(duì)話含答案
- 行政法學(xué)重要人物與貢獻(xiàn)試題及答案
- 聚焦中國文化的試題及答案
- 行政法律法規(guī)的熱點(diǎn)問題及試題及答案
- 2025年執(zhí)業(yè)藥師考試藥品安全性評(píng)估試題及答案
- “人工智能+”山區(qū)學(xué)校校本課程開發(fā)(麗水學(xué)院)知道智慧樹章節(jié)答案
- 中醫(yī)體重管理
- 高血壓危象課件
- 民航行業(yè)智能化民航運(yùn)輸與服務(wù)方案
- 新版加油站全員安全生產(chǎn)責(zé)任制
- 工程機(jī)械智能化安全系統(tǒng)
- 廣東省廣州三校2023-2024學(xué)年高二下學(xué)期期末考試+物理試卷(含答案)
- 獵聘-2024高校畢業(yè)生就業(yè)數(shù)據(jù)報(bào)告
- 火龍罐綜合灸技術(shù)
- 駕駛員安全駕駛培訓(xùn)課件
- 員工勞務(wù)合同書
評(píng)論
0/150
提交評(píng)論