opengl实验四【太阳系】_第1页
opengl实验四【太阳系】_第2页
opengl实验四【太阳系】_第3页
opengl实验四【太阳系】_第4页
opengl实验四【太阳系】_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

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

文档简介

1、实用标准/将glaux.lib连接到工程/枚举鼠标变量/观察视角旋转变量/窗口大小废才N4/多学院 专业 班学号姓名:教师评定:#include <stdlib.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h>#include <math.h>#pragma comment(lib,"glaux.lib") enumBUTTON_LEFT , 鼠标左键;int mButton = -1;int mOldY, mOldX;float z=0,c

2、=0;float eye3 = 0.0f, 0.0f, 2.0f;float rot3 = 45.0f, 45.0f, 0.0f; /const int GL_WIN_WIDTH = 800;const int GL_WIN_HEIGHT = 600;const int GL_WIN_INITIAL_X = 0;文档const int GL_WIN_INITIAL_Y = 0;const int n = 1000,m=20;const float R = 1.2f,r=0.15f;/ 半径const float Pi = 3.1415926536f;GLuint g_TexturesArray

3、7;/ 纹理指针 int iMode=1;void ProcessMenu(int value)/ 弹出处理函数iMode=value;glutPostRedisplay();/ 强制刷新显示void CreatePopMenu()/ 生成弹出式菜单函数int nMainMenu;/ 主菜单变量生成一个主菜单并指定nMainMenu=glutCreateMenu(ProcessMenu);/菜单处理函数glutAddMenuEntry(" 填充 ",1);/ 添加一个主菜单glutAddMenuEntry(" 轮廓 ",2);/ 添加一个主菜单glutA

4、ttachMenu(GLUT_RIGHT_BUTTON);/ 指定激活菜单的鼠标右键bool LoadBMP(char *filename, GLuint &texture)/ 调贴图大小为 2 的幂AUX_RGBImageRec *pImage = NULL;pImage = auxDIBImageLoad(filename); / 装入位图if(pImage = NULL) return false; / 位图没装入返回错误glGenTextures(1, &texture);/ 生成贴图(纹理 )glBindT exture (GL_TEXTURE_2D,texture)

5、;/ 捆绑贴图(纹理 )gluBuild2DMipmaps(GL_TEXTURE_2D,4, / 建立图形pImage->sizeX,/ 图形宽pImage->sizeXpImage->sizeY,/ 图形高pImage->sizeY,GL_RGB, GL_UNSIGNED_BYTE,pImage->data/ 图形数据);free(pImage->data);/ 释放位图数据占据的内存资源free(pImage);return true;/ 返回成功void Init()glEnable(GL_DEPTH_TEST); / 开启深度缓冲glClearCol

6、or(0.0,0.0,0.0,1.0);glEnable(GL_TEXTURE_2D); / 启用二维文理/ 载入图片 LoadBMP("data/11.bmp",g_TexturesArray0);LoadBMP("data/12.bmp",g_TexturesArray1);LoadBMP("data/13.bmp",g_TexturesArray2);LoadBMP("data/14.bmp",g_TexturesArray3);LoadBMP("data/15.bmp",g_Textur

7、esArray4);LoadBMP("data/16.bmp",g_TexturesArray5);LoadBMP("data/17.bmp",g_TexturesArray6);void glutResize(int width, int height)/ 重置 OpenGL 窗口大小glViewport(0, 0, width, height); / 重置当前视口/ 重置投影矩阵/ 选择投影矩阵glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0, (float)width/

