計算機圖形學課程設計--圓柱面圖像紋理映射算法_第1頁
已閱讀1頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  《計算機圖形學》</b></p><p><b>  課程學習報告</b></p><p>  項目題目: 圓柱面圖像紋理映射算法</p><p><b>  目錄</b></p><p>  項目描述.......................

2、.............................................................................................................1</p><p>  1.1圓柱面的建立和二維圖像紋理的綁定....................................................................

3、..........1</p><p>  1.2坐標系的建立......................................................................................................................1</p><p>  二、項目需求.............................

4、.......................................................................................................1</p><p>  2.1 幾何構造的原理..................................................................................

5、...............................1</p><p>  2.2、動畫的設計2</p><p>  2.3 紋理的設計2</p><p>  2.3.1 紋理映射的原理2</p><p>  2.3.2 紋理定義2</p><p>  三、項目設計..................

6、..................................................................................................................3</p><p>  3.1、窗口設計以及各項功能的實現(xiàn)3</p><p>  3.1.1 窗口設計函數(shù)3</p><p>  3.1

7、.2 點表函數(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 時

8、間函數(shù)....................................................................................................................9</p><p>  3.1.9 動畫控制函數(shù).................................................................

9、...........................................10</p><p>  四、項目效果..................................................................................................................................10</p>&l

10、t;p>  4.1構造圖形分析以及坐標系變換的效果.....................................11</p><p>  項目總結..............................................................................................................................

11、....11</p><p>  參考文獻..................................................................................................................................12</p><p>  項目描述    

12、0;                 </p><p>  1.1、圓柱的建立和二維圖像紋理的綁定</p><p>  以屏幕客戶區(qū)中心為體心建立圓柱面的幾何模型。讀入二維位圖圖像紋理,將紋理綁定到圓柱上。使用材質慢反射率

13、設置紋理顏色,光源顏色設置為白色。使用Phong明暗處理繪制光照紋理圓柱面動畫</p><p>  1.2、坐標系的建立</p><p>  1>、自定義屏幕三維左手坐標,原點位于客戶區(qū)中心,x軸水平向右為正,y軸垂直向上為正,z軸指向屏幕內部,</p><p>  2>、建立三維用戶右手坐標系{O;x,y,z},原點O位于客戶區(qū)中心,x軸水平向右,y垂

14、直向上,z軸指向讀者。</p><p><b>  項目需求</b></p><p>  2.1、幾何構造的原理</p><p>  圓柱面采用平面四邊形小面逼近,需要根據(jù)周向相鄰2個小面的法矢量計算平均法矢量。對于索引號(i,j)的頂點,其相鄰頂點的索引號如圖所示。圖中箭頭所示為每個小面的邊矢量,倆個邊矢量的叉積得到小面的法矢量Ni。小面的平

15、均法矢量N的計算公式為N=</p><p><b>  2.2、動畫的設計</b></p><p><b>  實現(xiàn)動畫的函數(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)//設置定時器</p><p>  SetTimer(1,150,NULL);</p><p><b>  E

17、lse</b></p><p>  KillTimer(1);</p><p><b>  }</b></p><p><b>  設定動畫時間</b></p><p>  void CTestView::OnTimer(UINT nIDEvent)//動畫時間函數(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、紋理的設計</b></p><p>  2.3.1 紋理映射的原理</p>

20、<p>  使用MFC的資源標簽頁加載二維圖像紋理,DDB位圖的標識取為IDB_TEXTURE。將紋理讀入二維數(shù)組中,將紋理圖像綁定到圓柱面的側面網格頂點上。將圖像紋理的顏色值作為材質漫反射率和環(huán)境光反射率,鏡面反射光設置為白光,使用Phong明暗處理繪制光照紋理圓柱面。</p><p>  2.3.2 紋理的定義</p><p>  在CTestView類內添加成員函數(shù)Rea

21、dVertex(),將紋理綁定到圓柱面?zhèn)让娴捻旤c上,CT2類定義了紋理坐標的(u,v)。由于底面和頂面采用三角形網格逼近,所以使用CT2類定義了Texture4和Texture3紋理數(shù)組。圓柱的側面使用周向平均法矢量計算光照。填充底面頂面的三角形面片時,進行了特殊處理。然后添加ReadImage()讀入紋理。</p><p><b>  項目設計</b></p><p&g

22、t;  3.1、窗口設計以及各項功能的實現(xiàn)</p><p>  3.1.1窗口設計函數(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、點表函數(shù)</p><p>  void CMy123054212View::ReadVertex()//點表</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周向網格數(shù)</p><p>  N2=Round(h/cNum);//N2縱向網格數(shù)</p>

26、;<p>  V=new CP3[N1*(N2+1)+2];//頂點動態(tài)數(shù)組</p><p>  T=new CT2[N1*(N2+1)+2];//紋理動態(tài)數(shù)組</p><p>  N=new CVector[N1*(N2+1)+2];//法矢量動態(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>  //設置二維動態(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++)//構造底部三角形面片</p><p>&

33、lt;b>  {</b></p><p>  int tempj=j+1;</p><p>  if(N1==tempj) tempj=0;//面片的首尾連接</p><p>  int BottomIndex[3];//底部三角形面片索引號數(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++)//面片中頂點索引號</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++)//構造圓柱體四邊形面片</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];//圓柱體四邊形面片索引號數(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++)//構造頂部三角形面片</p><p><b>  {</b></p><p>  int tempj=j+1;</p><p>  if(N1==tempj) tempj=0;</p><p>  int TopIndex[3];//頂部三角形面片

40、索引號數(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;//申請內存</p><p>  zbuf-

43、>InitDeepBuffer(800,800,1000);//初始化深度緩沖器</p><p>  CPi3 Point3[3];//底面與頂面三角形頂點數(shù)組</p><p>  CT2 Texture3[3];//底面與頂面三角形紋理數(shù)組</p><p>  CVector Normal3[3];//底面與頂面三角形法矢量數(shù)組</p><

44、;p>  CPi3 Point4[4];//側面四邊形頂點數(shù)組</p><p>  CT2 Texture4[4];//側面四邊形紋理數(shù)組</p><p>  CVector Normal4[4];//側面四邊形法矢量數(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]]);//計算小面片法矢量</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;//對三角形面片進行特殊處理</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];//觀察坐標系三維坐標</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;//屏幕坐標系三維坐標</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);//調入DDB位圖</p><p>  NewBitmap.GetBitmap(&bmp);//將CBitmap的信息保存到Bitmap結構體

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ù)</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、動畫控制函數(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("開始");</p><p><b>  }</b></p><p><b&g

73、t;  }</b></p><p><b>  項目效果</b></p><p>  4.1構造圖形分析以及坐標系變換的效果</p><p><b>  項目總結</b></p><p>  本項目將一幅位圖映射到圓柱面上,并進行了光照計算。由于圓柱面?zhèn)让娴恼归_圖是長方形,如果取得圖像大

74、小為側面展開圖的大小,則圓柱面上的像素與圖像上的像素有一一對應關系。本項目在點表中進行圖像紋理綁定。對于單幅圖像映射,一般在點表中綁定;對于多幅圖像映射,一般在面表中綁定。側面四邊形頂點的法矢量取為周向2個表面的平均法矢量。圓柱面試閉合的二次曲面,這要求對圖像紋理閉合處進行特殊處理,處理方法見DrawObject()函數(shù)。</p><p><b>  六、參考文獻</b></p>

溫馨提示

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

評論

0/150

提交評論