《地形模型的三維可視化》程序設(shè)計_第1頁
《地形模型的三維可視化》程序設(shè)計_第2頁
《地形模型的三維可視化》程序設(shè)計_第3頁
《地形模型的三維可視化》程序設(shè)計_第4頁
《地形模型的三維可視化》程序設(shè)計_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、地形模型的三維可視化程序設(shè)計一、題目請用OpenGL圖形庫,編制程序?qū)崿F(xiàn)地形模型的三維可視化,并進行地形模型的紋理設(shè)置,并可以通過鍵盤進行交互操作(移動和旋轉(zhuǎn))。 (注:給定的地形模型數(shù)據(jù)是已經(jīng)建好的不規(guī)則三角網(wǎng)。)二、提交資料 1程序的詳細步驟和所有相關(guān)數(shù)據(jù);步驟:錄入三角形數(shù)據(jù)獲得地形的范圍繪制三角網(wǎng)設(shè)置紋理坐標計算參考點的位置移動相關(guān)數(shù)據(jù)文件:數(shù)據(jù)文件DHS.dat三角網(wǎng)文件DHS.tri圖片文件 TERRAIN.BMP2. 程序清單(包括程序說明);#include stdafx.h#include #include #include #include #include #includ

2、e void CALLBACK elbowAdd (void);void CALLBACK elbowSubtract (void);void CALLBACK shoulderAdd (void);void CALLBACK shoulderSubtract (void);/點結(jié)構(gòu)定義typedef struct long id; double x; double y; double z;POINTXYZ;/三角形結(jié)構(gòu)定義typedef structlong id;/三角形號long p3;/三角形三個頂點的序號long xl3;/拓撲關(guān)系TRIANGLE;/頂點變量POINTXYZ *pP

3、t;/三角形變量TRIANGLE *pTri;/頂點總數(shù)int iTotalNum;/三角形總數(shù)int iTotalTriNum;/外圍結(jié)構(gòu)typedef struct vrtagBOXdouble minx;double miny;double minz;double maxx;double maxy;double maxz;vrBOX;/外圍結(jié)構(gòu)vrBOX _box;unsigned int m_nID;/存儲紋理的索引號int m_nWidth;/紋理圖片的寬度int m_nHeight;/紋理圖片的高度float (*_ptexture)2;/存儲三角網(wǎng)的紋理數(shù)據(jù)/視點參考點的偏移量d

4、ouble lookx, looky, lookz;/移動的速度float _speed;/垂直方向視點和所要看實體的間的距離float _height;/視點的位置double _eyeposition3;/參考點的位置double _referencepoint3;/鼠標位移與象素之比的分母,即象素數(shù)int _Pixels;/設(shè)置紋理坐標void SetTextureCoord();/讀取紋理數(shù)據(jù)bool LoadTriangleBMP( LPSTR szFileNameD);/向前移動void Move(bool is_forward);/獲得鼠標在x,y方向的相對位移量bool Rot

5、ate(int dx, int dy);/計算視點與參考點的位置void _CalcuEyePositionAndReferencePoint(int type,float amount);void myinit(void);/讀取點坐標、三角形數(shù)據(jù)void ReadData();void Render();/獲得外圍void SetBOX();void CALLBACK myReshape(GLsizei w, GLsizei h);void CALLBACK display(void);/讀取紋理數(shù)據(jù)bool LoadTriangleBMP(char* szFileName)AUX_RGB

6、ImageRec *pBitmap = NULL;if(!szFileName) return false;/裝載數(shù)據(jù)并存儲pBitmap = auxDIBImageLoad(szFileName);if(pBitmap = NULL) return false;glGenTextures(1, &m_nID);/ 綁定紋理到紋理數(shù)組,并進行初始化。glBindTexture(GL_TEXTURE_2D, m_nID);/控制紋理,映射到片元(fragment)時怎樣對待紋理。glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT

7、);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);/定義二維紋理glTexImage2D(GL_TEXTURE_2D, 0, 3, pBitmap-sizeX, pBitmap-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, pBitmap

8、-data);m_nWidth = pBitmap-sizeX;m_nHeight = pBitmap-sizeY;if (pBitmap)delete pBitmap;return true;int main(int argc, char* argv)/* 設(shè)置雙緩存和RGBA顏色模式*/ auxInitDisplayMode (AUX_DOUBLE|AUX_RGBA); auxInitPosition (0, 0, 1600, 800); auxInitWindow (作業(yè)); myinit(); auxReshapeFunc (myReshape); auxKeyFunc (AUX_LE

9、FT, shoulderSubtract); auxKeyFunc (AUX_RIGHT, shoulderAdd); auxKeyFunc (AUX_UP, elbowAdd); auxKeyFunc (AUX_DOWN, elbowSubtract); auxMainLoop(display);return 0;void CALLBACK elbowAdd (void) Move(true);void CALLBACK elbowSubtract (void) Move(false);void CALLBACK shoulderAdd (void)Rotate(50,0);void CAL

