球體Phong光照模型課程設計報告_第1頁
球體Phong光照模型課程設計報告_第2頁
球體Phong光照模型課程設計報告_第3頁
球體Phong光照模型課程設計報告_第4頁
球體Phong光照模型課程設計報告_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

課程設計球體Phong光照模型(1)掌握雙線性法矢插值模型;(2)掌握ZBuffer算法的思想;(3)掌握有效邊表填充算法;2、繪制體心和坐標系中心重合的球體表面,使用Z-Buffer消隱算法進行消隱。3、使用單點光源對球體進行照射生成Phong光照模型,光源其余部分劃分為四邊形面片,先對球體網(wǎng)格模型進行背面剔除,然后使用深度緩沖算法進行消隱。計算面片各頂點的平均法矢量,然后采用雙線性法失插值計算面片內(nèi)各點的法矢量。最終根據(jù)每點的法矢量對光源的朝向,通過簡單光照模型計算所獲得的光強。面片使用有效邊表算法填Gouraud雙線性光強插值模型解決了相鄰多邊形之間的顏色突變問題,產(chǎn)生的真實感圖形顏色過渡均勻,圖形顯得非常光滑,這是它的強插值,其鏡面反射光效果不太理想,而且相鄰多邊形邊界處的馬赫帶效應并不能完全消除。Phong模型提出的雙線性法矢插值模型可以有效的解決確的高光區(qū)域。Phong模型在進行光強插值的時候,需要先對面片的每一個頂點計算平均法矢量,然后通過雙線性法矢插值計算面片內(nèi)每個點的法矢量,最后根據(jù)簡單(1)計算面片頂點的平均法矢量。在CZBuffer類先對面片每個點的法矢量進行雙線性插值獲得面片內(nèi)每一點的法在CTestView類的構造函數(shù)內(nèi)設置光源個數(shù)為1,位于右上方,材質(zhì)顏色為紅色。5、繪制球面函數(shù)Normal3數(shù)組存儲三角形面片的頂點法矢量,定義了Normal4數(shù)組存儲四邊形面片的在程序設計中,使用Phong雙線性法矢量插值模型時,計算每個面片的頂點坐標,同時計算每個面片的頂點法矢量。在CZBuffer類內(nèi)定義了雙線性法矢量插值函數(shù)Interpolation()計算面片內(nèi)的每個點的法矢量。根據(jù)面片內(nèi)每一點的法矢量調(diào)用CLighting類的成員函數(shù)Lighing()計算該點的光強。并在MyView構造函數(shù)中調(diào)用了透視變化初始化函數(shù)InitParameter();構造頂點表函數(shù)ReadPoint();構造面表函數(shù)ReadFace();在OnDraw()函數(shù)中使用雙緩沖函數(shù),并使用繪制球面函數(shù)DrawObject()函數(shù),畫出球體模型。設計使用的類如下:成員函數(shù):Normalize()將顏色分量red、green、blue規(guī)范化到[0,(3)定義邊節(jié)點類:CAET和定義桶節(jié)點類:CBucket設置當前掃描線與有效邊的交點的橫坐標x定義掃描線ScanLine來求圖形與有效邊表的交點voidSetSpecular(CRGB);設置光源的鏡面反射光voidSetPosition(double,double,double);設置光源的直角坐標系voidSetGlobal(double,double,double);設置光源的球坐標voidSetCoef(double,double,double);設置光強的衰減voidGlobalToXYZ();球坐得的光照函數(shù)。在該函數(shù)中分五步來實現(xiàn)網(wǎng)格頂點的光亮度,第一,累加漫反射光voidCreateBucket();在函數(shù)中使用CBucket類創(chuàng)建桶節(jié)點voidPhong(CDC*pDC,CPi3ViewPointvoidInitDeepBuffer(int,int,double);初始化深度緩存(2)程序中使用的重要函數(shù)及部分代碼:在函數(shù)中定義了片面夾角為gafa=gbeta=10;緯度區(qū)域為N1=180/gafa=18,經(jīng)度區(qū)域N2=360/gbeta=36;利用數(shù)組P[(N1-1)*N2+2]設置的球體共有616個頂點,經(jīng)緯網(wǎng)格的夾角為10°。P[i*N2+j+1].x=r*sin(gafal)*sP[i*N2+j+1].z=r*sin(gafal)*c}計算南極點坐標(2)、構造面片表函數(shù)ReadFace()面片用二維數(shù)組表示,第一維按維度自北極向南極增加的方向定義,第二維在同一緯度帶上z軸正向開始,按逆時針方向定義。球體共有N1*N2個面,北極和南極各有N2個面,其余部分有(N1-2)*N2個面片。具體實現(xiàn)代碼和算法見源程序。構造北極三角形面片代碼:for(intj=0;j<N2;j++){NorthIndex[0]=0;Northlndex[1]=j+1;NorthIndex[2]=tempj+1;for(intk=0;k<F[0][j].En;k++){F[0][j].p[k]=NorthIF[0][j].SetNormal(P[NorthIndex[0]],P[NorthIndex[1]],P[Nort構造球體四邊形面片代碼:{for(intj=0;j<N2;j++){BodyIndex[1]=(tempi-BodyIndex[2]=(tempi-1)*NBodyIndex[3]=(i-1)*Nfor(intk=0;k<F[i][j].En;k+{}F[i][j].SetNormal(P[BodyIndex[0]],P[BodyIndex[1]],P[BodyIn使用Z-Buffer算法對球面進行深度消隱,然后使用有效邊表算法進行填充,為減少渲染的面片數(shù),先使用凸多面體消隱算法對球體不可見面片進行剔除。然后使用Z-Buffer算法對可見面進行消隱,最后使用有效邊表算法進行填充。在函數(shù)中,使用Phong雙線性法矢量插值模型,計算每個面片上的矢法量。定義了Normal3數(shù)組存儲三角形面片的頂點法矢量,定義了Norma14數(shù)組存儲四邊形面片的頂點法矢量。(4)、使用鍵盤方向鍵OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)消息響應窗口函數(shù),代碼如下:caseVKUP:使用Phi每次自減5,按向上鍵使球體向里旋轉(zhuǎn)caseVK_DOWN:使用Phi每次自加5,按向下鍵使球體向外旋轉(zhuǎn)每次自加5,按向左鍵使球體向左旋轉(zhuǎn)caseVK_RIGHT:使用Theta每次自減5,按向左鍵使球體向右旋轉(zhuǎn)Theta=Theta-5;bdefault:break;}(5)、使用鼠標左右點擊窗口響應函數(shù),對球體進行放大和縮小voidCMyView::OnLButtonDblClk(UINTnFlags,CPointpoint){R=R+30;在鼠標左擊函數(shù)中視點半徑每次增加30,使球體縮小CView::OnLButtonDb1CvoidCMyView::OnRButtonDb1Clk(UINTnFlags,CPointpoint){R=R-30;在鼠標右擊函數(shù)中視點半徑每次減少30,使球體增大CView::OnRButtonDblC(1)當球體半徑r=150,面片夾角=10,緯度區(qū)間N1=18,經(jīng)度區(qū)間N2=36時,回回(2)使用鍵盤方向向左旋轉(zhuǎn)球體,Theta=Theta+10所示結果如圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論