#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "gl/glaux.h"
#define PI 3.141592654
#define DEG2RAD(angle) angle*(PI/180)
static GLdouble viewPoint[]= {1.6,8.5,-0.3};
static double Eyear = 0,Vyear=0,Meryear=0,Maryear=0, Jyear=0,Syear=0,Uyear=0,Nyear=0,
month=0,
Eday = 0,Merday=0,Vday=360,Marday=0,Jday=0,Sday=0,Uday=0,Nday=0,
angle,r;
static double MerDSpeed=0.72,VDSpeed=0.15,EDSpeed=36.0,MarDSpeed=35.0,JDSpeed=90.0,SDSpeed=81.0,UDSpeed=49.6,NDSpeed=53.6,
monSpeed=12,
MerYSpeed=4,VYSpeed=1.6,EYSpeed=1,MarYSpeed=0.5,JYSpeed=0.09,SYSpeed=0.03,UYSpeed=0.01,NYSpeed=0.006;
GLuint texture[10];
void AutoRun(void)
{ /*自转控制*/
Merday += MerDSpeed;
if( Merday > 360.0 ) Merday -= 360.0;
Vday-=VDSpeed;
if( Vday <= 0 ) Vday += 360.0; // 金星是逆向自转
Eday += EDSpeed;
if( Eday > 360.0 ) Eday -= 360.0;
Marday+=MarDSpeed;
if( Marday > 360.0 ) Marday -= 360.0;
Jday+=JDSpeed;
if( Jday > 360.0 ) Jday -= 360.0;
Sday+=SDSpeed;
if( Sday > 360.0 ) Sday -= 360.0;
Uday+=UDSpeed;
if( Uday > 360.0 ) Uday -= 360.0;
Nday+=NDSpeed;
if( Nday > 360.0 ) Nday -= 360.0;
/*公转控制*/
Meryear+=MerYSpeed;
if( Meryear > 360.0 ) Meryear -= 360.0;
Vyear += VYSpeed;
if( Vyear > 360.0 ) Vyear -= 360.0;
Eyear += EYSpeed;
if( Eyear > 360.0 ) Eyear -= 360.0;
Maryear += MarYSpeed;
if( Maryear > 360.0 ) Maryear -= 360.0;
Jyear += JYSpeed;
if( Jyear > 360.0 ) Jyear -= 360.0;
Syear += SYSpeed;
if( Syear > 360.0 ) Syear -= 360.0;
Uyear += UYSpeed;
if( Uyear > 360.0 ) Uyear -= 360.0;
Nyear += NYSpeed;
if( Nyear > 360.0 ) Nyear -= 360.0;
month += monSpeed;
if( month > 360.0 ) month -= 360.0;
glutPostRedisplay();
}
/*绘制球体*/
void gltDrawSphere(GLfloat fRadius, GLint iSlices, GLint iStacks)
{
GLfloat drho = (GLfloat)(3.141592653589) / (GLfloat) iStacks;
GLfloat dtheta = 2.0f * (GLfloat)(3.141592653589) / (GLfloat) iSlices;
GLfloat ds = 1.0f / (GLfloat) iSlices;
GLfloat dt = 1.0f / (GLfloat) iStacks;
GLfloat t = 1.0f;
GLfloat s = 0.0f;
GLint i, j;
for (i = 0; i < iStacks; i++)
{
GLfloat rho = (GLfloat)i * drho;
GLfloat srho = (GLfloat)(sin(rho));
GLfloat crho = (GLfloat)(cos(rho));
GLfloat srhodrho = (GLfloat)(sin(rho + drho));
GLfloat crhodrho = (GLfloat)(cos(rho + drho));
glBegin(GL_TRIANGLE_STRIP);
s = 0.0f;
for ( j = 0; j <= iSlices; j++)
{
GLfloat theta = (j == iSlices) ? 0.0f : j * dtheta;
GLfloat stheta = (GLfloat)(-sin(theta));
GLfloat ctheta = (GLfloat)(cos(theta));
GLfloat x = stheta * srho;
GLfloat y = ctheta * srho;
GLfloat z = crho;
glTexCoord2f(s, t);
glNormal3f(x, y, z);
glVertex3f(x * fRadius, y * fRadius, z * fRadius);
x = stheta * srhodrho;
y = ctheta * srhodrho;
z = crhodrho;
glTexCoord2f(s, t - dt);
s += ds;
glNormal3f(x, y, z);
glVertex3f(x * fRadius, y * fRadius, z * fRadius);
}
glEnd();
t -= dt;
}
}
/*从文件获取BMP图片*/
AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供
{
return NULL; //如果没提供,返回 NULL
}
File=fopen(Filename,"r"); //尝试打开文件
if (File) // 文件存在与否
{
fclose(File); // 关闭句柄
return auxDIBImageLoad(Filename); //载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}
int LoadGLTextures() // 载入位图并转换成纹理
{
int Status=FALSE; // Status 状态指示器
int i;
AUX_RGBImageRec *TextureImage[10]; // 创建纹理的存储空间
char bmp[10][30]={
"Data/Sun.bmp",
"Data/Mercury.bmp",
"Data/Venus.bmp",
"Data/earth.bmp",
"Data/moon.bmp",
"Data/Mars.bmp",
"Data/Jutiper.bmp",
"Data/Saturn.bmp",
"Data/Uranus.bmp",
"Data/Neptune.bmp",
};
TextureImage[0]= LoadBMP(bmp[0]);
TextureImage[1]=LoadBMP(bmp[1]);
TextureImage[2]=LoadBMP(bmp[2]);
TextureImage[3]=LoadBMP(bmp[3]);
TextureImage[4]=LoadBMP(bmp[4]);
TextureImage[5]=LoadBMP(bmp[5]);
TextureImage[6]=LoadBMP(bmp[6]);
TextureImage[7]=LoadBMP(bmp[7]);
TextureImage[8]=LoadBMP(bmp[8]);
TextureImage[9]=LoadBMP(bmp[9]);
for(i=0;i<10;i++)
{
memset(TextureImage[i],0,sizeof(void *)*1); // 将指针设置为Null
/* 载入BMP图片,并查错*/
if (TextureImage[i]=LoadBMP(bmp[i]))
{
Status=TRUE; // 将状态设置为TRUE
glGenTextures(1, &texture[i]); // 创建纹理
glBindTexture(GL_TEXTURE_2D, texture[i]); // 根据不同Bitmap图片的数据产生不同的纹理
/*定义纹理*/
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[i]->data);
/* 控制滤波*/
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}
if (TextureImage[i]) // 判断纹理是否存在
{
if (TextureImage[i]->data) // 判断纹理图像是否存在
{
free(TextureImage[i]->data); // 释放纹理图像占用的内存
}
free(TextureImage[i]); // 释放图像结构
}
}
return Status; // 返回状态
}
void display(void)
{ /*材质参数*/
GLfloat sun_mat_ambient[4]={1.0,1.0,1.0,0.0};
GLfloat sun_mat_diffuse[4]={1.0,1.0,0.5,1.0};
GLfloat sun_mat_specular[4]={1.0,1.0,1.0,1.0};
GLfloat sun_mat_shininess[]={10.0};
GLfloat sun_mat_emission[4]={0.1,0.1,0.1,1.0};
GLfloat mat_ambient[4]={0.2,0.2,0.2,1.0};
GLfloat mat_diffuse[4]={1.0,1.0,1.0,1.0};
GLfloat mat_specular[4]={0.5,0.5,0.5,1.0};
GLfloat mat_shininess[]={5.0};
GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 }; // 光源位置设置
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
gluLookAt(0,viewPoint[0],viewPoint[1],0,0,0,viewPoint[2],1,0); // 观察点设置
/* draw sun */
glPushMatrix();
glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 创建光源
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,sun_mat_ambient); // 材质设定
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,sun_mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,sun_mat_specular);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,sun_mat_shininess);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,sun_mat_emission);
glBindTexture(GL_TEXTURE_2D, texture[0]); // 绑定纹理
glRotatef((GLfloat) Eyear, 0.0, 1.0, 0.0);
glRotatef(90,1,0.0,0.0);
gltDrawSphere(1.0,200,200); //绘制球体
glPopMatrix();
/* draw Mercury */
glPushMatrix();
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient); // 材质设定
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
glBindTexture(GL_TEXTURE_2D, texture[1]); // 绑定纹理
glRotatef((GLfloat) Meryear, 0.0, 1.0, 0.0); //公转
glTranslatef (0.0, 0.0, 1.8); //与太阳的距离
glRotatef((GLfloat) Merday, 0.0, 1.0, 0.0); //自转
glRotatef(90,1.0,0.0,0.0);
gltDrawSphere(0.2,200,200);
glPopMatrix();
/*画水星轨道*/
glDisable(GL_TEXTURE_2D);
glBegin(GL_LINE_LOOP);
glColor3f(1.0,1.0,1.0);
for(angle=0;angle<=360;angle++)
glVertex3f(1.8*sin(DEG2RAD(angle)),0,1.8*cos(DEG2RAD(angle)));
glEnd();
glEnable(GL_TE
- 1
- 2
前往页