MFC圖形學(xué)課程設(shè)計--彩色線框球_第1頁
MFC圖形學(xué)課程設(shè)計--彩色線框球_第2頁
MFC圖形學(xué)課程設(shè)計--彩色線框球_第3頁
MFC圖形學(xué)課程設(shè)計--彩色線框球_第4頁
MFC圖形學(xué)課程設(shè)計--彩色線框球_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機(jī)圖形學(xué)課程設(shè)計彩色線框球目錄1.項目描述21.1 任務(wù)綜述21.2 效果圖22.原理分析33.算法設(shè)計53.1 球表面坐標(biāo)計算53.2 保存球表面面片以及面片屬性54.源代碼清單65.項目總結(jié)115.1 存在問題115.2 項目改進(jìn)115.3 總結(jié)111、項目描述1.1 項目綜述真實感圖形繪制是計算機(jī)圖形學(xué)的一個重要組成部分。它綜合利用數(shù)學(xué)、物理學(xué)、計算機(jī)科學(xué)和其他學(xué)科知識在計算機(jī)圖像設(shè)備上生成像彩色照片那樣的真實感圖形。要用計算機(jī)圖形設(shè)備繪制場景的真實感圖形,就必須首先在計算機(jī)中建立該場景的模型,用這個模型來反映場景的特點和屬性。有了三維場景的模型,并給定了觀察點和觀察方向以后,就可以

2、通過幾何變換和投影變換在屏幕上顯示該三維場景的二維圖像。為了使二維圖像具有立體感,并盡可能逼真地顯示出該物體在現(xiàn)實世界中被觀察到的形象,就需要運用適當(dāng)?shù)墓庹漳P?,來模擬場景在現(xiàn)實世界中受到的各種光源照射時的效果,這就是真實感圖形的畫面繪制技術(shù),也就是真實感圖形的生成技術(shù)。1.2 效果圖2、原理分析用計算機(jī)在圖形設(shè)備上生成連續(xù)色調(diào)的真實感圖形大致可以分為以下四步:第一步,用數(shù)學(xué)方法建立所需三維場景的幾何描述,并將它們輸入至計算機(jī)。第二步,講三維幾何描述轉(zhuǎn)換為二維投影圖。這可以通過對場景的投影變換來完成。第三步,確定場景中的所有可見面,這需要使用消隱算法將被其他物體遮擋的不可見部分消去。第四步,計

3、算場景中可見面的顏色,嚴(yán)格地說,就是根據(jù)基于光學(xué)物理的光照明模型計算可見面投射到觀察者眼中的光亮度大小和色彩分量,并將它轉(zhuǎn)換成適合圖形設(shè)備的顏色值,從而確定投影畫面上每一像素的顏色,最終生成圖形。球體表面的函數(shù)方程式如下:其中,坐標(biāo)(x0,y0,z0)為球心坐標(biāo),而坐標(biāo)(x,y,z)為球面上的參數(shù)點坐標(biāo),r 為半徑,u、w 分別為經(jīng)度和緯度參數(shù)變量。光照效果:為了模擬光源照射在景物表面所產(chǎn)生的光照效果,就需要用到光照模型,光照模型是生成真實感圖形的基礎(chǔ)。光照模型是根據(jù)光學(xué)物理的有關(guān)定律,計算景物表面上任一點投向觀察者眼中的光亮度的大小和色彩組成的公式。從光源發(fā)出的光照射到景物表面時,會出現(xiàn)以下

4、四種情形:(1)經(jīng)景物表面向外反射形成反射光;(2)若景物透明,則入射光會穿透該景物,從而產(chǎn)生透射光; (3)若景物透明,入射光在穿透景物時會產(chǎn)生散射光;(4)部分入射光將被景物吸收而轉(zhuǎn)換成熱。物體表面的反射光和透射光的光譜分布決定了景物表面呈現(xiàn)的 顏色,反射光和透射光的強(qiáng)弱則決定了景物表面的明暗程度。顯然, 反射光和透射光決定于入射光的強(qiáng)弱、光譜組成以及景物表面對入 射光中不同波長光的吸收程度。例如,當(dāng)一束白光照射在一個吸收 除紅光以外所有不同波長光的不透明景物表面上時,景物呈紅色。 但若用一束綠光或藍(lán)光照射該景物,則它將呈黑色。物體表面的反射光可分為漫反射光和鏡面反射光。漫反射光可以認(rèn)為是

