700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > OPENGL 太阳系

OPENGL 太阳系

时间:2019-03-20 09:27:52

相关推荐

OPENGL 太阳系

用OPENGL实现太阳系

想要实现的功能:太阳系围绕太阳运转,以太阳,八大行星和月球形成大致的体系结构。

实现八大行星围绕太阳转。实现地月系统。添加行星轨道。添加纹理图像。用键盘控制太阳系,使我们可以从不同方位细致的观察到太阳系。

由于注释写的比较清楚,我在这里直接贴代码。

loadTexture.h

#ifndef LOADTEXTURE#define LOADTEXTURE// 纹理图像结构typedef struct{int imgWidth;// 纹理宽度int imgHeight;// 纹理高度unsigned char byteCount;// 每个象素对应的字节数,3:24位图,4:带alpha通道的24位图unsigned char *data;// 纹理数据}TEXTUREIMAGE;// BMP文件头#pragma pack(2)typedef struct {unsigned shortbfType;// 文件类型unsigned long bfSize;// 文件大小unsigned shortbfReserved1;// 保留位unsigned shortbfReserved2;// 保留位unsigned longbfOffBits;// 数据偏移位置}BMPFILEHEADER;#pragma pack()// BMP信息头typedef struct {unsigned longbiSize;// 此结构大小longbiWidth;// 图像宽度longbiHeight;// 图像高度unsigned shortbiPlanes;// 调色板数量unsigned shortbiBitCount;// 每个象素对应的位数,24:24位图,32:带alpha通道的24位图unsigned longbiCompression;// 压缩unsigned longbiSizeImage;// 图像大小longbiXPelsPerMeter;// 横向分辨率longbiYPelsPerMeter;// 纵向分辨率unsigned longbiClrUsed;// 颜色使用数unsigned longbiClrImportant;// 重要颜色数}BMPINFOHEADER;//载入BMP位图文件void LoadBmp(char *filename, TEXTUREIMAGE *textureImg);//生成纹理void MakeTexture(TEXTUREIMAGE textureImg, GLuint * texName);#endif

loadTexture.cpp

#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <string.h>#include <GL/glut.h>#include "loadTexture.h"void LoadBmp(char *filename, TEXTUREIMAGE *textureImg) // 载入图片{int i, j;FILE *file;BMPFILEHEADER bmpFile;BMPINFOHEADER bmpInfo;int pixel_size;// 初始化纹理数据textureImg->imgWidth = 0;textureImg->imgHeight = 0;if (textureImg->data != NULL){delete []textureImg->data;}// 打开文件file = fopen(filename, "rb");if (file == NULL){return;}// 获取文件头rewind(file);fread(&bmpFile, sizeof(BMPFILEHEADER), 1, file);fread(&bmpInfo, sizeof(BMPINFOHEADER), 1, file);// 验证文件类型if (bmpFile.bfType != 0x4D42){return;}// 获取图像色彩数pixel_size = bmpInfo.biBitCount >> 3;// 读取文件数据textureImg->data = new unsigned char[bmpInfo.biWidth * bmpInfo.biHeight * pixel_size];for(i = 0 ; i < bmpInfo.biHeight; i++){fseek(file, bmpFile.bfOffBits + (bmpInfo.biHeight - i - 1) * bmpInfo.biWidth * pixel_size, SEEK_SET);for (j = 0; j < bmpInfo.biWidth; j++){// 红色分量fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 2, sizeof(unsigned char), 1, file);// 绿色分量fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 1, sizeof(unsigned char), 1, file);// 蓝色分量fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 0, sizeof(unsigned char), 1, file);// Alpha分量if (pixel_size == 4){fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 3, sizeof(unsigned char), 1, file);}}}// 记录图像相关参数textureImg->imgWidth = bmpInfo.biWidth;textureImg->imgHeight = bmpInfo.biHeight;textureImg->byteCount = pixel_size;fclose(file);}void MakeTexture(TEXTUREIMAGE textureImg, GLuint * texName) //转换为纹理{glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glGenTextures(1,texName);glBindTexture(GL_TEXTURE_2D , *texName);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureImg.imgWidth,textureImg.imgHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, textureImg.data);}

main.cpp

