版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 《計(jì)算機(jī)圖形學(xué)》</b></p><p><b> 課程學(xué)習(xí)報(bào)告</b></p><p> 項(xiàng)目題目: 圓柱面圖像紋理映射算法</p><p><b> 目錄</b></p><p> 項(xiàng)目描述.......................
2、.............................................................................................................1</p><p> 1.1圓柱面的建立和二維圖像紋理的綁定....................................................................
3、..........1</p><p> 1.2坐標(biāo)系的建立......................................................................................................................1</p><p> 二、項(xiàng)目需求.............................
4、.......................................................................................................1</p><p> 2.1 幾何構(gòu)造的原理..................................................................................
5、...............................1</p><p> 2.2、動(dòng)畫(huà)的設(shè)計(jì)2</p><p> 2.3 紋理的設(shè)計(jì)2</p><p> 2.3.1 紋理映射的原理2</p><p> 2.3.2 紋理定義2</p><p> 三、項(xiàng)目設(shè)計(jì)..................
6、..................................................................................................................3</p><p> 3.1、窗口設(shè)計(jì)以及各項(xiàng)功能的實(shí)現(xiàn)3</p><p> 3.1.1 窗口設(shè)計(jì)函數(shù)3</p><p> 3.1
7、.2 點(diǎn)表函數(shù)4</p><p> 3.1.3 面表函數(shù)4</p><p> 3.1.4 繪制圓柱函數(shù)6</p><p> 3.1.5 透視變換函數(shù)8</p><p> 3.1.6 讀入紋理函數(shù)8</p><p> 3.1.7 背景函數(shù)9</p><p> 3.1.8 時(shí)
8、間函數(shù)....................................................................................................................9</p><p> 3.1.9 動(dòng)畫(huà)控制函數(shù).................................................................
9、...........................................10</p><p> 四、項(xiàng)目效果..................................................................................................................................10</p>&l
10、t;p> 4.1構(gòu)造圖形分析以及坐標(biāo)系變換的效果.....................................11</p><p> 項(xiàng)目總結(jié)..............................................................................................................................
11、....11</p><p> 參考文獻(xiàn)..................................................................................................................................12</p><p> 項(xiàng)目描述
12、0; </p><p> 1.1、圓柱的建立和二維圖像紋理的綁定</p><p> 以屏幕客戶區(qū)中心為體心建立圓柱面的幾何模型。讀入二維位圖圖像紋理,將紋理綁定到圓柱上。使用材質(zhì)慢反射率
13、設(shè)置紋理顏色,光源顏色設(shè)置為白色。使用Phong明暗處理繪制光照紋理圓柱面動(dòng)畫(huà)</p><p> 1.2、坐標(biāo)系的建立</p><p> 1>、自定義屏幕三維左手坐標(biāo),原點(diǎn)位于客戶區(qū)中心,x軸水平向右為正,y軸垂直向上為正,z軸指向屏幕內(nèi)部,</p><p> 2>、建立三維用戶右手坐標(biāo)系{O;x,y,z},原點(diǎn)O位于客戶區(qū)中心,x軸水平向右,y垂
14、直向上,z軸指向讀者。</p><p><b> 項(xiàng)目需求</b></p><p> 2.1、幾何構(gòu)造的原理</p><p> 圓柱面采用平面四邊形小面逼近,需要根據(jù)周向相鄰2個(gè)小面的法矢量計(jì)算平均法矢量。對(duì)于索引號(hào)(i,j)的頂點(diǎn),其相鄰頂點(diǎn)的索引號(hào)如圖所示。圖中箭頭所示為每個(gè)小面的邊矢量,倆個(gè)邊矢量的叉積得到小面的法矢量Ni。小面的平
15、均法矢量N的計(jì)算公式為N=</p><p><b> 2.2、動(dòng)畫(huà)的設(shè)計(jì)</b></p><p><b> 實(shí)現(xiàn)動(dòng)畫(huà)的函數(shù)</b></p><p> void CMy123054212View::OnPlay() </p><p><b> {</b></p>
16、;<p> // TODO: Add your command handler code here</p><p> bPlay=bPlay?FALSE:TRUE;</p><p> if(bPlay)//設(shè)置定時(shí)器</p><p> SetTimer(1,150,NULL);</p><p><b> E
17、lse</b></p><p> KillTimer(1);</p><p><b> }</b></p><p><b> 設(shè)定動(dòng)畫(huà)時(shí)間</b></p><p> void CTestView::OnTimer(UINT nIDEvent)//動(dòng)畫(huà)時(shí)間函數(shù) </p>
18、<p><b> {</b></p><p> // TODO: Add your message handler code here and/or call default</p><p><b> Beta=5;</b></p><p> tran.RotateY(Beta);</p>
19、<p> Invalidate(FALSE);</p><p> CView::OnTimer(nIDEvent);</p><p><b> }</b></p><p><b> 2.3、紋理的設(shè)計(jì)</b></p><p> 2.3.1 紋理映射的原理</p>
20、<p> 使用MFC的資源標(biāo)簽頁(yè)加載二維圖像紋理,DDB位圖的標(biāo)識(shí)取為IDB_TEXTURE。將紋理讀入二維數(shù)組中,將紋理圖像綁定到圓柱面的側(cè)面網(wǎng)格頂點(diǎn)上。將圖像紋理的顏色值作為材質(zhì)漫反射率和環(huán)境光反射率,鏡面反射光設(shè)置為白光,使用Phong明暗處理繪制光照紋理圓柱面。</p><p> 2.3.2 紋理的定義</p><p> 在CTestView類內(nèi)添加成員函數(shù)Rea
21、dVertex(),將紋理綁定到圓柱面?zhèn)让娴捻旤c(diǎn)上,CT2類定義了紋理坐標(biāo)的(u,v)。由于底面和頂面采用三角形網(wǎng)格逼近,所以使用CT2類定義了Texture4和Texture3紋理數(shù)組。圓柱的側(cè)面使用周向平均法矢量計(jì)算光照。填充底面頂面的三角形面片時(shí),進(jìn)行了特殊處理。然后添加ReadImage()讀入紋理。</p><p><b> 項(xiàng)目設(shè)計(jì)</b></p><p&g
22、t; 3.1、窗口設(shè)計(jì)以及各項(xiàng)功能的實(shí)現(xiàn)</p><p> 3.1.1窗口設(shè)計(jì)函數(shù)</p><p> BOOL CMy123054212App::InitInstance() </p><p> {// The one and only window has been initialized, so show and update it.</p>
23、;<p> m_pMainWnd->ShowWindow(SW_MAXIMIZE);</p><p> m_pMainWnd->SetWindowText("1234054212劉美艷");</p><p> m_pMainWnd->UpdateWindow();</p><p> return TRUE;
24、</p><p><b> }</b></p><p> 3.1.2、點(diǎn)表函數(shù)</p><p> void CMy123054212View::ReadVertex()//點(diǎn)表</p><p><b> {</b></p><p> double r=144;//圓
25、柱底面半徑</p><p> h=500;//圓柱的高</p><p> cTheta=10;//周向夾角</p><p> cNum=10;//縱向間距</p><p> N1=360/cTheta;//N1周向網(wǎng)格數(shù)</p><p> N2=Round(h/cNum);//N2縱向網(wǎng)格數(shù)</p>
26、;<p> V=new CP3[N1*(N2+1)+2];//頂點(diǎn)動(dòng)態(tài)數(shù)組</p><p> T=new CT2[N1*(N2+1)+2];//紋理動(dòng)態(tài)數(shù)組</p><p> N=new CVector[N1*(N2+1)+2];//法矢量動(dòng)態(tài)數(shù)組</p><p> double cTheta1,cNum1;</p><p&
27、gt; V[0].x=0;V[0].y=0;V[0].z=0;//底面中心</p><p> T[0].u=0;T[0].v=0;//閑置</p><p> for(int i=0;i<N2+1;i++)//縱向</p><p><b> {</b></p><p> cNum1=i*cNum;</
28、p><p> for(int j=0;j<N1;j++)//周向</p><p><b> {</b></p><p> cTheta1=j*cTheta*PI/180;</p><p> V[i*N1+j+1].x=r*cos(cTheta1);</p><p> V[i*N1+j+
29、1].y=cNum1;</p><p> V[i*N1+j+1].z=r*sin(cTheta1);</p><p> T[i*N1+j+1].u=(2*PI-cTheta1)/(2*PI)*(bmp.bmWidth-1);//u(0->1)</p><p> T[i*N1+j+1].v=V[i*N1+j+1].y/h*(bmp.bmHeight-1);
30、//v(0->1)</p><p><b> }</b></p><p><b> }</b></p><p> V[N1*(N2+1)+1].x=0;V[N1*(N2+1)+1].y=h;V[N1*(N2+1)+1].z=0;//頂面中心T[N1*(N2+1)+1].u=0;T[N1*(N2+1)+1].v=
31、0;//閑置</p><p><b> }</b></p><p> 3.1.3、面表函數(shù)</p><p> void CMy123054212View::ReadFace()//面表</p><p><b> {</b></p><p> //設(shè)置二維動(dòng)態(tài)數(shù)組&l
32、t;/p><p> F=new CFace *[N2+2];//縱向</p><p> for(int n=0;n<N2+2;n++)</p><p> F[n]=new CFace[N1];//周向</p><p> for(int j=0;j<N1;j++)//構(gòu)造底部三角形面片</p><p>&
33、lt;b> {</b></p><p> int tempj=j+1;</p><p> if(N1==tempj) tempj=0;//面片的首尾連接</p><p> int BottomIndex[3];//底部三角形面片索引號(hào)數(shù)組</p><p> BottomIndex[0]=0;</p>
34、<p> BottomIndex[1]=j+1;</p><p> BottomIndex[2]=tempj+1;</p><p> F[0][j].SetNum(3);</p><p> for(int k=0;k<F[0][j].vN;k++)//面片中頂點(diǎn)索引號(hào)</p><p> F[0][j].vI[k]=B
35、ottomIndex[k];</p><p><b> }</b></p><p> for(int i=1;i<N2+1;i++)//構(gòu)造圓柱體四邊形面片</p><p><b> {</b></p><p> for(int j=0;j<N1;j++)</p>
36、<p><b> {</b></p><p> int tempi=i+1;</p><p> int tempj=j+1;</p><p> if(N1==tempj) tempj=0;</p><p> int BodyIndex[4];//圓柱體四邊形面片索引號(hào)數(shù)組</p>&l
37、t;p> BodyIndex[0]=(i-1)*N1+j+1;</p><p> BodyIndex[1]=(tempi-1)*N1+j+1;</p><p> BodyIndex[2]=(tempi-1)*N1+tempj+1;</p><p> BodyIndex[3]=(i-1)*N1+tempj+1;</p><p>
38、 F[i][j].SetNum(4);</p><p> for(int k=0;k<F[i][j].vN;k++)</p><p> F[i][j].vI[k]=BodyIndex[k];</p><p><b> }</b></p><p><b> }</b></p&
39、gt;<p> for(j=0;j<N1;j++)//構(gòu)造頂部三角形面片</p><p><b> {</b></p><p> int tempj=j+1;</p><p> if(N1==tempj) tempj=0;</p><p> int TopIndex[3];//頂部三角形面片
40、索引號(hào)數(shù)組</p><p> TopIndex[0]=N1*i+1;</p><p> TopIndex[1]=N1*(i-1)+tempj+1;</p><p> TopIndex[2]=N1*(i-1)+j+1;</p><p> F[N2+1][j].SetNum(3);</p><p> for(i
41、nt k=0;k<F[N2+1][j].vN;k++)</p><p> F[N2+1][j].vI[k]=TopIndex[k];</p><p><b> }</b></p><p><b> }</b></p><p> 3.1.4、繪制圓柱函數(shù)</p><
42、p> void CMy123054212View::DrawObject(CDC *pDC)//繪制圓柱面</p><p><b> {</b></p><p> CalNormal();</p><p> CZBuffer *zbuf=new CZBuffer;//申請(qǐng)內(nèi)存</p><p> zbuf-
43、>InitDeepBuffer(800,800,1000);//初始化深度緩沖器</p><p> CPi3 Point3[3];//底面與頂面三角形頂點(diǎn)數(shù)組</p><p> CT2 Texture3[3];//底面與頂面三角形紋理數(shù)組</p><p> CVector Normal3[3];//底面與頂面三角形法矢量數(shù)組</p><
44、;p> CPi3 Point4[4];//側(cè)面四邊形頂點(diǎn)數(shù)組</p><p> CT2 Texture4[4];//側(cè)面四邊形紋理數(shù)組</p><p> CVector Normal4[4];//側(cè)面四邊形法矢量數(shù)組</p><p> for(int i=0;i<N2+2;i++)</p><p><b> {
45、</b></p><p> for(int j=0;j<N1;j++)</p><p><b> {</b></p><p> CVector ViewVector(V[F[i][j].vI[0]],ViewPoint);//面的視矢量</p><p> ViewVector=ViewVecto
46、r.Normalize();//單位化視矢量</p><p> F[i][j].SetFaceNormal(V[F[i][j].vI[0]],V[F[i][j].vI[1]],V[F[i][j].vI[2]]);//計(jì)算小面片法矢量</p><p> F[i][j].fNormal.Normalize();//單位化法矢量</p><p> if(Dot(Vi
47、ewVector,F[i][j].fNormal)>=0)</p><p><b> {</b></p><p> if(3==F[i][j].vN)//處理三角形面片</p><p><b> {</b></p><p> for(int m=0;m<F[i][j].vN;m+
48、+)</p><p><b> {</b></p><p> PerProject(V[F[i][j].v</p><p><b> I[m]]);</b></p><p> Point3[m]=ScreenP;</p><p> Normal3[m]=F[i][j
49、].fNormal;</p><p><b> }</b></p><p> double tempj=j+1;//對(duì)三角形面片進(jìn)行特殊處理</p><p> Texture3[0].u=cTheta*(j+0.5)/360.0;Texture3[0].v=0.0; </p><p> Texture3[1].
50、u=cTheta*(j+0.5)/360.0;Texture3[1].v=0.0;</p><p> Texture3[2].u=cTheta*tempj/360.0; Texture3[2].v=0.0;</p><p> zbuf->SetPoint(Point3,Normal3,Texture3,3);//初始化</p><p> zbuf-&g
51、t;CreateBucket();//創(chuàng)建桶表</p><p> zbuf->CreateEdge();//創(chuàng)建邊表</p><p> zbuf->Phong(pDC,ViewPoint,pLight,pMaterial,Image);//填充三角形</p><p> zbuf->ClearMemory();</p><p
52、><b> }</b></p><p> else//處理四邊形面片</p><p><b> {</b></p><p> for(int m=0;m<F[i][j].vN;m++)</p><p><b> {</b></p><p
53、> PerProject(V[F[i][j].vI[m]]);</p><p> Point4[m]=ScreenP;</p><p> Normal4[m]=N[F[i][j].vI[m]];</p><p> Texture4[m]=T[F[i][j].vI[m]];</p><p><b> }</b&g
54、t;</p><p> if(N1-1==j)//消除圖像紋理的接縫</p><p><b> {</b></p><p> Texture4[2].u=0.0;</p><p> Texture4[3].u=0.0;</p><p><b> }</b><
55、/p><p> zbuf->SetPoint(Point4,Normal4,Texture4,4);//初始化</p><p> zbuf->CreateBucket();//創(chuàng)建桶表</p><p> zbuf->CreateEdge();//創(chuàng)建邊表</p><p> zbuf->Phong(pDC,ViewP
56、oint,pLight,pMaterial,Image);//填充四邊形</p><p> zbuf->ClearMemory();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
57、;<p><b> }</b></p><p> delete zbuf;</p><p><b> }</b></p><p> 3.1.5、透視變換函數(shù)</p><p> void CMy123054212View::PerProject(CP3 P)//透視變換<
58、/p><p><b> {</b></p><p> CP3 ViewP;</p><p> ViewP.x=P.x*k[3]-P.z*k[1];//觀察坐標(biāo)系三維坐標(biāo)</p><p> ViewP.y=-P.x*k[8]+P.y*k[2]-P.z*k[7];</p><p> ViewP.
59、z=-P.x*k[6]-P.y*k[4]-P.z*k[5]+R;</p><p> ViewP.c=P.c;</p><p> ScreenP.x=d*ViewP.x/ViewP.z;//屏幕坐標(biāo)系三維坐標(biāo)</p><p> ScreenP.y=Round(d*ViewP.y/ViewP.z);</p><p> ScreenP.z=
60、Far*(1-Near/ViewP.z)/(Far-Near);</p><p> ScreenP.c=ViewP.c;</p><p><b> }</b></p><p> 3.1.6、讀入紋理</p><p> void CMy123054212View::ReadImage()//讀入紋理</p&g
61、t;<p><b> {</b></p><p> CBitmap NewBitmap;</p><p> NewBitmap.LoadBitmap(IDB_TEXTURE);//調(diào)入DDB位圖</p><p> NewBitmap.GetBitmap(&bmp);//將CBitmap的信息保存到Bitmap結(jié)構(gòu)體
62、中</p><p> int nbytesize=bmp.bmWidthBytes*bmp.bmHeight;</p><p> im=new BYTE[nbytesize];</p><p> NewBitmap.GetBitmapBits(nbytesize,(LPVOID)im);</p><p> Image=new COLO
63、RREF*[bmp.bmHeight];</p><p> for(int n1=0;n1<bmp.bmHeight;n1++)</p><p> Image[n1]=new COLORREF[bmp.bmWidth];</p><p> for(n1=0;n1<bmp.bmHeight;n1++)</p><p>&l
64、t;b> {</b></p><p> for(int n2=0;n2<bmp.bmWidth;n2++)</p><p><b> {</b></p><p> int pos=n1*bmp.bmWidthBytes+4*n2;//顏色分量位置</p><p> n1=bmp.bmHe
65、ight-1-n1;//位圖從左下角向右上角</p><p> Image[n1][n2]=RGB(im[pos+2],im[pos+1],im[pos]);</p><p><b> }</b></p><p><b> }</b></p><p> delete []im;</p&
66、gt;<p><b> }</b></p><p> 3.1.7、背景函數(shù)</p><p> BOOL CMy123054212View::OnEraseBkgnd(CDC* pDC) </p><p><b> {</b></p><p> // TODO: Add you
67、r message handler code here and/or call default</p><p> return TRUE;</p><p><b> }</b></p><p> 3.1.8、時(shí)間函數(shù)</p><p> void CMy123054212View::OnTimer(UINT nID
68、Event) </p><p><b> {</b></p><p> // TODO: Add your message handler code here and/or call default</p><p><b> Beta=5;</b></p><p> tran.RotateY
69、(Beta);</p><p> Invalidate(FALSE);</p><p> CView::OnTimer(nIDEvent);</p><p><b> }</b></p><p> 3.1.9、動(dòng)畫(huà)控制函數(shù)</p><p> void CMy123054212View::
70、OnUpdatePlay(CCmdUI* pCmdUI) </p><p><b> {</b></p><p> // TODO: Add your command update UI handler code here</p><p><b> if(bPlay)</b></p><p>
71、<b> {</b></p><p> pCmdUI->SetCheck(TRUE);</p><p> pCmdUI->SetText("停止");</p><p><b> }</b></p><p><b> else</b>&l
72、t;/p><p><b> {</b></p><p> pCmdUI->SetCheck(FALSE);</p><p> pCmdUI->SetText("開(kāi)始");</p><p><b> }</b></p><p><b&g
73、t; }</b></p><p><b> 項(xiàng)目效果</b></p><p> 4.1構(gòu)造圖形分析以及坐標(biāo)系變換的效果</p><p><b> 項(xiàng)目總結(jié)</b></p><p> 本項(xiàng)目將一幅位圖映射到圓柱面上,并進(jìn)行了光照計(jì)算。由于圓柱面?zhèn)让娴恼归_(kāi)圖是長(zhǎng)方形,如果取得圖像大
74、小為側(cè)面展開(kāi)圖的大小,則圓柱面上的像素與圖像上的像素有一一對(duì)應(yīng)關(guān)系。本項(xiàng)目在點(diǎn)表中進(jìn)行圖像紋理綁定。對(duì)于單幅圖像映射,一般在點(diǎn)表中綁定;對(duì)于多幅圖像映射,一般在面表中綁定。側(cè)面四邊形頂點(diǎn)的法矢量取為周向2個(gè)表面的平均法矢量。圓柱面試閉合的二次曲面,這要求對(duì)圖像紋理閉合處進(jìn)行特殊處理,處理方法見(jiàn)DrawObject()函數(shù)。</p><p><b> 六、參考文獻(xiàn)</b></p>
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖形學(xué)課程設(shè)計(jì)-- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--圖形學(xué)基礎(chǔ)圖形處理實(shí)現(xiàn)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)圖形學(xué)論文-計(jì)算機(jī)圖形學(xué)
- barsky直線裁剪算法計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--- 轉(zhuǎn)動(dòng)鐘表
- 圖形學(xué)教案計(jì)算機(jī)圖形學(xué)a
- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)
- 計(jì)算機(jī)圖形學(xué)中紋理生成研究.pdf
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)-- 彈跳的彩球動(dòng)畫(huà)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)構(gòu)造完整系統(tǒng)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)-有效邊表填充算法的實(shí)現(xiàn)
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)——掃雷游戲程序設(shè)計(jì)
- 有效邊表填充算法的實(shí)現(xiàn)計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)
- 計(jì)算機(jī)圖形學(xué)簡(jiǎn)介
- 計(jì)算機(jī)圖形學(xué)題庫(kù)
- 計(jì)算機(jī)圖形學(xué)答案
- 計(jì)算機(jī)圖形學(xué)簡(jiǎn)介
評(píng)論
0/150
提交評(píng)論