長方體體的光照效果計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì).doc_第1頁
長方體體的光照效果計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì).doc_第2頁
長方體體的光照效果計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì).doc_第3頁
長方體體的光照效果計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì).doc_第4頁
長方體體的光照效果計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì).doc_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

西安科技大學(xué)計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)題目: 長方體體的光照效果 專業(yè)班級: 信計(jì)1102班 小組成員:陳維多1108060216 鄒世林1108060224 左 力1108060225 李 優(yōu)1108060229日期: 2013年1月2日 目錄一 課程設(shè)計(jì)題目 31.題目要求 32.任務(wù) 3二 任務(wù)分析算法介紹 3 1.任務(wù)分析 3 2.算法介紹 4三 總體設(shè)計(jì) 5 1.定義三維齊次向量結(jié)構(gòu)體 5 2.定義三維齊次坐標(biāo)結(jié)構(gòu) 53.定義面的結(jié)構(gòu) 64.定義點(diǎn)的結(jié)構(gòu) 65.長方體頂點(diǎn)定義及初始化 7 6. 面表 77.定義點(diǎn)光源、視線方向、光照方向 88.各面可見性計(jì)算和判斷 99.窗口-視區(qū)變換 1110.路徑填充 12四 流程圖 13五 源程序 14六 程序運(yùn)行效果圖 27七 總結(jié) 28參考文獻(xiàn) 29一、 課程設(shè)計(jì)題目 長方體體的光照效果1.題目要求對長方體,建立一個(gè)點(diǎn)光源,采用環(huán)境光和點(diǎn)光源漫反射光的光照模型,應(yīng)用FLAT明暗處理方法,顯示平行投影后的長方體光照效果。2.任務(wù)本題目主要包括五個(gè)任務(wù),1)長方體表面模型的建立 2)長方體的可見面判斷 3)可見面的背光性判斷4)可見面光照計(jì)算5)可見面光照效果顯示附加:通過鍵盤上下左右按鍵對圖形進(jìn)行旋轉(zhuǎn)二、 任務(wù)分析算法介紹1.任務(wù)分析任務(wù)1)中,定義三維齊次坐標(biāo)結(jié)構(gòu)和面的結(jié)構(gòu);定義頂點(diǎn)表和面表,對長方體繞X軸旋轉(zhuǎn)和繞Y軸旋轉(zhuǎn)。任務(wù)2)中對每一個(gè)面計(jì)算其外法向量及可見性任務(wù)3)中對每個(gè)可見面計(jì)算其光線向量,并判斷其是否為背光面。任務(wù)4)計(jì)算每個(gè)見光面的環(huán)境光和點(diǎn)光源的漫反射分量。任務(wù)5)用該面的光強(qiáng)顯示該可見面附加: 人機(jī)交互2.算法介紹1)旋轉(zhuǎn)變換繞X軸旋轉(zhuǎn)變換的坐標(biāo)表示繞Y軸旋轉(zhuǎn)變換的坐標(biāo)表示2) 平行投影在XOY平面投影后坐標(biāo)3) 環(huán)境光模型 物體沒有受到光源的直射,但其表面仍有一定亮度,這是由于環(huán)境光的作用。表示環(huán)境光反射強(qiáng)度表示環(huán)境光反射率表示環(huán)境光入射強(qiáng)度4)漫反射光模型漫反射光可認(rèn)為是在點(diǎn)光源的照射下,光被物體表面吸收后,然后重新反射出來的光。表示漫反射光強(qiáng)度表示漫反射反射率表示點(diǎn)光源入射強(qiáng)度大小入射光與物體表面法矢量夾角三、總體設(shè)計(jì)1.定義三維齊次向量結(jié)構(gòu)體typedef struct Vector3D float x; float y; float z; int f; /f表示所在的平面的編號VECTOR;2. 定義三維齊次坐標(biāo)結(jié)構(gòu)typedef struct tagHOMOCOORDfloat x;float y;float z;float w;HOMOCOORD;3.定義面的結(jié)構(gòu)typedef struct tagPLANEint v0, v1, v2, v3;VECTOR n; /外法向量HOMOCOORD center; /中心點(diǎn)float Id; /漫反射光強(qiáng)int flag;/標(biāo)識符float kd; /漫反射率float ka; /環(huán)境光反射率float Ie; /環(huán)境光反射光強(qiáng)float I; /光強(qiáng)PLANE;4.定義點(diǎn)的結(jié)構(gòu)typedef struct tagMYPOINTfloat x,y;MYPOINT;5.長方體頂點(diǎn)定義及初始化pts=new HOMOCOORDptn; pts0.x= 1;pts0.y= 2; pts0.z= 1; pts0.w=1;pts1.x= -1; pts1.y= 2; pts1.z= 1; pts1.w=1;pts2.x= -1; pts2.y= -2; pts2.z= 1; pts2.w=1;pts3.x= 1;pts3.y= -2; pts3.z= 1; pts3.w=1;pts4.x= 1;pts4.y= 2; pts4.z= -1; pts4.w=1;pts5.x= -1; pts5.y= 2; pts5.z= -1; pts5.w=1;pts6.x= -1; pts6.y= -2; pts6.z= -1; pts6.w=1;pts7.x= 1;pts7.y= -2; pts7.z= -1; pts7.w=1;6.面表 fn=6;faces=new PLANEfn;faces0.v0=0; faces0.v1=1; faces0.v2=2; faces0.v3=3; faces1.v0=4; faces1.v1=5; faces1.v2=1; faces1.v3=0; faces2.v0=5; faces2.v1=6; faces2.v2=2; faces2.v3=1; faces3.v0=6; faces3.v1=7; faces3.v2=3; faces3.v3=2; faces4.v0=7; faces4.v1=4; faces4.v2=0; faces4.v3=3; faces5.v0=7; faces5.v1=6; faces5.v2=5; faces5.v3=4;7.定義點(diǎn)光源、視線方向、光照方向1)點(diǎn)光源illuminant.x = -100;illuminant.y = -100;illuminant.z = 100;Ia = 0.5;/環(huán)境光入射強(qiáng)度Ip = 0.5;/漫反射入射光強(qiáng)度2)視線方向VECTOR eye_vec;eye_vec.x = 0;eye_vec.y = 0;eye_vec.z = -1;3)定義光照方向light_vec = new VECTORfn;VECTORvector62 ;for(i=0; i6; i+)vectori0 = CalculateVector(ptsfacesi.v0, pts facesi.v1, i );vectori1 = CalculateVector(ptsfacesi.v0, pts facesi.v2, i );8.各面可見性計(jì)算和判斷1)計(jì)算各個(gè)面的外法向量faces0.n = VecCross(vector00, vector01 );for(i=0; i6; i+)facesi.n = VecCross(vectori0, vectori1 );2)各個(gè)面的可見性判定float cos_angle;for(i=0; i0)facesi.flag = VISIABLE; elsefacesi.flag = UNVISIABLE;3)計(jì)算各個(gè)面的中心點(diǎn)for(i=0; ifn; i+)facesi.center.x = (ptsfacesi.v0.x+ptsfacesi.v1.x+ptsfacesi.v2.x+ptsfacesi.v3.x)/4.0f ;facesi.center.y = (ptsfacesi.v0.y+ptsfacesi.v1.y+ptsfacesi.v2.y+ptsfacesi.v3.y)/4.0f ;facesi.center.z = (ptsfacesi.v0.z+ptsfacesi.v1.z+ptsfacesi.v2.z+ptsfacesi.v3.z)/4.0f ;facesi.center.w = (ptsfacesi.v0.w+ptsfacesi.v1.w+ptsfacesi.v2.w+ptsfacesi.v3.w)/4.0f ;4)計(jì)算各個(gè)面的光照方向for(i=0; ifn; i+)light_veci = CalculateVector(illuminant, facesi.center, EOF);5)計(jì)算各個(gè)面的漫反射光強(qiáng)for(i=0; ifn; i+)facesi.Id = Ip*facesi.kd*(-1)*(InnerProduct(facesi.n, light_veci)/(GetModule(facesi.n)*GetModule(light_veci);6)計(jì)算各個(gè)面環(huán)境光反射光強(qiáng)for(i=0; ifn; i+)facesi.Ie = facesi.ka*Ia;7)計(jì)算各個(gè)面光強(qiáng)(漫反射光強(qiáng)和環(huán)境反射光強(qiáng)之和)for(i=0; ifn; i+)facesi.I = facesi.Id+facesi.Ie ;/窗口-視區(qū)變換實(shí)現(xiàn)過程float wxl=-5,wxr=5,wyb=-5,wyt=5;int vxl=0,vxr=800,vyb=0,vyt=600;9.窗口-視區(qū)變換int a = (int)(vxr-vxl)/(wxr-wxl);int b = (int)(vxl-wxl*a);int c = (int)(vyt-vyb)/(wyt-wyb);int d = (int)(vyb-wyb*c);for(i=0;iptn;i+)pts2Di.x = a*ptsi.x+b;pts2Di.y = c*ptsi.y+d;10. 路徑填充CBrush Brush;Brush.CreateSolidBrush(RGB(facesj.I*255,facesj.I*255,facesj.I*255+40);pd.SelectObject(&Brush);pd.BeginPath();pd.MoveTo(p0);for(int i=1;i4;i+)pd.LineTo(pi);pd.LineTo(p0);pd.EndPath();pd.FillPath();Brush.DeleteObject();四、流程圖五、源程序Draw3DView.h文件/定義三維齊次向量結(jié)構(gòu)體typedef struct Vector3Dfloat x;float y;float z;int f; /f表示所在的平面的編號VECTOR;/定義三維齊次坐標(biāo)結(jié)構(gòu)typedef struct tagHOMOCOORDfloat x;float y;float z;float w;HOMOCOORD;/定義面的結(jié)構(gòu)typedef struct tagPLANEint v0, v1, v2, v3;VECTOR n; /外法向量HOMOCOORD center; /中心點(diǎn)float Id; /漫反射光強(qiáng)int flag;float kd; /漫反射率float ka; /環(huán)境光反射率float Ie; /環(huán)境光反射光強(qiáng)float I; /光強(qiáng)PLANE;/定義點(diǎn)的結(jié)構(gòu),需要浮點(diǎn)數(shù)的x,ytypedef struct tagMYPOINTfloat x,y;MYPOINT;public:VECTOR CalculateVector(HOMOCOORD start, HOMOCOORD end, int face);/計(jì)算一個(gè)3維向量的函數(shù),/從start點(diǎn)指向end點(diǎn)的屬于face面的向量VECTOR VecCross(VECTOR vec1, VECTOR vec2);/計(jì)算兩個(gè)向量叉積,即外法向量float InnerProduct(VECTOR vec1, VECTOR vec2);/計(jì)算兩個(gè)向量的內(nèi)積float GetModule(VECTOR vec); /計(jì)算向量的模void RotateY(int angle); /繞y軸逆時(shí)針旋轉(zhuǎn)void RotateX(int angle); /繞x軸逆時(shí)針旋轉(zhuǎn)void DrawMy3DGraphics(); /繪制長方體virtual CDraw3DView();protected:HOMOCOORD illuminant; /定義光源坐標(biāo)float Ip; /定義光源光強(qiáng)float Ia; /環(huán)境光光強(qiáng)VECTOR *light_vec; /各個(gè)面的光照方向指針HOMOCOORD *pts; /三維頂點(diǎn)指針MYPOINT *pts2D; /自定義的二維浮點(diǎn)數(shù)結(jié)構(gòu),表示變換后的二維點(diǎn)PLANE *faces; /長方體的面指針int ptn,fn; /頂點(diǎn)個(gè)數(shù)與面的個(gè)數(shù)Draw3DView.cpp文件int x_angle = 0;int y_angle = 0;void CDraw3DView:DrawMy3DGraphics()int i;/形體定義ptn=8;pts=new HOMOCOORDptn; /設(shè)置長方體pts0.x=1;pts0.y=2;pts0.z=1; pts0.w=1;pts1.x=-1; pts1.y=2;pts1.z=1; pts1.w=1;pts2.x=-1; pts2.y=-2; pts2.z=1; pts2.w=1;pts3.x=1;pts3.y=-2; pts3.z=1; pts3.w=1;pts4.x=1;pts4.y=2;pts4.z=-1; pts4.w=1;pts5.x=-1; pts5.y=2;pts5.z=-1; pts5.w=1;pts6.x=-1; pts6.y=-2; pts6.z=-1; pts6.w=1;pts7.x=1;pts7.y=-2; pts7.z=-1; pts7.w=1;/給定義面的指針分配內(nèi)存;fn=6;faces=new PLANEfn;/設(shè)置立方體各面faces0.v0=0; faces0.v1=1; faces0.v2=2; faces0.v3=3; faces1.v0=4; faces1.v1=5; faces1.v2=1; faces1.v3=0; faces2.v0=5; faces2.v1=6; faces2.v2=2; faces2.v3=1; faces3.v0=6; faces3.v1=7; faces3.v2=3; faces3.v3=2; faces4.v0=7; faces4.v1=4; faces4.v2=0; faces4.v3=3; faces5.v0=7; faces5.v1=6; faces5.v2=5; faces5.v3=4; pts2D=new MYPOINTptn;for(i=0; ifn; i+)facesi.ka = 0.8;facesi.kd = 0.8;/定義點(diǎn)光源illuminant.x = -100;illuminant.y = -100;illuminant.z = 100;Ia = 0.5;Ip = 0.5;/定義視線方向VECTOR eye_vec;eye_vec.x = 0;eye_vec.y = 0;eye_vec.z = -1;/定義光照方向light_vec = new VECTORfn;/旋轉(zhuǎn)調(diào)用RotateX(x_angle); RotateY(y_angle);/定義并計(jì)算各個(gè)面的兩條相交的向量VECTORvector62 ;for(i=0; i6; i+)vectori0 = CalculateVector(ptsfacesi.v0, pts facesi.v1, i );vectori1 = CalculateVector(ptsfacesi.v0, pts facesi.v2, i );/計(jì)算各個(gè)面的外法向量faces0.n = VecCross(vector00, vector01 );for(i=0; i6; i+)facesi.n = VecCross(vectori0, vectori1 );/各個(gè)面的可見性判定float cos_angle;for(i=0; i0)facesi.flag = VISIABLE; elsefacesi.flag = UNVISIABLE;/計(jì)算各個(gè)面的中心點(diǎn)for(i=0; ifn; i+)facesi.center.x = (ptsfacesi.v0.x+ptsfacesi.v1.x+ptsfacesi.v2.x+ptsfacesi.v3.x)/4.0f ;facesi.center.y = (ptsfacesi.v0.y+ptsfacesi.v1.y+ptsfacesi.v2.y+ptsfacesi.v3.y)/4.0f ;facesi.center.z = (ptsfacesi.v0.z+ptsfacesi.v1.z+ptsfacesi.v2.z+ptsfacesi.v3.z)/4.0f ;facesi.center.w = (ptsfacesi.v0.w+ptsfacesi.v1.w+ptsfacesi.v2.w+ptsfacesi.v3.w)/4.0f ;/計(jì)算各個(gè)面的光照方向for(i=0; ifn; i+)light_veci = CalculateVector(illuminant, facesi.center, EOF);/計(jì)算各個(gè)面的漫反射光強(qiáng)for(i=0; ifn; i+)facesi.Id = Ip*facesi.kd*(-1)*(InnerProduct(facesi.n, light_veci)/(GetModule(facesi.n)*GetModule(light_veci);/計(jì)算各個(gè)面環(huán)境光反射光強(qiáng)for(i=0; ifn; i+)facesi.Ie = facesi.ka*Ia;/計(jì)算各個(gè)面光強(qiáng)for(i=0; ifn; i+)facesi.I = facesi.Id+facesi.Ie ;/平行投影變換for(i=0;iptn;i+)ptsi.x=ptsi.x;ptsi.y=ptsi.y;/ 窗口-視區(qū)變換int a = (int)(vxr-vxl)/(wxr-wxl);int b = (int)(vxl-wxl*a);int c = (int)(vyt-vyb)/(wyt-wyb);int d = (int)(vyb-wyb*c);for(i=0;iptn;i+)pts2Di.x = a*ptsi.x+b;pts2Di.y = c*ptsi.y+d;/圖形顯示CClientDC pd(this);CPoint p4;for(int j=0; j6; j+)if(facesj.flag=VISIABLE)p0=CPoint(pts2Dfacesj.v0.x,pts2Dfacesj.v0.y);p1=CPoint(pts2Dfacesj.v1.x,pts2Dfacesj.v1.y);p2=CPoint(pts2Dfacesj.v2.x,pts2Dfacesj.v2.y);p3=CPoint(pts2Dfacesj.v3.x,pts2Dfacesj.v3.y);/dc.SelectObject(pOld); /把畫筆設(shè)置為原來的CBrush Brush;/(DKGRAY_BRUSH,RGB(64,64,64);Brush.CreateSolidBrush(RGB(facesj.I*255,facesj.I*255,facesj.I*255+40);pd.SelectObject(&Brush);pd.BeginPath();pd.MoveTo(p0);for(int i=1;i4;i+)pd.LineTo(pi);pd.LineTo(p0);pd.EndPath();pd.FillPath();Brush.DeleteObject();void CDraw3DView:RotateX(int angle) /繞x軸逆時(shí)針旋轉(zhuǎn)float a=angle*PI/180;for(int i=0;iptn;i+)float y,z;y=ptsi.y; z=ptsi.z;ptsi.y=y*cos(a)-z*sin(a);ptsi.z=y*sin(a)+z*cos(a);void CDraw3DView:RotateY(int angle) /繞y軸逆時(shí)針旋轉(zhuǎn)float b=angle*PI/180;for(int i=0;iptn;i+)float x,z;x=ptsi.x; z=ptsi.z;ptsi.x=x*cos(b)+z*sin(b);ptsi.z=-x*sin(b)+z*cos(b);VECTOR CDraw3DView:CalculateVector(HOMOCOORD start, HOMOCOORD end, int face)/計(jì)算一個(gè)3維向量的函數(shù),從start點(diǎn)指向end點(diǎn)的屬于face面的向量 VECTOR tempVector;tempVector.x = end.x-start.x;tempVector.y = end.y-start.y;tempVector.z = end.z-start.z;tempVector.f = face;return tempVector;VECTOR CDraw3DView:VecCross(VECTOR vec1, VECTOR vec2)/計(jì)算兩個(gè)向量叉積,即外法向量VECTOR tempNVector;tempNVector.x = (1)*(vec1.y*vec2.z - vec2.y*vec1.z);tempNVector.y = (-1)*(vec1.x*vec2.z-vec2.x*vec1.z);tempNVector.z = (1)*(vec1.x*vec2.y - vec2.x*vec1.y);return tempNVector;float CDraw3DView:InnerProduct(VECTOR vec1, VECTOR vec2)/計(jì)算兩個(gè)向量的內(nèi)積return (vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z);float CDraw3DView:GetModule(VECTOR vec)/計(jì)算向量的模retur

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論