圖形學(xué)課程設(shè)計(jì)報(bào)告_第1頁(yè)
圖形學(xué)課程設(shè)計(jì)報(bào)告_第2頁(yè)
圖形學(xué)課程設(shè)計(jì)報(bào)告_第3頁(yè)
圖形學(xué)課程設(shè)計(jì)報(bào)告_第4頁(yè)
圖形學(xué)課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、可視化報(bào)告一、 所選題目長(zhǎng)方體的光照效果可視化顯示。二、可視化簡(jiǎn)介可視化(Visualization)是利用計(jì)算機(jī)圖形學(xué)和圖像處理技術(shù),將數(shù)據(jù)轉(zhuǎn)換成圖形或圖像在屏幕上顯示出來(lái),并進(jìn)行交互處理的理論、方法和技術(shù)。它涉及到計(jì)算機(jī)圖形學(xué)、圖像處理、計(jì)算機(jī)視覺(jué)、計(jì)算機(jī)輔助設(shè)計(jì)等多個(gè)領(lǐng)域,成為研究數(shù)據(jù)表示、數(shù)據(jù)處理、決策分析等一系列問(wèn)題的綜合技術(shù)。目前正在飛速發(fā)展的虛擬現(xiàn)實(shí)技術(shù)也是以圖形圖像的可視化技術(shù)為依托的。最近幾年計(jì)算機(jī)圖形學(xué)的發(fā)展使得三維表現(xiàn)技術(shù)得以形成,這些三維表現(xiàn)技術(shù)使我們能夠再現(xiàn)三維世界中的物體,能夠用三維形體來(lái)表示復(fù)雜的信息,這種技術(shù)就是可視化(Visualization)技術(shù)??梢暬?/p>

2、術(shù)使人能夠在三維圖形世界中直接對(duì)具有形體的信息進(jìn)行操作,和計(jì)算機(jī)直接交流。這種技術(shù)已經(jīng)把人和機(jī)器的力量以一種直覺(jué)而自然的方式加以統(tǒng)一,這種革命性的變化無(wú)疑將極大地提高人們的工作效率。可視化技術(shù)賦予人們一種仿真的、三維的并且具有實(shí)時(shí)交互的能力,這樣人們可以在三維圖形世界中用以前不可想象的手段來(lái)獲取信息或發(fā)揮自己創(chuàng)造性的思維。機(jī)械工程師可以從二維平面圖中得以解放直接進(jìn)入三維世界,從而很快得到自己設(shè)計(jì)的三維機(jī)械零件模型。醫(yī)生可以從病人的三維掃描圖象分析病人的病灶。軍事指揮員可以面對(duì)用三維圖形技術(shù)生成的戰(zhàn)場(chǎng)地形,指揮具有真實(shí)感的三維飛機(jī)、軍艦、坦克向目標(biāo)開(kāi)進(jìn)并分析戰(zhàn)斗方案的效果。更令人驚奇的是目前正在

3、發(fā)展的虛擬現(xiàn)實(shí)技術(shù),人們對(duì)計(jì)算機(jī)可視化技術(shù)的研究已經(jīng)歷了一個(gè)很長(zhǎng)的歷程,而且形成了許多可視化工具,其中SGI公司推出的GL三維圖形庫(kù)表現(xiàn)突出,易于使用而且功能強(qiáng)大。利用GL開(kāi)發(fā)出來(lái)的三維應(yīng)用軟件頗受許多專業(yè)技術(shù)人員的喜愛(ài),這些三維應(yīng)用軟件已涉及建筑、產(chǎn)品設(shè)計(jì)、醫(yī)學(xué)、地球科學(xué)、流體力學(xué)等領(lǐng)域。隨著計(jì)算機(jī)技術(shù)的繼續(xù)發(fā)展,GL已經(jīng)進(jìn)一步發(fā)展成為OpenGL,OpenGL已被認(rèn)為是高性能圖形和交互式視景處理的標(biāo)準(zhǔn),包括ATT公司UNIX軟件實(shí)驗(yàn)室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和SGI公司在內(nèi)的幾家在計(jì)算機(jī)市場(chǎng)占領(lǐng)導(dǎo)地位的大公司都采用了OpenGL圖形標(biāo)準(zhǔn)。值得一

