版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)課程設(shè)計(jì)球體Phong光照模型亠、實(shí)驗(yàn)?zāi)康模?)掌握雙線性法矢插值模型;掌握ZBuffer算法的思想;掌握有效邊表填充算法;二、 實(shí)驗(yàn)要求1、建立三維坐標(biāo)系Oxyz,原點(diǎn)位于屏幕客戶區(qū)中心,x軸水平向右為正,y軸垂直向上為正,z軸垂直于屏幕指向觀察者。2、繪制體心和坐標(biāo)系中心重合的球體表面,使用Z-Buffer消隱算法進(jìn)行消隱。3、 使用單點(diǎn)光源對(duì)球體進(jìn)行照射生成Phong光照模型,光源位置位于球體右上方。4、 背景色設(shè)置為RGB(128,0,0)。5、 使用鍵盤方向鍵旋轉(zhuǎn)球體。6使用鼠標(biāo)左擊縮小球體、右擊增大球體。三、 實(shí)驗(yàn)步驟建立球體的網(wǎng)格模型,使用地理劃分法將球體北極和南極劃分為三角形面片, 其余部分劃分為四邊形面片,先對(duì)球體網(wǎng)格模型進(jìn)行背面剔除,然后使用深度緩沖算法進(jìn)行消隱。計(jì)算面片各頂點(diǎn)的平均法矢量,然后采用雙線性法失插值計(jì)算面片內(nèi)各點(diǎn)的法矢量。最終根據(jù)每點(diǎn)的法矢量對(duì)光源的朝向, 通過簡單光照模型計(jì)算所獲得的光強(qiáng)。面片使用有效邊表算法填1、Phong雙線性法矢插值模型Gouraud雙線性光強(qiáng)插值模型解決了相鄰多邊形之間的顏色突變問題,產(chǎn)生的真實(shí)感圖形顏色過渡均勻,圖形顯得非常光滑,這是它的優(yōu)點(diǎn),但是,由于采用光強(qiáng)插值,其鏡面反射光效果不太理想,而且相鄰多邊形邊界處的馬赫帶效應(yīng)并不能完全消除。Phong模型提出的雙線性法矢插值模型可以有效的解決上述問題,產(chǎn)生正確的高光區(qū)域。Phong模型在進(jìn)行光強(qiáng)插值的時(shí)候,需要先對(duì)面片的每一個(gè)頂點(diǎn)計(jì)算平均法矢量,然后通過雙線性法矢插值計(jì)算面片內(nèi)每個(gè)點(diǎn)的法矢量, 最后根據(jù)簡單光照模型計(jì)算面片上各點(diǎn)的顏色值。基本算法如下。計(jì)算面片頂點(diǎn)的平均法矢量。i=1n由于球心位于三維坐標(biāo)系原點(diǎn),所以球面上任意面片的頂點(diǎn)平均法矢量就是該點(diǎn)
的位置矢量。計(jì)算面片內(nèi)部各點(diǎn)的法矢量。在圖中,三角形面片的頂點(diǎn)坐標(biāo)為Po(xo,yo),法矢量為No;R(xi,yj,法矢量是Ni;B(X2,y2),法矢量為N2。任一掃面線于三角形邊PoR的交點(diǎn)為A(Xa,ya),法矢量為Na;與邊PoB的交點(diǎn)為B(Xb,yb),法矢量為Nb;F(Xf,yf)為AB內(nèi)的任意一點(diǎn),法矢量為Nf。Phong雙線性法矢插值模型是依據(jù)三角形面片頂點(diǎn)R、R、P2的法矢量進(jìn)行雙線性值插值計(jì)算三角形內(nèi)點(diǎn)F的法矢量。邊P0P邊上任意一點(diǎn)A點(diǎn)的法矢量Na可以由R點(diǎn)的法矢量No和R點(diǎn)的法矢量Ni可以通過拉格朗日線性插值法得到:ya—yya—yiy?!獃i上 yoNiyi—y。邊PoP2邊上B點(diǎn)的法矢量Nb可以由Po點(diǎn)的法矢量No和P2點(diǎn)的法矢量N2通過拉格朗日線性插值法得到:Nbyb一丫Nbyb一丫2yo—y2yb-y。y2一yoN2掃描線AB上F點(diǎn)的法矢量Nf可以由A點(diǎn)的法矢量Na和B點(diǎn)的法矢量Nb通過拉格朗日線性插值法得到:NfXf_XbXa嘰NfXf_XbXa嘰Xf_XaNa--Xb_XaNb2、修改CAET類獲得該點(diǎn)顏色在CAET類內(nèi)不僅包含邊的起點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo),同時(shí)增加起點(diǎn)和終點(diǎn)的法矢量3、修改CZBuffer類在CZBuffer類先對(duì)面片每個(gè)點(diǎn)的法矢量進(jìn)行雙線性插值獲得面片內(nèi)每一點(diǎn)的法矢量,然后再調(diào)用簡單光照模型計(jì)算面片內(nèi)每點(diǎn)的光強(qiáng)4、光照環(huán)境初始化在CTestView類的構(gòu)造函數(shù)內(nèi)設(shè)置光源個(gè)數(shù)為1,位于右上方,材質(zhì)顏色為紅色。5、繪制球面函數(shù)使用Phong雙線性法矢量插值模型時(shí),需要計(jì)算每個(gè)面片上的矢法量。定義了Normal3數(shù)組存儲(chǔ)三角形面片的頂點(diǎn)法矢量,定義了 Normal4數(shù)組存儲(chǔ)四邊形面片的頂點(diǎn)法矢量。四、程序核心代碼及思路1、程序設(shè)計(jì)中的主要思路及所使用的主要類在程序設(shè)計(jì)中,使用Phong雙線性法矢量插值模型時(shí),計(jì)算每個(gè)面片的頂點(diǎn)坐標(biāo),同時(shí)計(jì)算每個(gè)面片的頂點(diǎn)法矢量。在 CZBuffer類內(nèi)定義了雙線性法矢量插值函數(shù)Interpolation() 計(jì)算面片內(nèi)的每個(gè)點(diǎn)的法矢量。根據(jù)面片內(nèi)每一點(diǎn)的法矢量調(diào)用CLighting類的成員函數(shù)Lighing()計(jì)算該點(diǎn)的光強(qiáng)。并在MyView構(gòu)造函數(shù)中調(diào)用了透視變化初始化函數(shù)InitParameter(); 構(gòu)造頂點(diǎn)表函數(shù)ReadPoint();構(gòu)造面表函數(shù)ReadFace();在OnDraw()函數(shù)中使用雙緩沖函數(shù) ,并使用繪制球面函數(shù)DrawObject()函數(shù),畫出球體模型。設(shè)計(jì)使用的類如下:顏色類:CRGB成員函數(shù):Normalize()將顏色分量red、green、blue規(guī)范化到[0,1]閉區(qū)間內(nèi)。定義矢量類:CVector成員函數(shù):doubleMold() 求矢量的模CVectorUnit() 單位矢量功能:在類中重載+、-、*、\等運(yùn)算符,并利用Dot()計(jì)算矢量點(diǎn)積。定義邊節(jié)點(diǎn)類:CAET和定義桶節(jié)點(diǎn)類:CBucket設(shè)置當(dāng)前掃描線與有效邊的交點(diǎn)的橫坐標(biāo) x定義掃描線ScanLine來求圖形與有效邊表的交點(diǎn)設(shè)計(jì)光源類:CLightvoidSetDiffuse(CRGB); 設(shè)置光源的漫反射光voidSetSpecular(CRGB); 設(shè)置光源的鏡面反射光voidSetPosition(double,double,double); 設(shè)置光源的直角坐標(biāo)系voidSetGlobal(double,double,double); 設(shè)置光源的球坐標(biāo)voidSetCoef(double,double,double); 設(shè)置光強(qiáng)的衰減系數(shù)voidSetOnOff(bool); 設(shè)置光源開關(guān)狀態(tài)voidGlobalToXYZ(); 球坐標(biāo)轉(zhuǎn)換為直角坐標(biāo)設(shè)計(jì)材質(zhì)類:CMaterialvoidSetAmbient(CRGB); 設(shè)置材質(zhì)對(duì)環(huán)境光的反射率voidSetDiffuse(CRGB); 設(shè)置材質(zhì)對(duì)漫反射光的反射率voidSetSpecular(CRGB); 設(shè)置材質(zhì)對(duì)鏡面反射光的反射率voidSetEmit(CRGB); 設(shè)置材質(zhì)自身輻射的顏色voidSetExp(double); 設(shè)置材質(zhì)的高光指數(shù)、設(shè)置光照類:CLighting功能: 在類中定義了光照函數(shù)Lighting (),計(jì)算物體表面網(wǎng)格頂點(diǎn)所獲得的光照函數(shù)。在該函數(shù)中分五步來實(shí)現(xiàn)網(wǎng)格頂點(diǎn)的光亮度,第一,累加漫反射光的顏色;第二,累加鏡面反射光的顏色;第三,進(jìn)行光強(qiáng)衰減;第四,加入環(huán)境光;第五,返回所計(jì)算頂點(diǎn)的光強(qiáng)顏色。、定義CZBuffer類:voidCreateBucket(); 在函數(shù)中使用CBucket類創(chuàng)建桶節(jié)點(diǎn)voidCreateEdge(); 在函數(shù)中使用CAET類創(chuàng)建邊表voidPhong(CDC*pDC,CPi3ViewPoint,CLighting*pLight,CMaterial*pMaterial);Phong 填充函數(shù)voidInitDeepBuffer(int,int,double); 初始化深度緩存CVectorInterpolation(double,double,double,CVector,CVector);法矢量線性插值程序中使用的重要函數(shù)及部分代碼:、構(gòu)造球體頂點(diǎn)表函數(shù)ReadPoint ()在函數(shù)中定義了片面夾角為gafa=gbeta=10;緯度區(qū)域?yàn)镹1=180/gafa=18,經(jīng)度區(qū)域N2=360/gbeta=36;利用數(shù)組P[(N1-1)*N2+2]設(shè)置的球體共有616個(gè)頂點(diǎn),經(jīng)緯網(wǎng)格的夾角為10°。利用:P[0].x=0,P[0].y=r,P[0].z=0; 計(jì)算北極點(diǎn)坐標(biāo)利用如下代碼計(jì)算球體上的點(diǎn)坐標(biāo):for(inti=0;i<N1-1;i++){gafa1=(i+1)*gafa*3.14/180;for(intj=0;j<N2;j++){gbeta1=j*gbeta*3.14/180;P[i*N2+j+1].x=r*sin(gafa1)*sin(gbeta1);P[i*N2+j+1].y=r*cos(gafa1);P[i*N2+j+1].z=r*sin(gafa1)*cos(gbeta1);}}利用:P[(N1-1)*N2+1].x=0,P[(N1-1)*N2+1].y=-r,P[(N1-1)*N2+1].z=0;計(jì)算南極點(diǎn)坐標(biāo)、構(gòu)造面片表函數(shù)ReadFace()面片用二維數(shù)組表示,第一維按維度自北極向南極增加的方向定義,第二維在同一緯度帶上z軸正向開始,按逆時(shí)針方向定義。球體共有 N1*N2個(gè)面,北極和南極各有N2個(gè)面,其余部分有 (N1-2)*N2個(gè)面片。具體實(shí)現(xiàn)代碼和算法見源程序。構(gòu)造北極三角形面片代碼:for(intj=0;j<N2;j++){inttempj=j+1;if(tempj==N2)tempj=0;intNorthIndex[3];NorthIndex[0]=0;NorthIndex[1]=j+1;NorthIndex[2]=tempj+1;F[0][j].SetEN(3);for(intk=0;k<F[0][j].En;k++){F[0][j].p[k]=NorthIndex[k];}F[0][j].SetNormal(P[Northlndex[0]],P[Northlndex[1]],P[Northlndex[2]]);}構(gòu)造球體四邊形面片代碼:for(inti=1;i<N1-1;i++){for(intj=0;j<N2;j++){inttempi=i+1;inttempj=j+1;if(tempj==N2)tempj=0;intBodyIndex[4];BodyIndex[0]=(i-1)*N2+j+1;BodyIndex[1]=(tempi-1)*N2+j+1;BodyIndex[2]=(tempi-1)*N2+tempj+1;BodyIndex[3]=(i-1)*N2+tempj+1;F[i][j].SetEN(4);for(intk=0;k<F[i][j].En;k++){F[i][j].p[k]=BodyIndex[k];}F[i][j].SetNormal(P[Bodylndex[0]],P[Bodylndex[1]],P[Bodylndex[2]]);}}、繪制球體函數(shù)DrawObject(CDC*pDC使用Z-Buffer算法對(duì)球面進(jìn)行深度消隱,然后使用有效邊表算法進(jìn)行填充,為減少渲染的面片數(shù),先使用凸多面體消隱算法對(duì)球體不可見面片進(jìn)行剔除。然后使用Z-Buffer算法對(duì)可見面進(jìn)行消隱,最后使用有效邊表算法進(jìn)行填充。在函數(shù)中,使用Phong雙線性法矢量插值模型,計(jì)算每個(gè)面片上的矢法量。定義了Normal3數(shù)組存儲(chǔ)三角形面片的頂點(diǎn)法矢量,定義了 Normal4數(shù)組存儲(chǔ)四邊形面片的頂點(diǎn)法矢量。、使用鍵盤方向鍵OnKeyDown(UINTiChar,UINTnRepCnt,UINTnFlags)消息響應(yīng)窗口函數(shù),代碼如下:if(!Play){switch(nChar){caseVK_UP: 使用Phi每次自減5,按向上鍵使球體向里旋轉(zhuǎn)Phi=Phi-5;break;caseVK_DOWN:使用Phi每次自加5,按向下鍵使球體向外旋轉(zhuǎn)Phi=Phi+5;break;caseVK_LEFT: 使用Theta每次自加5,按向左鍵使球體向左旋轉(zhuǎn)Theta=Theta+5;break;caseVK_RIGHT:使用Theta每次自減5,按向左鍵使球體向右旋轉(zhuǎn)Theta=Theta-5;break;default:break;}InitParameter();DoubleBuf();}、使用鼠標(biāo)左右點(diǎn)擊窗口響應(yīng)函數(shù),對(duì)球體進(jìn)行放大和縮小voidCMyView::OnLButtonDblClk(UINTnFlags,CPointpoint){R=R+30;在鼠標(biāo)左擊函數(shù)中視點(diǎn)半徑每次增加 30,使球體縮小DoubleBuf();CView::OnLButtonDblClk(nFlags,point);}voidCMyView::OnRButtonDblClk(UINTnFlags,CPointpoint){R=R-30;在鼠標(biāo)右擊函數(shù)中視點(diǎn)半徑每次減少 30,使球體增大DoubleBuf();CView::OnRButtonDblClk(nFlags,point);}五、程序運(yùn)行結(jié)果(1)當(dāng)球體半徑r=150,面片夾角=10,緯度區(qū)間N1=18,經(jīng)度區(qū)間N2=36時(shí),球體共有(N1-1)*N2+2=616個(gè)頂點(diǎn),其運(yùn)行結(jié)果如圖:
S計(jì)m憶刑學(xué)幕設(shè)計(jì):球拡Phong複型宮息與計(jì)腳學(xué)100點(diǎn)王問前(2)使用鍵盤方向向左旋轉(zhuǎn)球體, Theta=Theta+10所示結(jié)果如圖:
使用鼠標(biāo)右擊函數(shù),OnRButtonDblClk(UINTnFlags,CPointpoint) 使球體增大當(dāng)R=R-30時(shí)運(yùn)行結(jié)果如圖:"酸計(jì)算或圖形學(xué)渓程設(shè)計(jì):球
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人房屋抵押民間借貸借款協(xié)議文本3篇
- 2025年度平板車租賃運(yùn)輸合同風(fēng)險(xiǎn)評(píng)估與控制
- 個(gè)人租房合同標(biāo)準(zhǔn)版可打印
- 二零二五年度處理男子外遇妻子懷孕離婚撫養(yǎng)權(quán)糾紛調(diào)解合同
- 二零二五年度智慧家居項(xiàng)目報(bào)建代理與智能家居合同2篇
- 2025年度鐵礦石進(jìn)出口關(guān)稅及稅費(fèi)繳納合同規(guī)范
- 二零二五版礦產(chǎn)資源租賃居間代理合同3篇
- 二零二五年度企事業(yè)單位廉潔從業(yè)監(jiān)督員聘任合同
- 2025阿里巴巴智能物流機(jī)器人研發(fā)及銷售合同3篇
- 重慶文化藝術(shù)職業(yè)學(xué)院《應(yīng)用文寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 《大學(xué)生職業(yè)發(fā)展與就業(yè)指導(dǎo)》課程標(biāo)準(zhǔn)
- 第23課《出師表》課件(共56張)
- GB/T 3953-2024電工圓銅線
- 發(fā)電機(jī)停電故障應(yīng)急預(yù)案
- 接電的施工方案
- 常用藥物作用及副作用課件
- 幼兒阿拉伯?dāng)?shù)字描紅(0-100)打印版
- 社會(huì)組織等級(jí)評(píng)估報(bào)告模板
- GB/T 12173-2008礦用一般型電氣設(shè)備
- 新媒體研究方法教學(xué)ppt課件(完整版)
- 2020新版?zhèn)€人征信報(bào)告模板
評(píng)論
0/150
提交評(píng)論