#include <windows.h>#include <GL/glut.h>#include <math.h>#include "loadTexture.h"// 定义窗口的标题、宽度、高度、全屏布尔变量#define WIN_TITLE "模拟太阳系"const int WIN_WIDTH = 800;const int WIN_HEIGHT = 600;BOOL isFullScreen = FALSE; // 初始不为全屏#define DEG_TO_RAD 0.017453float angle=0.0;static GLdouble viewer[]= {0,0,0,0,0,-5,0,0.1,0}; // 初始化视角GLUquadricObj *quadric; // 建立二次曲面对象GLfloat angle_Z; // 星空旋转角度bool g_bOrbitOn = true; // 控制转动暂停float g_fSpeedmodifier = 1.0f;// 时间控制float g_fElpasedTime;double g_dCurrentTime;double g_dLastTime;GLfloat LightAmbient[] = { 1.0f, 1.0f, 1.0f, 0.0f }; // 环境光参数GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 0.0f }; // 漫射光参数GLfloat LightPosition[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // 光源的位置// 纹理图象TEXTUREIMAGE skyImg;TEXTUREIMAGE sunImg;TEXTUREIMAGE rayImg;TEXTUREIMAGE mercuImg;TEXTUREIMAGE venusImg;TEXTUREIMAGE earthImg;TEXTUREIMAGE marsImg;TEXTUREIMAGE jupiterImg;TEXTUREIMAGE saturnImg;TEXTUREIMAGE uranusImg;TEXTUREIMAGE neptuneImg;TEXTUREIMAGE moonImg;GLuint texture[12]; // 纹理数组// 星球速度定义static float fSunSpin = 0.0f; // 太阳自转速度static float fMercuSpin = 0.0f; // 水星自转速度static float fMercuOrbit = 0.0f; // 水星公转速度static float fVenusSpin = 0.0f; // 金星自转速度static float fVenusOrbit = 0.0f; // 金星公转速度static float fEarthSpin = 0.0f; // 地球自转速度static float fEarthOrbit = 0.0f; // 地球公转速度static float fMarsSpin = 0.0f; // 火星自转速度static float fMarsOrbit = 0.0f; // 火星公转速度static float fJupiterSpin = 0.0f; // 木星自转速度static float fJupiterOrbit = 0.0f; // 木星公转速度static float fSaturnSpin = 0.0f; // 土星自转速度static float fSaturnOrbit = 0.0f; // 土星公转速度static float fUranusSpin = 0.0f; // 天王星自转速度static float fUranusOrbit = 0.0f; // 天王星公转速度static float fNeptuneSpin = 0.0f; // 海王星自转速度static float fNeptuneOrbit = 0.0f; // 海王星公转速度static float fMoonSpin = 0.0f; // 月亮自转速度static float fMoonOrbit = 0.0f; // 月亮公转速度// 初始化OpenGLvoid InitGL(void){glClearColor(0.0f, 0.0f, 0.0f, 0.5f);glClearDepth(2.0f);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glShadeModel(GL_SMOOTH);glEnable(GL_CULL_FACE);glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 设置环境光glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);// 设置漫反射光glEnable(GL_LIGHTING); // 打开光照glEnable(GL_LIGHT1); // 打开光源1// 载入纹理glEnable(GL_TEXTURE_2D); // 开启2D纹理映射MakeTexture(skyImg, &texture[0]);MakeTexture(sunImg, &texture[1]);MakeTexture(rayImg, &texture[2]);MakeTexture(mercuImg, &texture[3]);MakeTexture(venusImg, &texture[4]);MakeTexture(earthImg, &texture[5]);MakeTexture(marsImg, &texture[6]);MakeTexture(jupiterImg, &texture[7]);MakeTexture(saturnImg, &texture[8]);MakeTexture(uranusImg, &texture[9]);MakeTexture(neptuneImg, &texture[10]);MakeTexture(moonImg, &texture[11]);quadric = gluNewQuadric(); // 建立一个曲面对象指针gluQuadricTexture(quadric, GLU_TRUE);// 建立纹理坐标gluQuadricDrawStyle(quadric, GLU_FILL);// 面填充}void Display(void){glLoadIdentity();// 设置观察点的位置和观察的方向gluLookAt(viewer[0],viewer[1],viewer[2],viewer[3],viewer[4],viewer[5],viewer[6],viewer[7],viewer[8]);// 获得系统时间使太阳系有动态效果g_dCurrentTime = timeGetTime();g_fElpasedTime = (float)((g_dCurrentTime - g_dLastTime) * 0.0005);g_dLastTime = g_dCurrentTime;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode( GL_MODELVIEW );glTranslatef(0.0f, 0.0f, -5.0f); // 将坐标系移入屏幕5.0fglRotatef(10, 1.0f ,0.0f, 0.0f); // 将坐标系绕x轴旋转10度glEnable(GL_LIGHT0); // 打开光源0/**********************************绘制背景星空********************************************/glPushMatrix ();// 当前模型矩阵入栈glTranslatef(-10.0f, 3.0f, 0.0f);glRotatef (angle_Z, 0.0f, 0.0f, 1.0f);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture[0]);// 星空纹理// 绘制立方体,此处有问题,失败--!glBegin(GL_QUADS);glNormal3f( 0.0f, 0.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-50.0f, -50.0f, -50.0f);glTexCoord2f(6.0f, 0.0f); glVertex3f( 50.0f, -50.0f, -50.0f);glTexCoord2f(6.0f, 6.0f); glVertex3f( 50.0f, 50.0f, -50.0f);glTexCoord2f(0.0f, 6.0f); glVertex3f(-50.0f, 50.0f, -50.0f);glEnd();glBegin(GL_QUADS);glNormal3f( 0.0f, 0.0f, -1.0f);glTexCoord2f(6.0f, 6.0f); glVertex3f(-50.0f, -50.0f, 50.0f);glTexCoord2f(0.0f, 6.0f); glVertex3f( 50.0f, -50.0f, 50.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 50.0f, 50.0f, 50.0f);glTexCoord2f(6.0f, 0.0f); glVertex3f(-50.0f, 50.0f, 50.0f);glEnd();glBegin(GL_QUADS);glNormal3f( 0.0f, 1.0f, 0.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-50.0f, -50.0f, -50.0f);glTexCoord2f(6.0f, 6.0f); glVertex3f( 50.0f, -50.0f, 50.0f);glTexCoord2f(6.0f, 0.0f); glVertex3f( 50.0f, -50.0f, -50.0f);glTexCoord2f(0.0f, 6.0f); glVertex3f(-50.0f, -50.0f, 50.0f);glEnd();glBegin(GL_QUADS);glNormal3f( 0.0f, -1.0f, 0.0f);glTexCoord2f(6.0f, 6.0f); glVertex3f(-50.0f, 50.0f, -50.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f( 50.0f, 50.0f, 50.0f);glTexCoord2f(0.0f, 6.0f); glVertex3f( 50.0f, 50.0f, -50.0f);glTexCoord2f(6.0f, 0.0f); glVertex3f(-50.0f, 50.0f, 50.0f);glEnd();glBegin(GL_QUADS);glNormal3f( 1.0f, 0.0f, 0.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-50.0f, -50.0f, -50.0f);glTexCoord2f(6.0f, 6.0f); glVertex3f(-50.0f, 50.0f, 50.0f);glTexCoord2f(0.0f, 6.0f); glVertex3f(-50.0f, -50.0f, 50.0f);glTexCoord2f(6.0f, 0.0f); glVertex3f(-50.0f, 50.0f, -50.0f);glEnd();glBegin(GL_QUADS);glNormal3f( -1.0f, 0.0f, 0.0f);glTexCoord2f(6.0f, 6.0f); glVertex3f(50.0f, -50.0f, -50.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(50.0f, 50.0f, 50.0f);glTexCoord2f(6.0f, 0.0f); glVertex3f(50.0f, -50.0f, 50.0f);glTexCoord2f(0.0f, 6.0f); glVertex3f(50.0f, 50.0f, -50.0f);glEnd();glPopMatrix (); // 当前模型矩阵出栈/**********************************绘制太阳************************************************/ glBindTexture(GL_TEXTURE_2D, texture[2]); // 光晕纹理glEnable(GL_BLEND); // 开启混合glDisable(GL_DEPTH_TEST); // 关闭深度测试// 绘制太阳光晕glDisable(GL_LIGHTING); // 关闭光照glBlendFunc(GL_SRC_ALPHA,GL_ONE); // 半透明混合函数glColor4f(1.0f, 0.5f, 0.0f, 0.4f); // 设置RGBA值/*glBegin(GL_QUADS);glNormal3f( 0.0f, 0.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);glEnd();*/glDisable(GL_BLEND); // 关闭混合glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING); // 开启光照glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); // 设置光源1位置glBindTexture(GL_TEXTURE_2D, texture[1]); // 太阳纹理// 将坐标系绕Y轴旋转fSunSpin角度,控制太阳自转glRotatef(fSunSpin,0.0,1.0,0.0);gluSphere(quadric, 0.3f, 32, 32);// 绘制太阳球体/**********************************绘制水星************************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D ); // 开启纹理glPushMatrix (); // 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fMercuOrbit角度,控制水星公转glRotatef(fMercuOrbit, 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);// 将坐标系绕X轴旋转-90度glTranslatef(0.5f, 0.0f, 0.0f); // 将坐标系右移0.5fglBindTexture(GL_TEXTURE_2D, texture[3]); // 水星纹理// 将坐标系绕Z轴旋转fMercuSpin角度 控制水星自转glRotatef(fMercuSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.04f, 32, 32);// 水星球体glPopMatrix (); // 当前模型视图矩阵出栈// 绘制轨道glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(0.5f*sin(DEG_TO_RAD*angle),0,0.5f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制金星************************************************/ glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D );// 开启纹理glPushMatrix (); // 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fVenusOrbit角度,控制金星公转glRotatef(fVenusOrbit , 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);// 将坐标系绕X轴旋转-90度glTranslatef(0.8f, 0.0f, 0.0f); // 将坐标系右移0.8fglBindTexture(GL_TEXTURE_2D, texture[4]); // 金星纹理// 将坐标系绕Z轴旋转fVenusSpin角度,控制金星自转glRotatef(fVenusSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.06f, 32, 32); // 金星球体glPopMatrix ();glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(0.8f*sin(DEG_TO_RAD*angle),0,0.8f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制地球************************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D ); // 开启纹理glPushMatrix (); // 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fEarthOrbit角度,控制地球公转glRotatef(fEarthOrbit , 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);// 将坐标系绕X轴旋转-90度glTranslatef(1.1f, 0.0f, 0.0f); // 将坐标系右移1.1fglBindTexture(GL_TEXTURE_2D, texture[5]); // 地球纹理// 将坐标系绕Z轴旋转fEarthSpin角度,控制地球自转glRotatef(fEarthSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.08f, 32, 32); // 地球球体glPopMatrix ();glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(1.1f*sin(DEG_TO_RAD*angle),0,1.1f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制火星************************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D ); // 开启纹理glPushMatrix (); // 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fMarsOrbit角度,控制火星公转glRotatef(fMarsOrbit , 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度glTranslatef(1.4f, 0.0f, 0.0f); // 将坐标系右移1.4fglBindTexture(GL_TEXTURE_2D, texture[6]); // 火星纹理// 将坐标系绕Z轴旋转fMarsSpin角度,控制火星自转glRotatef(fMarsSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.04f, 32, 32);// 火星球体glPopMatrix ();glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(1.4f*sin(DEG_TO_RAD*angle),0,1.4f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制木星************************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D ); // 开启纹理glPushMatrix (); // 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fJupiterOrbit角度,控制木星公转glRotatef(fJupiterOrbit , 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);// 将坐标系绕X轴旋转-90度glTranslatef(1.7f, 0.0f, 0.0f);// 将坐标系右移1.7fglBindTexture(GL_TEXTURE_2D, texture[7]); // 木星纹理// 将坐标系绕Z轴旋转fJupiterSpin角度,控制木星自转glRotatef(fJupiterSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.13f, 32, 32); // 木星球体glPopMatrix ();glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(1.7f*sin(DEG_TO_RAD*angle),0,1.7f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制土星************************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D ); // 开启纹理glPushMatrix ();// 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fSaturnOrbit角度,控制土星公转glRotatef(fSaturnOrbit , 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度glTranslatef(1.9f, 0.0f, 0.0f); // 将坐标系右移1.9fglBindTexture(GL_TEXTURE_2D, texture[8]); // 土星纹理// 将坐标系绕Z轴旋转fSaturnSpin角度,控制土星自转glRotatef(fSaturnSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.1f, 32, 32); // 土星球体glPopMatrix ();glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(1.9f*sin(DEG_TO_RAD*angle),0,1.9f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制天王星**********************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D ); // 开启纹理glPushMatrix (); // 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fUranusOrbit角度,控制天王星公转glRotatef(fUranusOrbit , 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度glTranslatef(2.1f, 0.0f, 0.0f); // 将坐标系右移2.1fglBindTexture(GL_TEXTURE_2D, texture[9]); // 天王星纹理// 将坐标系绕Z轴旋转fUranusSpin角度,控制天王星自转glRotatef(fUranusSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.1f, 32, 32);// 天王星球体glPopMatrix ();glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(2.1f*sin(DEG_TO_RAD*angle),0,2.1f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制海王星**********************************************/glDisable(GL_LIGHT0);glEnable(GL_TEXTURE_2D ); // 开启纹理glPushMatrix (); // 当前模型视图矩阵入栈// 将坐标系绕Y轴旋转fNeptuneOrbit角度,控制海王星公转glRotatef(fNeptuneOrbit , 0.0f, 1.0f, 0.0f);glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕X轴旋转-90度glTranslatef(2.3f, 0.0f, 0.0f); // 将坐标系右移2.3fglBindTexture(GL_TEXTURE_2D, texture[10]);// 海王星纹理// 将坐标系绕Z轴旋转fNeptuneSpin角度,控制海王星自转glRotatef(fNeptuneSpin , 0.0f, 0.0f, 1.0f);gluSphere(quadric, 0.08f, 32, 32); // 海王星球体glPopMatrix ();glBegin(GL_LINE_LOOP);for(angle=0;angle<=360;angle++)glVertex3f(2.3f*sin(DEG_TO_RAD*angle),0,2.3f*cos(DEG_TO_RAD*angle));glEnd();/**********************************绘制月亮************************************************/glBindTexture(GL_TEXTURE_2D, texture[11]); // 月亮纹理glPushMatrix ();// 将坐标系绕Y轴旋转fEarthOrbit角度,控制月亮跟随地球glRotatef(fEarthOrbit , 0.0f, 1.0f, 0.0f);glTranslatef(1.1f, 0.0f, 0.0f); // 将坐标系右移1.1f// 将坐标系绕Y轴旋转fMoonOrbit角度,控制月亮公转glRotatef(fMoonOrbit , 0.0f, 1.0f, 0.0f);glTranslatef(0.15f, 0.0f, 0.0f);// 将坐标系绕Y轴旋转fMoonSpin角度,控制月亮自转glRotatef(fMoonSpin , 0.0f, 1.0f, 0.0f);gluSphere(quadric, 0.02, 32, 32); // 月亮球体glPopMatrix ();// 控制速度if( g_bOrbitOn == true ){fSunSpin -= g_fSpeedmodifier * (g_fElpasedTime * 10.0f);fMercuSpin -= g_fSpeedmodifier * (g_fElpasedTime * 15.0f);fMercuOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 40.0f);fVenusSpin -= g_fSpeedmodifier * (g_fElpasedTime * 10.0f);fVenusOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 30.0f);fEarthSpin -= g_fSpeedmodifier * (g_fElpasedTime * 100.0f);fEarthOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 20.0f);fMarsSpin -= g_fSpeedmodifier * (g_fElpasedTime * 30.0f);fMarsOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 50.0f);fJupiterSpin -= g_fSpeedmodifier * (g_fElpasedTime * 90.0f);fJupiterOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 35.0f);fSaturnSpin -= g_fSpeedmodifier * (g_fElpasedTime * 90.0f);fSaturnOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 25.0f);fUranusSpin -= g_fSpeedmodifier * (g_fElpasedTime * 70.0f);fUranusOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 15.0f);fNeptuneSpin -= g_fSpeedmodifier * (g_fElpasedTime * 40.0f);fNeptuneOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 5.0f);fMoonSpin -= g_fSpeedmodifier * (g_fElpasedTime * 50.0f);fMoonOrbit -= g_fSpeedmodifier * (g_fElpasedTime * 200.0f);}angle_Z += 0.01f;// 星空旋转glutSwapBuffers(); // 交换双缓存glFlush();}void Reshape(int width, int height){if (height==0)height=1; // 改变窗口glViewport(0,0,width,height);// 设置视口// 设置投影矩阵glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(viewer[0],viewer[1],viewer[2],viewer[3],viewer[4],-5,0,1,0);}void keyboard(unsigned char key, int x, int y){switch(key) {case 'd': case 'D': // 视点上下左右移动if(viewer[0]<=4.5)viewer[0]+=1;break;case 'a': case 'A':if(viewer[0]>=-10.0)viewer[0]-=1;break;case 'w': case 'W'://if(viewer[6]<=10)viewer[1]+=0.1;break;case 's': case 'S'://if(viewer[6]>=-10)viewer[1]-=0.1;break;case 'q': case 'Q': // 视点上下左右移动if(viewer[2]<=10.5)viewer[2]+=0.3;break;case 'e': case 'E':if(viewer[2]>=-10.5)viewer[2]-=0.3;break;case'+': // 加速,减速,暂停++g_fSpeedmodifier;glutPostRedisplay();break;case ' ':g_bOrbitOn = !g_bOrbitOn;glutPostRedisplay();break;case'-':--g_fSpeedmodifier;glutPostRedisplay();break;case VK_ESCAPE:// 按ESC键时退出exit(0);break;default:break;}}void special_keys(int s_keys, int x, int y){switch(s_keys) {case GLUT_KEY_F1: // 按F1键时切换窗口/全屏模式if(isFullScreen){glutReshapeWindow(WIN_WIDTH, WIN_HEIGHT);glutPositionWindow(30, 30);isFullScreen = FALSE;}else{glutFullScreen();isFullScreen = TRUE;}break;case GLUT_KEY_RIGHT: // 视角上下左右旋转if(viewer[3]<=4.5)viewer[3]+=0.1;break;case GLUT_KEY_LEFT:if(viewer[3]>=-3.0)viewer[3]-=0.1;break;case GLUT_KEY_UP:if(viewer[4]<=4.5)viewer[4]+=0.1;break;case GLUT_KEY_DOWN:if(viewer[4]>=-4.5)viewer[4]-=0.1;break;default:break;}}void TimerFunc(int value){glutPostRedisplay();glutTimerFunc(100,TimerFunc,1);}//void mouse(int btn, int state, int x, int y) // 远近视角//{//if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN)//viewer[2]+=0.3;//if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN&&viewer[2]>=-3.9)//viewer[2]-=0.3;//}// 程序主函数void main(int argc, char** argv){LoadBmp("Data//Sky.bmp" , &skyImg);LoadBmp("Data//Sun.bmp" ,&sunImg);//LoadBmp("Data//Ray.bmp" , &rayImg);LoadBmp("Data//Mercu.bmp", &mercuImg);LoadBmp("Data//Venus.bmp", &venusImg);LoadBmp("Data//Earth.bmp", &earthImg);LoadBmp("Data//Mars.bmp" , &marsImg);LoadBmp("Data//Jupiter.bmp" , &jupiterImg);LoadBmp("Data//Saturn.bmp" , &saturnImg);LoadBmp("Data//Uranus.bmp" , &uranusImg);LoadBmp("Data//Neptune.bmp" , &neptuneImg);LoadBmp("Data//Moon.bmp" , &moonImg);glutInit(&argc, argv); // 初始化GLUT库glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);// 初始化显示模式glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); // 初始化窗口大小glutInitWindowPosition(30,30); // 初始化窗口位置glutCreateWindow(WIN_TITLE); // 建立窗口InitGL(); // 初始化OpenGLglutDisplayFunc(Display);glutReshapeFunc(Reshape);glutTimerFunc(250,TimerFunc,1); //自动动画 计时器 glutKeyboardFunc(keyboard);glutSpecialFunc(special_keys);/*glutMouseFunc(mouse);*/// glutIdleFunc(Display); // 设置窗口空闲时的处理函数glutMainLoop(); // 进入事件处理循环}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。