4、提的是,由于Microsoft公司在Windows NT中提供OpenGL圖形標(biāo)準(zhǔn),OpenGL將在微機(jī)中廣泛應(yīng)用,尤其是OpenGL三維圖形加速卡和微機(jī)圖形工作站的推出,人們可以在微機(jī)上實(shí)現(xiàn)三維圖形應(yīng)用,如CAD設(shè)計(jì)、仿真模擬、三維游戲等,從而更有機(jī)會(huì)、更方便地使用OpenGL及其應(yīng)用軟件來(lái)建立自己的三維圖形世界。三、題目要求a) 題目要求 對(duì)長(zhǎng)方體,建立一個(gè)點(diǎn)光源,采用環(huán)境光和點(diǎn)光源漫反射光的光照模型,應(yīng)用FLAT明暗處理方法,顯示平行投影后的長(zhǎng)方體光照效果。b) 任務(wù)分析本題目主要包括五個(gè)任務(wù),1)長(zhǎng)方體表面模型的建立 2)長(zhǎng)方體的可見(jiàn)面判斷 3)可見(jiàn)面的背光性判斷4)可見(jiàn)面光照計(jì)算5)

5、可見(jiàn)面光照效果顯示。其中,任務(wù)1)中,定義三維齊次坐標(biāo)結(jié)構(gòu)和面的結(jié)構(gòu);定義頂點(diǎn)表和面表,對(duì)長(zhǎng)方體繞X軸旋轉(zhuǎn)和繞Y軸旋轉(zhuǎn)。任務(wù)2)中對(duì)每一個(gè)面計(jì)算其外法向量及可見(jiàn)性任務(wù)3)中對(duì)每個(gè)可見(jiàn)面計(jì)算其光線向量,并判斷其是否為背光面。任務(wù)4)計(jì)算每個(gè)見(jiàn)光面的環(huán)境光和點(diǎn)光源的漫反射分量。任務(wù)5)用該面的光強(qiáng)顯示該可見(jiàn)面四、數(shù)據(jù)可視化流程用戶感知社會(huì)自然現(xiàn)象數(shù)據(jù)采集數(shù)據(jù)處理變換可視化映射可視化流程概念圖五、算法流程圖六、核心算法描述(1) 判斷長(zhǎng)方體六個(gè)面的可見(jiàn)性首先計(jì)算每個(gè)面的外法向量N,視線方向?yàn)轭A(yù)先給定的方向eye,兩個(gè)向量進(jìn)行點(diǎn)積即可判斷可見(jiàn)性;若點(diǎn)積結(jié)果>0,即cos>0,則此面可見(jiàn);點(diǎn)

6、積結(jié)果<0,即cos<0,則此面不可見(jiàn);若點(diǎn)積結(jié)果=0,即cos=0,則外法向量與視線方向垂直,長(zhǎng)方形退化為一條直線。(2) 判斷長(zhǎng)方體六個(gè)面的向光性先取每個(gè)面的中心點(diǎn)(對(duì)角線的中點(diǎn))與點(diǎn)光源做差,得到的方向?yàn)檎丈浯嗣娴墓饩€方向,根據(jù)光線方向與外法向量的點(diǎn)積判斷每個(gè)面的向光性;若點(diǎn)積結(jié)果>=0,即cos>=0,則此面為向光面;點(diǎn)積結(jié)果<0,即cos<0,則此面為背光面;(3) 環(huán)境光與漫反射光的顏色分量的疊加照射到每個(gè)面的光照強(qiáng)度根據(jù)cos的不同而不同,因此,在計(jì)算向光性的時(shí)候?qū)os的值計(jì)算出,并保存在數(shù)組中,然后根據(jù)公式計(jì)算出每個(gè)面的總光照強(qiáng)度,同時(shí)也計(jì)

