第二次实验三维显示_第1页
第二次实验三维显示_第2页
第二次实验三维显示_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二次实验:三维显示实验内容: 从提供两个文件中读取顶点信息与三角网格信息, 绘制出来, 同时完成交互的功 能。具体要求如下:(1) 从文件中读取顶点信息与三角网格信息(2) 将所有信息绘制到 (-2,-2,-1)-(2,2,1) 的区域,投影模式自己设定(3) 绘制时可选择线绘制(4) 绘制时可选择填充绘制,填充绘制时颜色过渡要平滑(5) 实现旋转功能,缩放功能,用鼠标左键或者键盘控制(6) 绘制时可选择自定义填充模式 1,显示为线型,用户选择预定义的颜色,对鼠标左键点 击到的网格进行填充(7) 绘制时可选择自定义填充模式 2,显示为线型,用户选择预定义的颜色,对鼠标左键选 择的区域内的三角

2、网格进行填充(8) 绘制时可选择纹理填充,将所给的纹理图像填充到显示图形上(9) 绘制时可选择显示坐标轴,可选择恢复为初始状态(10) 上边的选择使用 OpenGL菜单附:1.两个文件分别是 point.txt 和 triangle.txt ,其中, point.txt 记录了点的坐标, triangle.txt 记录 了三角网格的顶点的索引号,两个文件的格式如下:Point.txtN / 总点数X1 y1 z1 /第一个点的坐标Xn yn zn / 第 n 个点的坐标Triangle.txtM / 总三角网格数P11 p12 p13 / 第一个三角网格的顶点索引,以 point.txt 中点

3、的排列为依据,从 0 开始Pm1 pm2 pm3 /第 m 个三角网格的顶点索引 可能用到的函数: 三维观察函数 (观察 &投影): P316-320 拾取函数 : P550-554 菜单函数 : P555-560显示字符 : glRasterPos*指定位置, glutBitmapCharacter(font,char) 显示字符 投影&反投影 :gluProject(double x,double y,double z,double *modelmatrix,double *projectmatrix,int *viewport,double *winx,double *w

4、iny,double *winz)计算空间的点 (x,y,z)在屏幕上的位置 (winx,winy,winz)gluUnProject(double winx,double winy,double winz, double *modelmatrix,double *projectmatrix,int *viewport,double *objx,double *objy,double *objz) 计算屏幕上的点 (winx,winy,winz) 在空间中的位置 (objx,objy,objz) gluProject 中得到的 winz ,离屏幕越近,值越大。获取矩阵 :glGetDouble

5、v(mode,double *matrix) , mode 可 选 择 GL_PROJECTION_MATRIX 或 GL_MODELVIEW_MATRIX,分别得到投影矩阵和模型矩阵glGetIntegerv(mode,int *matrix) , mode 可选择 GL_VIEWPORT,得到视口矩阵 上边得到的矩阵可以用于计算投影&反投影。纹理函数 : P520-521加载纹理可以通过 glaux 来使用:_AUX_RGBImageRec *auImage = auxDIBImageLoadA("texture.bmp"); gluBuild2DMipmaps

6、(GL_TEXTURE_2D,3,auImage->sizeX,auImage->size,YGL_RGB,GL_UNSIGNED_ BYTE,auImage->data);delete auImage;子窗口 :创建子窗口 :iSubWinID = glutCreateSubWindow ( iMainWinID ,x,y,width,height);其中 ,iMainWinID 是母窗口的 ID,可由 iMainWinID = glutCreateWindow ( "Demo2"); 获得 每个窗口有独立的状态 , 在设置状态时 , 可以用 glutS

7、etWindow ( iSubWinID ); 设置为当前窗口 , 然后设置 . 创 建完窗口时 , 当前窗口会自动设定为刚创建好的窗口 .鼠标移动函数 : glutPassiveMotionFunc(func); 鼠标移动时自动调用 func(int cx,int cy) glutMotionFunc(func); 鼠标有按键触发状态并移动时自动调用 func(int cx,int cy) 关于旋转 :三维旋转时可以采用以下方法 :由屏幕位置获取三维坐标 , 共两个坐标 , 形成两个由原点发出的向量 .利用向量叉乘的方法可以得到旋转轴 , 得用向量点乘可以计算得到两向量的夹角 . 根据旋转轴

8、及夹角对旋转的参数进行调整 .关于颜色平滑过渡 :颜色根据 Z 值的数值大小 , 从(0,0,1) (0,1,1) (0,1,0) (1,1,0) (1,0,0) 可以实现 Demo中的颜色平 滑.其余:/ 设置及载入纹理GLuint uiTexture ; / 纹理glPixelStorei ( GL_UNPACK_ALIGNME,1N);TglGenTextures (1,& uiTexture );glBindTexture ( GL_TEXTURE_2, DuiTexture );_AUX_RGBImageR e*cauImage = auxDIBImageLoadA( &qu

9、ot;texture.bmp" );if (! auImage)return false ;gluBuild2DMipmaps ( GL_TEXTURE_,23D, auImage->sizeX , auImage->sizeY , GL_RG,BGL_UNSIGNED_BY,TaEuImage->data ); delete auImage;主函数 :int main( int argc , char * argv )glutInit (&argc , argv );glutInitDisplayMode ( GLUT_DOUB L| E GLUT_RG)

10、;B glutInitWindowSize ( iWinWidth , iWinHeight );/ 主窗口信息iMainWinID = glutCreateWindow ( "Demo2"); if (! MyInit ()/ 自定义 OpenGL初始化函数return 1;glutDisplayFunc ( MyDisplay );/ 显示glutReshapeFunc ( MyReshape);/ 窗口改变glutMouseFunc( MyMous)e;/ 鼠标点击glutMotionFunc ( MyMotion);/ 鼠标移动/ 子窗口信息iSubWinID =

11、glutCreateSubWindow ( iMainWinID ,0, iWinHeight * 3 / 4, iWinWidth / 4, iWinHeight / 4); MySubInit (); / 子窗口自定义初始化函数glutDisplayFunc ( MySubDisplay); / 子窗口显示回调函数glutMouseFunc( MySubMous)e; / 子窗口鼠标点击函数glutPassiveMotionFunc ( MySubMotion); / 子窗口鼠标移动函数glutMainLoop ();return 0;窗口改变函数 :void MyReshape( GLint cx , GLint cy) / 窗口变化函数 iWinWidth = cx; iWinHeight = cy;/ 修改主窗口相关状态 glutSetWindow ( iMainWinID );glViewport (0,0, iWinWidth , iWinHeight );/ 修

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论