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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論