7、算出RGB模型的三個(gè)顏色分量,以便圖形的顯示。(4) 平行投影與窗視變換平行投影:將三維的圖形平行投影到XOY平面上。窗視變換:假定把窗口內(nèi)的一點(diǎn)變換為視區(qū)中的一點(diǎn)根據(jù)公式 和 進(jìn)行窗口視區(qū)變換,圖形在視區(qū)中顯示(5) 圖形的顯示調(diào)用BeginPath()和EndPath()函數(shù)標(biāo)記填充路徑,并調(diào)用FillPath()選用當(dāng)前畫(huà)刷分別填充向光面(因每個(gè)面選用的畫(huà)刷的顏色分量不同,而分別顯示每個(gè)面的光照效果);背光面不進(jìn)行填充。七、算法步驟: 定義結(jié)構(gòu)和變量 定義三維齊次坐標(biāo)結(jié)構(gòu)和面結(jié)構(gòu);定義凸多面體表面模型,頂點(diǎn)表為頂點(diǎn)結(jié)構(gòu)數(shù)組,面表為面結(jié)構(gòu)數(shù)組,定義光照顏色分量結(jié)構(gòu),定義環(huán)境光模型與漫反射模

8、型; 變量初始化 在視圖類構(gòu)造函數(shù)中給頂點(diǎn)表賦值;給面表賦值(注意頂點(diǎn)序列順序); 分別對(duì)凸多面體繞X軸旋轉(zhuǎn)和繞Y軸旋轉(zhuǎn)。 設(shè)置環(huán)境光光強(qiáng),反射系數(shù),點(diǎn)光源光強(qiáng),點(diǎn)光源漫反射系數(shù) 計(jì)算各面的可見(jiàn)性由相鄰兩條邊的叉積計(jì)算面的外法向量,由外法向量與視線方向的點(diǎn)積判斷面的可見(jiàn)性,若該面可見(jiàn),繼續(xù)進(jìn)行下面步驟,否則該面結(jié)束。 計(jì)算每個(gè)面的中心點(diǎn),即各頂點(diǎn)求平均;計(jì)算入射光方向,即點(diǎn)光源坐標(biāo)-面的中心點(diǎn);計(jì)算入射光線與外法向量的夾角,若大于等于90度,則點(diǎn)光源無(wú)法直接照射到該中心點(diǎn),即該面的點(diǎn)光源漫反射分量為0;否則根據(jù)入射光線與法向量夾角計(jì)算該面的點(diǎn)光源漫反射分量;該面的光強(qiáng)為環(huán)境光強(qiáng)分量與點(diǎn)光源漫反

9、射分量之和。 對(duì)該面的四個(gè)頂點(diǎn)作投影平面為XOY平面的平行投影。 對(duì)該面的四個(gè)頂點(diǎn)作窗口-視區(qū)變換。 用該面的光強(qiáng)顯示其投影后的多變形區(qū)域八、程序代碼:(1) 定義的結(jié)構(gòu)體 /定義三維齊次坐標(biāo)結(jié)構(gòu)typedef struct tagHOMOCOORD float x; float y; float z; float w;HOMOCOORD;/定義面的結(jié)構(gòu)typedef struct tagPLANEint v0, v1, v2, v3;bool bvisible;bool HeadLight;PLANE;/定義點(diǎn)的結(jié)構(gòu),需要浮點(diǎn)數(shù)的x,ytypedef struct tagMYPOINTflo