10、LBACK shoulderSubtract (void)Rotate(-50,0);/讀取點坐標、三角形數(shù)據(jù)void ReadData()ifstream ifile(f:qqDHS.dat);ifile iTotalNum;pPt =new POINTXYZiTotalNum;/循環(huán)讀入定頂點坐標數(shù)據(jù);for (int i=0;ipPti.id pPti.x pPti.y pPti.z;ifile.close();ifstream ifile2(f:qqDHS.tri);ifile2 iTotalTriNum;pTri =new TRIANGLEiTotalTriNum;/循環(huán)讀入定頂點坐

11、標數(shù)據(jù);for ( i=0;ipTrii.id pTrii.p0 pTrii.p1 pTrii.p2;ifile2.close();SetBOX();/功 能:獲得地形的范圍void SetBOX()_box.minx = ;_box.miny = ;_box.minz = ;_box.maxx = -;_box.maxy = -;_box.maxz = -;/對所有的頂點循環(huán)for (int i = 0; i pPti.x) _box.minx = pPti.x;if(_box.miny pPti.y) _box.miny = pPti.y;if(_box.minz pPti.z) _box

12、.minz = pPti.z;if(_box.maxx pPti.x) _box.maxx = pPti.x;if(_box.maxy pPti.y) _box.maxy = pPti.y;if(_box.maxz pPti.z) _box.maxz = pPti.z;void myinit(void)/讀取點坐標、三角形數(shù)據(jù) ReadData();char *_bmpfilename; /紋理圖片的文件名_bmpfilename=f:qqTERRAIN.BMP; /terrain.bmp; /suban_1.bmp;/讀取紋理數(shù)據(jù)LoadTriangleBMP(_bmpfilename);/

13、計算紋理坐標SetTextureCoord();/設(shè)置視點的一些初始參數(shù)lookx = 5.0f;looky = 0.0f;lookz = 0.0f;_Pixels= 3000;_height=2.50;_speed= 5.0f; _eyeposition0 = _box.minx -300; _eyeposition1 = _box.miny -300; _eyeposition2 = _box.maxz+50; _referencepoint0 = _box.maxx;_referencepoint1 = _box.maxy;_referencepoint2 = _box.minz;voi

14、d CALLBACK myReshape(GLsizei w, GLsizei h) glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 90000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();void CALLBACK display(void)glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUF

15、FER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();/投影變換gluLookAt(_eyeposition0 , _eyeposition1 , _eyeposition2,_referencepoint0, _referencepoint1 , _referencepoint2, 0,0,1); glPushMatrix(); glTranslated (_box.maxx+300 ,_box.maxy+100 , _box.maxz+300); glColor3f (1.0, 0.0, 0.0); auxSolidSphere (50.0); gl

16、PopMatrix (); GLfloat mat_ambient= 1.0, 1.0, 1.0, 1.0 ; GLfloat mat_diffuse= 1.0, 1.0, 1.0, 1.0 ; GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0 ; GLfloat mat_shininess = 50.0 ; GLfloat light0_diffuse= 1.0, 1.0, 1.0, 1.0;/定義光源的位置 GLfloat light0_position = _box.maxx,_box.maxy, _box.maxz-800, 1.0 ; GLfloat

17、 light1_ambient= 1.0, 0.0,0.0, 1.0 ; GLfloat light1_diffuse= 1.0, 0.0, 0.0, 1.0 ; GLfloat light1_specular = 1.0, 0.0, 0.0, 1.0 ; GLfloat light1_position = (_box.minx +_box.maxx)/2.0 ,(_box.miny +_box.maxy)/2.0 , _box.maxz+500, 1.0 ; GLfloat spot_direction = 0.0, 0.0, -1.0 ; glMaterialfv(GL_FRONT, GL

18、_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0, GL_AMBIENT, light0_diffuse);glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);glLightfv(GL_LIGHT0, GL_POS

19、ITION,light0_position);glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);glLightfv(GL_LIGHT1, GL_SPECULAR,light1_specular);glLightfv(GL_LIGHT1, GL_POSITION,light1_position);glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 10.0);glLightfv(GL_LIGHT1, GL_SPOT_DIRECTI

20、ON,spot_direction); glEnable(GL_LIGHT0);/ glEnable(GL_LIGHT1); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST);/啟動光照 glEnable(GL_LIGHTING);/繪制地面模型Render();glDisable(GL_LIGHTING); glPopMatrix(); glFlush();auxSwapBuffers(); /功 能:繪制三角網(wǎng)void Render()glBindTexture(GL_TEXTURE_2D, m_nID); glEnable(GL_TEXTURE_

21、2D); /畫三角形線面glBegin(GL_POLYGON); /GL_LINE_LOOP);/for( int i = 0; i iTotalTriNum; i+)glTexCoord2f(_ptexturepTrii.p00, _ptexturepTrii.p01 );glVertex3f(pPtpTrii.p0.x, pPtpTrii.p0.y, pPtpTrii.p0.z);glTexCoord2f(_ptexturepTrii.p10, _ptexturepTrii.p11 );glVertex3f(pPtpTrii.p1.x, pPtpTrii.p1.y, pPtpTrii.p1

22、.z);glTexCoord2f(_ptexturepTrii.p20, _ptexturepTrii.p21 );glVertex3f(pPtpTrii.p2.x, pPtpTrii.p2.y, pPtpTrii.p2.z);glEnd();glDisable(GL_TEXTURE_2D); /設(shè)置紋理坐標void SetTextureCoord()_ptexture = new floatiTotalNum2;float _min_max = fabs(_box.maxx -_box.minx);float _min_maxy = fabs(_box.maxy-_box.miny);for (int i = 0; i iTotalNum; i+)_ptexturei0 = (pPti.x-_box.minx)/_min_max;_ptexturei1 = (pPti.y-_box.miny)/_min_maxy;/計算視點的位置和參考點的位置void _CalcuEyePositionAndReferencePoint(int type,float amount)flo

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論