8、(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(); / 入栈glTranslatef (-eye0, -eye1, -10);/ 视口glBindT exture(GL_TEXTURE_2D, g_TexturesArray0);glBegin(GL_QUADS);g

9、lTexCoord2f(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);glEnd();glPopMatrix(); / 出栈glPushMatrix(); / 入栈glTranslatef (-eye0, -eye1, -eye2);glRotatef(rot0, 1.0f, 0.0f, 0.0f);glRotat

10、ef(rot1, 0.0f, 1.0f, 0.0f);glRotatef(rot2, 0.0f, 0.0f, 1.0f);/ 太阳 if(iMode=1)GLUquadricObj * quadric1; / 建立一个曲面对象指针quadric1 = gluNewQuadric();/ 建立一个曲面对象指针gluQuadricTexture(quadric1,GLU_TRUE);/ 建立纹理坐标gluQuadricDrawStyle(quadric1,GLU_FILL); / 用面填充绘制场景glBindT exture(GL_TEXTURE_2D, g_TexturesArray1);/ 绑

11、定纹理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);glBegin(GL_LINE_LOOP);for(int j=0; j<n; j+)glVertex3f(R*

12、cos(2*Pi/n*j),0,R*sin(2*Pi/n*j);glEnd();glEnable(GL_TEXTURE_2D);/ 启用纹理/ 地球公转轨道glDisable(GL_TEXTURE_2D);/ 取消纹理glColor3f(1.0,1.0,1.0);glBegin(GL_LINE_LOOP);for(j=0; j<n; j+)glVertex3f(0.7*cos(2*Pi/n*j),0,0.7*sin(2*Pi/n*j);glEnd();glEnable(GL_TEXTURE_2D);/ 启用纹理/ 土星 glPushMatrix();/ 入栈glRotatef(z, 0.

13、0f, 1.0f, 0.0f);glTranslatef (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);/ 建立纹理坐标gluQuadricDrawStyle(quadric2,GLU_FILL); / 用

14、面填充绘制场景glBindT exture(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(); / 出栈/ 土星一号卫星glPushMatrix();/ 入栈glRotatef(c, 0.

15、0f, 0.0f, 1.0f);glTranslatef (0.25, 0, 0);if(iMode=1)GLUquadricObj * quadric3; / 建立一个曲面对象指针quadric3 = gluNewQuadric();/ 建立一个曲面对象指针gluQuadricTexture(quadric3,GLU_TRUE);/ 建立纹理坐标gluQuadricDrawStyle(quadric3,GLU_FILL); / 用面填充绘制场景glBindT exture(GL_TEXTURE_2D, g_TexturesArray3);/ 绑定纹理gluSphere(quadric3,0.

16、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);glBegin(GL_LINE_LOOP);for(j=0; j<n; j+)glVertex3f(0.25*cos

17、(2*Pi/n*j),0.25*sin(2*Pi/n*j),0);glEnd();glEnable(GL_TEXTURE_2D); / 启用纹理/ 土星二号卫星 glPushMatrix(); / 入栈glRotatef(c, 1.0f, 0.0f, 0.0f);glTranslatef (0, 0, 0.25);if(iMode=1)GLUquadricObj * quadric4; / 建立一个曲面对象指针quadric4 = gluNewQuadric();/ 建立一个曲面对象指针gluQuadricTexture(quadric4,GLU_TRUE);/ 建立纹理坐标gluQuadri

18、cDrawStyle(quadric4,GLU_FILL); / 用面填充绘制场景glBindT exture(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();/ 出栈/ 土星二号卫星轨

19、道glDisable(GL_TEXTURE_2D);/ 取消纹理glColor3f(1.0,1.0,1.0);glBegin(GL_LINE_LOOP);for(j=0; j<n; j+)glVertex3f(0,0.25*cos(2*Pi/n*j),0.25*sin(2*Pi/n*j);glEnd();glEnable(GL_TEXTURE_2D);/ 启用纹理/ 土星的行星环glDisable(GL_TEXTURE_2D);/ 取消纹理glColor3f(1.0,1.0,1.0);for(int i=0; i<m; i+) glBegin(GL_LINE_LOOP);for(i

20、nt j=0; j<n; j+)glVertex3f(r+i*0.004)*cos(2*Pi/n*j),0,(r+i*0.004)*sin(2*Pi/n*j);glEnd(); glEnable(GL_TEXTURE_2D); / 启用纹理glPopMatrix();/ 出栈/ 地球 glPushMatrix();/ 入栈glRotatef(z*2, 0.0f, 1.0f, 0.0f);glTranslatef (0, 0, 0.7);glPushMatrix(); / 入栈glRotatef(c, 0.0f, 1.0f, 0.0f);glRotatef(-90, 1.0f, 0.0f,

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

22、glDisable(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, 0.0f, 0.0f);glTranslatef (0, 0, 0.15);if(iMode=1)GLUquadricObj * quadric6; / 建立一个曲面对象指针quadric6 = gluNewQuadric();/ 建立

23、一个曲面对象指针gluQuadricTexture(quadric6,GLU_TRUE);/ 建立纹理坐标gluQuadricDrawStyle(quadric6,GLU_FILL); / 用面填充绘制场景glBindT exture(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);/

24、画一个线条月亮glEnable(GL_TEXTURE_2D);/ 启用纹理glPopMatrix();/ 出栈/ 月亮轨道 glDisable(GL_TEXTURE_2D);/ 取消纹理glColor3f(1.0,1.0,1.0);glBegin(GL_LINE_LOOP);for(j=0; j<n; j+)glVertex3f(0,0.15*cos(2*Pi/n*j),0.15*sin(2*Pi/n*j);glEnd();glEnable(GL_TEXTURE_2D); / 启用纹理glPopMatrix();/ 出栈z+=0.05;c+=0.3;glPopMatrix();/ 出栈glFlush();glutSwapBuffers(); void clamp(float *v)int i;for (i = 0; i < 3; i +)/ 图像旋转一周后回到原地if (vi > 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 glut

温馨提示

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

最新文档

评论

0/150

提交评论