10、at x,y;MYPOINT;/定義顏色分量結(jié)構(gòu),需要的浮點(diǎn)數(shù)red,green,bluetypedef struct tagCOLORfloat red,green,blue;LCOLOR;/定義環(huán)境光模型與漫反射模型,需要變量為光強(qiáng)和反射系數(shù),I_a表示環(huán)境光的光強(qiáng),I_p表示漫反射光的光強(qiáng);K_a表示環(huán)境光的反射系數(shù),K_d表示漫反射光的反射系數(shù)typedef struct tagINTENSEfloat I_a,I_p;LCOLOR K_a,K_d,I;LINTENSE;(2) Draw3Dview的源代碼/ Draw3DView.cpp : implementation of the

11、 CDraw3DView class#include "stdafx.h"#include "Draw3D.h"#include "Draw3DDoc.h"#include "Draw3DView.h"#include "math.h"#define ROUND(a) int(a+0.5)/四舍五入#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CDraw3DView

12、IMPLEMENT_DYNCREATE(CDraw3DView, CView)BEGIN_MESSAGE_MAP(CDraw3DView, CView)/AFX_MSG_MAP(CDraw3DView)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:O

13、nFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CDraw3DView construction/destructionCDraw3DView:CDraw3DView()/ TODO: add construction code hereCDraw3DView:CDraw3DView()BOOL CDraw3DView:PreCreateWindow(CREATES

14、TRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CDraw3DView drawingvoid CDraw3DView:OnDraw(CDC* pDC)CDraw3DDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereDrawMy3DGraphics(); /繪圖函數(shù)

15、/ CDraw3DView printingBOOL CDraw3DView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CDraw3DView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CDraw3DView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo

16、* /*pInfo*/)/ TODO: add cleanup after printing/ CDraw3DView diagnostics#ifdef _DEBUGvoid CDraw3DView:AssertValid() constCView:AssertValid();void CDraw3DView:Dump(CDumpContext& dc) constCView:Dump(dc);CDraw3DDoc* CDraw3DView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKind

17、Of(RUNTIME_CLASS(CDraw3DDoc);return (CDraw3DDoc*)m_pDocument;#endif /_DEBUG/ CDraw3DView message handlersvoid CDraw3DView:DrawMy3DGraphics()int i;/形體定義ptn=8;pts=new HOMOCOORDptn;/設(shè)置長(zhǎng)方體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.

18、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;/給定義面的指針?lè)峙鋬?nèi)存;fn=6;faces=new PLANEfn;/設(shè)置立方體各面faces0.v0=0; faces0.v1=1; faces0.v2=2; faces0.v3

19、=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;RotateX(30); /繞

20、X軸逆時(shí)針旋轉(zhuǎn)30度 RotateY(30); /繞Y軸逆時(shí)針旋轉(zhuǎn)30度 /外法向量/N為外法向量,eye為視線方向,light表示點(diǎn)光源位置;u1和u2分別是中間量HOMOCOORD *N,eye,*u1,*u2,light;/L_tensep為點(diǎn)光源強(qiáng)度,L_tense為鏡面反射光照強(qiáng)度,ADD_tense為疊加后的光照強(qiáng)度LINTENSE *L_tensep,L_tense,*ADD_tense;L_tensep = new LINTENSEfn;ADD_tense=new LINTENSEfn;float cos_theta6; /cos_theta為入射光線與外法向量的夾角N=new

21、 HOMOCOORDfn;u1=new HOMOCOORDfn;u2=new HOMOCOORDfn;eye.x=0;eye.y=0;eye.z=1;light.x=1;light.y=1;light.z=100;/判斷每個(gè)面的可見(jiàn)性,并標(biāo)記 for(i=0;i<fn;i+) u1i.x=ptsfacesi.v1.x-ptsfacesi.v0.x; u1i.y=ptsfacesi.v1.y-ptsfacesi.v0.y; u1i.z=ptsfacesi.v1.z-ptsfacesi.v0.z; u2i.x=ptsfacesi.v2.x-ptsfacesi.v1.x; u2i.y=ptsf

