opengl实验四讲解_第1页
opengl实验四讲解_第2页
opengl实验四讲解_第3页
opengl实验四讲解_第4页
opengl实验四讲解_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、学院姓名:专业 班学号教师评定:#i nclude #include #in elude #i nclude #in elude /将glaux.lib连接到工程/枚举鼠标变量#pragma comme nt(lib,glaux.lib) enumBUTTON_LEFT ,/ 鼠标左键;int mButt on = -1;int mOldY, mOldX;float z=0,c=0;float eye3 = 0.0f, 0.0f, 2.0f;/ 观察视角float rot3 = 45.0f, 45.0f, 0.0f; / 旋转变量const int GL_WIN_WIDTH = 800;窗口大

2、小const int GL_WIN_HEIGHT = 600;const int GL WIN INITIAL X = 0;const int GL_WINNITIAL_Y = 0;const int n = 1000,m=20;const float R = 1.2f,r=0.15f; 半径const float Pi = 3.1415926536f;GLuint g_TexturesArray7; 纹理指针int iMode=1;void ProcessMenu(int value)/ 弹出处理函数 iMode=value;glutPostRedisplay(); 强制刷新显示 void

3、CreatePopMenu()生成弹出式菜单函数 int nMainMenu;主菜单变量n Mai nMenu=glutCreateMe nu(ProcessMe nu);生成一个主菜单并指定菜单处理函数glutAddMenuEntry(填充,1);添加一个主菜单glutAddMenuEntry(轮廓,2);添加一个主菜单glutAttachMe nu(GLUT_RIGHT_BUTTON); 指定激活菜单的鼠标右键 bool LoadBMP(char *filename, GLuint &texture)/调贴图大小为 2 的幕AUX_RGBImageRec *pImage = NULL;pI

4、mage = auxDIBImageLoad(file name); /装入位图 if(pImage = NULL) return false; / 位图没装入返回错误 glGenTextures(1, &texture);/ 生成贴图(纹理)glBindTexture(GL_TEXTURE_2D,texture);捆绑贴图(纹理)gluBuild2DMipmaps(GL_TEXTURE_2D,4,建立图形plmage-sizeX,/ 图形宽 plmage-sizeXplmage-sizeY ,/ 图形高 plmage-sizeY ,GL_RGB, GL_UNSIGNED_BYTE, pIma

5、ge-data/ 图形数据);/释放位图数据占据的内存资源/返回成功free(pImage-data); free(pImage); return true; void Init()glE nable(GL_DEPTH_TEST);/ 开启深度缓冲glClearColor(0.0,0.0,0.0,1.0);glE nable(GL_TEXTURE_2D); / 启用二维文理/-载入图片LoadBMP(data/11.bmp,g_TexturesArray0);LoadBMP(data/12.bmp,g_TexturesArray1);LoadBMP(data/13.bmp,g_Textures

6、Array2);LoadBMP(data/14.bmp,g_TexturesArray3);LoadBMP(data/15.bmp,g_TexturesArray4);LoadBMP(data/16.bmp,g_TexturesArra y5);LoadBMP(data/17.bmp,g_TexturesArra y 6); void glutResize(int width, int height)/ 重置 OpenGL 窗口大小 glViewport(0, 0, width, height);/ 重置当前视口glMatrixMode(GL_PROJECTION);选择投影矩阵glLoadl

7、de ntity();/ 重置投影矩阵gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);/ 设置视口大小void glutDisplay(void)/ 显示函数glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);/ 表示物体的前向和后向面用填充面显示glPushMatrix(); 入栈glTra nslatef (-eye0, -eye1, -10);视口glBi ndTexture(GL_T

8、EXTURE_2D, g_TexturesArray0);/背景glBegi n(GL_QUADS);glTexCoord2f(1.0f, 0.0f);glVertex3f(8,-8,0);glTexCoord2f(1.0f, 1.0f);glVertex3f(8,8,0);glTexCoord2f(0.0f, 1.0f); glVertex3f(-8,8,0);glTexCoord2f(0.0f, 0.0f); glVertex3f(-8,-8,0); glE nd();glPopMatrix(); / 出栈glPushMatrix();入栈glTra nslatef (-eye0, -ey

9、e1, -eye2);glRotatef(rot0, 1.0f, 0.0f, 0.0f);glRotatef(rot1, 0.0f, 1.0f, 0.0f);glRotatef(rot2, 0.0f, 0.0f, 1.0f);/太阳if(iMode=1)GLUquadricObj * quadricl;建立一个曲面对象指针quadricl = gluNewQuadric();建立一个曲面对象指针gluQuadricTexture(quadric1,GLU_TRUE);/ 建立纹理坐标gluQuadricDrawStyle(quadric1,GLU_FILL);用面填充绘制场景glB in dT

