計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)--圓柱面圖像紋理映射算法_第1頁(yè)
已閱讀1頁(yè),還剩13頁(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、<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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論