22、acesi.v2.y-ptsfacesi.v1.y; u2i.z=ptsfacesi.v2.z-ptsfacesi.v1.z; Ni.x=u1i.y*u2i.z-u2i.y*u1i.z; Ni.y=u1i.z*u2i.x-u1i.x*u2i.z; Ni.z=u1i.x*u2i.y-u1i.y*u2i.x; if(Ni.x*eye.x+Ni.y*eye.y+Ni.z*eye.z > 0)facesi.bvisible=1; else facesi.bvisible=0;/判斷每個(gè)面的向光性,見(jiàn)光面為1,背光面為0 for(i=0;i<fn;i+) u1i.x=(ptsfacesi.v

23、0.x+ptsfacesi.v2.x)/2; u1i.y=(ptsfacesi.v0.y+ptsfacesi.v2.y)/2; u1i.z=(ptsfacesi.v0.z+ptsfacesi.v2.z)/2; u2i.x=light.x-u1i.x; u2i.y=light.y-u1i.y; u2i.z=light.z-u1i.z; cos_thetai=(Ni.x*u2i.x+Ni.y*u2i.y+Ni.z*u2i.z)/(sqrt(Ni.x*Ni.x+Ni.y*Ni.y+Ni.z*Ni.z)*sqrt(u2i.x*u2i.x+u2i.y*u2i.y+u2i.z*u2i.z);/計(jì)算總的入射

24、光強(qiáng)與外法向量的夾角的余弦值 if(cos_thetai > 0) /判斷面的向光性 facesi.HeadLight=1; L_tensepi.I_p=1; else facesi.HeadLight=0; L_tensepi.I_p=0; cos_thetai=0; /初始化已知數(shù)據(jù),材質(zhì)為金的環(huán)境光反射率和漫反射光反射率的RGB分量值L_tense.K_a.red=0.247; L_tense.K_d.red=0.752; L_tense.K_a.blue=0.075; L_tense.K_d.blue=0.226; L_tense.K_a.green=0.200; L_tense

25、.K_d.green=0.606; L_tense.I_a=1; /計(jì)算疊加后的光照強(qiáng)度的RGB分量for(i=0;i<fn;i+)ADD_tensei.I.red=L_tense.I_a*L_tense.K_a.red+L_tensepi.I_p*L_tense.K_d.red*cos_thetai;ADD_tensei.I.red=ADD_tensei.I.red>1?1:ADD_tensei.I.red; ADD_tensei.I.green=L_tense.I_a*L_tense.K_a.green+L_tensepi.I_p*L_tense.K_d.green*cos_t

26、hetai;ADD_tensei.I.green=ADD_tensei.I.green>1?1:ADD_tensei.I.green; ADD_tensei.I.blue=L_tense.I_a*L_tense.K_a.blue+L_tensepi.I_p*L_tense.K_d.blue*cos_thetai;ADD_tensei.I.blue=ADD_tensei.I.blue>1?1:ADD_tensei.I.blue; /平行投影變換for(i=0;i<ptn;i+)pts2Di.x=ptsi.x;pts2Di.y=ptsi.y;/窗口-視區(qū)變換實(shí)現(xiàn)過(guò)程float w

27、xl=-3,wxr=3,wyb=-3,wyt=3;int vxl=0,vxr=500,vyb=0,vyt=400; / 窗口-視區(qū)變換 float a=(vxr-vxl)/(wxr-wxl); float b=vxl-wxl*a; float c=(vyt-vyb)/(wyt-wyb); float d=vyb-wyb*c; for(i=0;i<ptn;i+) pts2Di.x=a*pts2Di.x+b;pts2Di.y=c*pts2Di.y+d; /圖形顯示CClientDC dc(this); CBrush NewBrush,*pOldBrush;for(i=0;i<fn;i+)dc.BeginPath();NewBrush.CreateSolidBrush(RGB(ROUN

溫馨提示

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

評(píng)論

0/150

提交評(píng)論