5、光穿過物體表面層被部分吸收后,重新發(fā)射出來的光。因此,漫反射光均勻地散布在各個方向,觀察者不論站在哪一方位上,他所觀察到的漫反射光的強(qiáng)度均相等。3、算法設(shè)計3.1 球表面坐標(biāo)計算獲得球體的中心坐標(biāo)(x,y,z)和半徑 r 后,然后設(shè)置經(jīng)緯線步長,步長的大小決定了將球體分割成面片的數(shù)量,即決定了繪制后球體的表面光滑度。根據(jù)公式得知, 利用 u 和 w 進(jìn)行循環(huán),然后用一個數(shù)組可以保存這個球體表面的每一個坐標(biāo),即此公式中的 x,y,z。這個方法定義為 CreateBoll()。3.2 保存球表面面片以及面片屬性為了繪制球體,我們這里選擇三角面片剖分進(jìn)行繪制。在這里我們要設(shè)置每一個面片的三個頂點的坐

6、標(biāo)、面片的法向量、面片的光反射屬性。對球體表面進(jìn)行三角剖分可以采用如下方法:設(shè)球體表面上一個參數(shù)點為 Pij,則其經(jīng)度上的下一個參數(shù)點為 Pi+1 j,而緯度上的下一個參數(shù)點為 Pij+1,再加上該點在對角線方向上的下一個參數(shù)點 Pi+1j+1,這四個點構(gòu)成的區(qū)域可以剖分成兩個三角面片。第一個三角面片的頂點為 Pij,Pi+1j, Pi+1j+1,第二個三角面片的頂點為 Pij,Pij+1,Pi+1 j+1。三角面片的法向量可以通過三個頂點確定的兩個向量的叉積進(jìn)行計算。確定了每一個三角面片的屬性后,為了在后面的程序中調(diào)用面片繪制,在這里我們利用 CPtrArray 類來動態(tài)保存面片。4、源代碼

7、清單CTestView:CTestView() / TODO: add construction code here x = 0; y = 0; z = 0; r = 200; rd = 255; gd = 0; bd = 0; ViewPoint = CP3(0,0,-6);CTestView:CTestView()BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs) / TODO: Modify the Window class or styles here by modifying /the CREATESTRUCT cs return CVi

8、ew:PreCreateWindow(cs);void CTestView:OnMdraw() / TODO: Add your command handler code here rd = 255; gd = 0; bd = 0; CreateBoll(); DoubleBuffer(); m_FaceArr.RemoveAll();/計算球表面坐標(biāo)void CTestView:CreateBoll() int i = 0,j; double step = 5; double angle = step * PI/180; cx = ROUND(180/step) + 1; cy = ROUN

