版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、地形模型的三维可视化程序设计一、题目请用OpenGL图形库,编制程序实现地形模型的三维可视化,并进行地形模型的纹理设置,并可以通过键盘进行交互操作(移动和旋转)。 (注:给定的地形模型数据是已经建好的不规则三角网。)二、提交资料 1程序的详细步骤和所有相关数据;步骤:录入三角形数据获得地形的范围绘制三角网设置纹理坐标计算参考点的位置移动相关数据文件:数据文件DHS.dat三角网文件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);/点结构定义typedef struct long id; double x; double y; double z;POINTXYZ;/三角形结构定义typedef structlong id;/三角形号long p3;/三角形三个顶点的序号long xl3;/拓扑关系TRIANGLE;/顶点变量POINTXYZ *pP
3、t;/三角形变量TRIANGLE *pTri;/顶点总数int iTotalNum;/三角形总数int iTotalTriNum;/外围结构typedef struct vrtagBOXdouble minx;double miny;double minz;double maxx;double maxy;double maxz;vrBOX;/外围结构vrBOX _box;unsigned int m_nID;/存储纹理的索引号int m_nWidth;/纹理图片的宽度int m_nHeight;/纹理图片的高度float (*_ptexture)2;/存储三角网的纹理数据/视点参考点的偏移量d
4、ouble lookx, looky, lookz;/移动的速度float _speed;/垂直方向视点和所要看实体的间的距离float _height;/视点的位置double _eyeposition3;/参考点的位置double _referencepoint3;/鼠标位移与象素之比的分母,即象素数int _Pixels;/设置纹理坐标void SetTextureCoord();/读取纹理数据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);/读取点坐标、三角形数据void ReadData();void Render();/获得外围void SetBOX();void CALLBACK myReshape(GLsizei w, GLsizei h);void CALLBACK display(void);/读取纹理数据bool LoadTriangleBMP(char* szFileName)AUX_RGB
6、ImageRec *pBitmap = NULL;if(!szFileName) return false;/装载数据并存储pBitmap = auxDIBImageLoad(szFileName);if(pBitmap = NULL) return false;glGenTextures(1, &m_nID);/ 绑定纹理到纹理数组,并进行初始化。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)/* 设置双缓存和RGBA颜色模式*/ auxInitDisplayMode (AUX_DOUBLE|AUX_RGBA); auxInitPosition (0, 0, 1600, 800); auxInitWindow (作业); 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);/读取点坐标、三角形数据void ReadData()ifstream ifile(f:qqDHS.dat);ifile iTotalNum;pPt =new POINTXYZiTotalNum;/循环读入定顶点坐标数据;for (int i=0;ipPti.id pPti.x pPti.y pPti.z;ifile.close();ifstream ifile2(f:qqDHS.tri);ifile2 iTotalTriNum;pTri =new TRIANGLEiTotalTriNum;/循环读入定顶点坐
11、标数据;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 = -;/对所有的顶点循环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)/读取点坐标、三角形数据 ReadData();char *_bmpfilename; /纹理图片的文件名_bmpfilename=f:qqTERRAIN.BMP; /terrain.bmp; /suban_1.bmp;/读取纹理数据LoadTriangleBMP(_bmpfilename);/
13、计算纹理坐标SetTextureCoord();/设置视点的一些初始参数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(); /功 能:绘制三角网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); /设置纹理坐标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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 33644-2025数控板料折弯机精度
- 2025年鄂尔多斯辅警协警招聘考试真题带答案详解
- 2025年玉溪辅警招聘考试真题含答案详解
- 2025年阿克苏辅警协警招聘考试备考题库及答案详解(真题汇编)
- 2025年长治辅警协警招聘考试真题及答案详解(夺冠系列)
- 2025年金华辅警招聘考试题库及答案详解(夺冠系列)
- 2025年贵州辅警协警招聘考试备考题库含答案详解
- 2025年阳江辅警协警招聘考试真题及完整答案详解
- 2025年赤峰辅警协警招聘考试真题及答案详解参考
- 2025年铁岭辅警协警招聘考试真题含答案详解(培优a卷)
- 中国肿瘤药物相关血小板减少诊疗专家共识(2023版)
- 人血清白蛋白-透明质酸纳米颗粒:制备工艺、特性表征与抗肿瘤效能探究
- 超声技术在生物医学工程中的应用
- 医疗机构内部管理规章制度范本范文
- (高清版)DB62∕T 3262-2024 装配整体式叠合混凝土结构技术标准
- 人工智能在口腔颌面影像学中的应用研究-洞察阐释
- 小学科学家长会课件
- 锂电池生产中的潜在安全风险及其控制措施
- 《中国在全球治理体系中的地位》课件
- 长城汽车公司管理制度
- GB/T 24477-2025适用于残障人员的电梯附加要求
评论
0/150
提交评论