10、exture(GL_TEXTURE_2D, g_TexturesArray1); 绑定纹理 gluSphere(quadric1,0.3f,64,64); 画一个填充太阳else if(iMode=2)glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glutWireSphere(0.3f,32,32); 画一个线条太阳glEnable(GL_TEXTURE_2D); 启用纹理/土星公转轨道glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glBegi n( GL_LINE_LO

11、OP);for(i nt j=0; j n; j+)glVertex3f(R*cos(2*Pi/n*j),0,R*si n(2*Pi/n*j);glE nd();glE nable(GL_TEXTURE_2D); 启用纹理/地球公转轨道glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glBegi n( GL_LINE_LOOP);for(j=0; j n; j+)glVertex3f(0.7*cos(2*Pi/n*j),0,0.7*si n(2*Pi/n*j);glE nd();glE nable(GL_TEXTURE_2D); 启用

12、纹理/ 土星glPushMatrix(); 入栈glRotatef(z, 0.0f, 1.0f, 0.0f);glTra nslatef (1.2, 0, 0);glPushMatrix();入栈glRotatef(c, 0.0f, 1.0f, 0.0f);glRotatef(90, 1.0f, 0.0f, 0.0f);if(iMode=1)GLUquadricObj * quadric2;/建立一个曲面对象指针quadric2 = gluNewQuadric();建立一个曲面对象指针gluQuadricTexture(quadric2,GLU_TRUE);建立纹理坐标gluQuadricDr

13、awStyle(quadric2,GLU_FILL);用面填充绘制场景glB in dTexture(GL_TEXTURE_2D, g_TexturesArray2);绑定纹理gluSphere(quadric2,0.12f,64,64); 画一个填充土星else if(iMode=2)glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glutWireSphere(0.12f,25,25); 画一个线条土星glEnable(GL_TEXTURE_2D); 启用纹理glPopMatrix(); / 出栈/土星一号卫星glPushMatri

14、x();/ 入栈glRotatef(c, O.Of, O.Of, 1.0f);gITra nslatef (0.25, 0, 0);if(iMode=1)GLUquadricObj * quadric3;/建立一个曲面对象指针quadric3 = gluNewQuadric();建立一个曲面对象指针gluQuadricTexture(quadric3,GLU_TRUE); / 建立纹理坐标 gluQuadricDrawStyle(quadric3,GLU_FILL);用面填充绘制场景glBi ndTexture(GL_TEXTURE_2D, g_TexturesArray3);绑定纹理gluS

15、phere(quadric3,0.03f,64,64); 画一个填充卫星else if(iMode=2)glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glutWireSphere(0.03f,25,25);/ 画一个线条卫星glEnable(GL_TEXTURE_2D); 启用纹理glPopMatrix();/ 出栈/土星一号卫星轨道glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glBegi n( GL_LINE_LOOP);for(j=0; j n; j+)glVert

16、ex3f(0.25*cos(2*Pi/n*j),0.25*si n(2*Pi/n*j),0);glE nd();glEnable(GL_TEXTURE_2D); / 启用纹理/ 土星二号卫星glPushMatrix(); / 入栈glRotatef(c, 1.0f, 0.0f, 0.0f);glTra nslatef (0, 0, 0.25);if(iMode=1)GLUquadricObj * quadric4;/建立一个曲面对象指针quadric4 = gluNewQuadric();建立一个曲面对象指针gluQuadricTexture(quadric4,GLU_TRUE); / 建立纹

17、理坐标 gluQuadricDrawStyle(quadric4,GLU_FILL);用面填充绘制场景glBi ndTexture(GL_TEXTURE_2D, g_TexturesArray4);绑定纹理gluSphere(quadric4,0.03f,64,64);/ 画一个填充卫星else if(iMode=2)glDisable(GL_TEXTURE_2D); 取消纹理glColor3f(1.0,1.0,1.0);glutWireSphere(0.03f,25,25); 画一个线条卫星glEnable(GL_TEXTURE_2D); 启用纹理glPopMatrix(); 出栈/土星二号

18、卫星轨道glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glBegi n( GL_LINE_LOOP);for(j=0; j n; j+)glVertex3f(0,0.25*cos(2*Pi/n*j),0.25*si n(2*Pi/n*j);glE nd();glE nable(GL_TEXTURE_2D); 启用纹理/ 土星的行星环glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);for(i nt i=0; im; i+) glBegi n(GL_LINE_LOOP);for

19、(i nt j=0; j n; j+) glVertex3f(r+i*0.004)*cos(2*Pi/n*j),0,( r+i*0.004)*si n(2*Pi/n*j); glE nd(); glEnable(GL_TEXTURE_2D); / 启用纹理 glPopMatrix();/ 出栈/地球glPushMatrix();/ 入栈glRotatef(z*2, 0.0f, 1.0f, 0.0f);glTra nslatef (0, 0, 0.7);glPushMatrix(); 入栈glRotatef(c, 0.0f, 1.0f, 0.0f);glRotatef(-90, 1.0f, 0.

20、0f, 0.0f);if(iMode=1)GLUquadricObj * quadric5; /建立一个曲面对象指针quadric5 = gluNewQuadric();建立一个曲面对象指针gluQuadricTexture(quadric5,GLU_TRUE); / 建立纹理坐标 gluQuadricDrawStyle(quadric5,GLU_FILL);用面填充绘制场景glBi ndTexture(GL_TEXTURE_2D, g_TexturesArray5);绑定纹理gluSphere(quadric5,0.1f,64,64); 画一个填充地球else if(iMode=2)glDi

21、sable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glutWireSphere(0.1f,25,25); 画一个线条地球glEnable(GL_TEXTURE_2D); 启用纹理glPopMatrix(); / 出栈/月亮glPushMatrix(); 入栈glRotatef(c, 1.0f, O.Of, 0.0f);glTra nslatef (0, 0, 0.15);if(iMode=1)GLUquadricObj * quadric6;/建立一个曲面对象指针quadric6 = gluNewQuadric();建立一个曲面对象指针gluQ

22、uadricTexture(quadric6,GLU_TRUE);/ 建立纹理坐标gluQuadricDrawStyle(quadric6,GLU_FILL);用面填充绘制场景glB in dTexture(GL_TEXTURE_2D, g_TexturesArray6);绑定纹理gluSphere(quadric6,0.025f,64,64); 画一个填充月亮else if(iMode=2)glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glutWireSphere(0.025f,25,25); 画一个线条月亮glEnable(GL

23、_TEXTURE_2D); 启用纹理glPopMatrix();/ 出栈/月亮轨道glDisable(GL_TEXTURE_2D); 取消纹理 glColor3f(1.0,1.0,1.0);glBegi n( GL_LINE_LOOP);for(j=0; j n; j+)glVertex3f(0,0.15*cos(2*Pi/n*j),0.15*si n(2*Pi/n*j);glE nd();glEnable(GL_TEXTURE_2D); / 启用纹理 glPopMatrix(); 出栈z+=0.05;c+=0.3;glPopMatrix(); 出栈glFlush();glutSwapBuffers(); void clamp(float *v)int i;for (i = 0; i 360 | vi -360) vi = 0;void glutMotion(int x, int y) / 图像移动函数if (mButton = BUTTON_LEFT)/按下左键时可以任意旋转图像rot0 -= (mOldY - y);rot1 -= (mOldX - x);clamp (rot);mOldX = x;mOldY = y;void glutMou

温馨提示

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

评论

0/150

提交评论