9、D(360/step); for (double u = -PI/2; u PI/2 + angle ; u = u + angle) j = 0; for (double v = 0; v P2.x - F-P1.x; yu = F-P2.y - F-P1.y; zu = F-P2.z - F-P1.z; xv = F-P3.x - F-P1.x; yv = F-P3.y - F-P1.y; zv = F-P3.z - F-P1.z;(zu * xv - zv * xu) * (zu * xv - zv * xu) + d = sqrt(yu * zv - yv * zu) * (yu *

10、zv - yv * zu) +(xu * yv - xv * yu) * (xu * yv - xv * yu); F-fv.x = (yu * zv - yv * zu)/d; F-fv.y = (zu * xv - zv * xu)/d; F-fv.z = (xu * yv - xv * yu)/d;/設(shè)置球表面屬性void CTestView:SetFace() for (int i = 0; i cx - 1; i+) for (int j = 0; j SetViewportExt(rect.Width(),-rect.Height();/xy 軸垂直向上原點CDC MemDC;/內(nèi)

11、存DCCBitmap NewBitmap,*pOldBitmap;/內(nèi)存中承載圖像的臨時位圖MemDC.CreateCompatibleDC(pDC);/建立與屏幕pDC兼容的 pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);/屏幕中心為MemDC NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Heigh t();/創(chuàng)建兼容位圖 pOldBitmap=MemDC.SelectObject(&NewBitmap);/將兼容位圖選入 MemDC MemDC.FillSolidRec

12、t(rect,pDC-GetBkColor();/按原來背景填充客戶區(qū),否則是黑色MemDC.SetMapMode(MM_ANISOTROPIC);/MemDC 自定義坐標(biāo)系 MemDC.SetWindowExt(rect.Width(),rect.Height(); MemDC.SetViewportExt(rect.Width(),-rect.Height(); MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2); DrawObject(&MemDC); pDC-BitBlt(-rect.Width()/2,-rect.Height()

13、/2,rect.Width(),rect.Height(),&MemDC,-rect.Width()/2,- rect.Height()/2,SRCCOPY);/將內(nèi)存位圖拷貝到屏幕 MemDC.SelectObject(pOldBitmap);/恢復(fù)位圖ReleaseDC(pDC);/釋放/返回兩個向量的夾角的余弦double CTestView:GetVectorAngle(CP3 v1,CP3 v2) double cosnl; cosnl = (v1.x + v2.x + v1.y * v2.y + v1.z * v2.z)/ (sqrt(v1.x * v1.x + v1.y * v1

14、.y + v1.z * v1.z) * sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z); return cosnl;/計算斜投影CPoint CTestView:Projection(CP3 P) CP2 ScreenP; /ScreenP.x = P.x - P.z/sqrt(2); /ScreenP.y = P.y - P.z/sqrt(2); /ScreenP.x = P.x; /ScreenP.y = P.y; ScreenP.x = P.x + P.z * 0.3; ScreenP.y = P.y; return CPoint(ROUND(

15、ScreenP.x),ROUND(ScreenP.y);void CTestView:DrawObject(CDC *pDC) for (int i = 0;i =0) CFace face = (CFaceAr*)m_FaceArr.GetAt(i)-m_face; DrawFace(pDC,face); /Invalidate(FALSE);void CTestView:DrawFace(CDC *pDC,CFace face)/* if (rd = 0) rd += 1;/else rd -= 1; if (gd = 0) gd += 1;/else gd -= 1; if (bd =

16、255) rd -= 1;/else rd += 1; if (gd = 255) gd -= 1;/else gd += 1; if (bd = 255) bd -= 1;/else bd += 1;*/rd -= 0.097;gd += 0.097;bd += 0.097;/繪制三角面/CBrush brush(RGB(int)rd,(int)gd,(int)bd); CPen pen(PS_SOLID,1,RGB(int)rd,(int)gd,(int)bd);pDC-SelectObject(&pen); /pDC-SelectObject(&brush);CPoint P3; /*P

17、0 = Projection(face.P1);/ CPoint(face.P1.x,face.P1.y); P1 = Projection(face.P2);/ CPoint(face.P2.x,face.P2.y); P2 = Projection(face.P3);/ CPoint(face.P3.x,face.P3.y);*/P0 = Projection(face.P1);/ CPoint(face.P1.x,face.P1.y);P1 = Projection(face.P2);/ CPoint(face.P2.x,face.P2.y);P2 = Projection(face.P3);/ CPoint(face.P3.x,face.P3.y);pDC-MoveTo(P0.x,P0.y);pDC-LineTo(P1.x,P1.y);pDC-LineTo(P2.x,P2.y);pDC-Polygon(P,3);t();5、項目總結(jié)5.1 存在問題現(xiàn)在的程序還存在以下問題:(1)當(dāng)對窗口進(jìn)行大小或者其他變動,圖像會消失,沒有重畫。(2)目前視矢量是通過手動初始化,如果出現(xiàn)計算錯誤,就會導(dǎo)致球體繪制錯誤。5.2 項目改進(jìn)1、增加 Phong 光照模型,增加鏡面反射,使球體更加逼近真實感圖形。2、增加球體旋轉(zhuǎn)方法,使繪制出來的球可以自轉(zhuǎn)。3、以上問題因時間問題未能解決與改

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論