📄 earthsat.c
字号:
#include <windows.h>
#include <GL/gl.h>
#include <GL/glaux.h>
#include <GL/glu.h>
#include <math.h>
#include <float.h>
#include "map.h"
#define CIRCLE_LIST 1
#define MAP_LIST 2
#define DIVISION_NUM 36
void myInit();
void initsphere(float,int,int,float point[][DIVISION_NUM][3]);
void fillsphere(int,int,float point[][DIVISION_NUM][3]);
void CALLBACK myReshape(GLsizei w,GLsizei h);
void CALLBACK myDisplay(void);
void draw_sat(float ,float ,float ,float);
void draw_orbit(float ,float ,float ,float);
void drawmap(void);
float sphere[DIVISION_NUM][DIVISION_NUM][3];
void main(void)
{
auxInitDisplayMode (AUX_DOUBLE | AUX_RGB);
auxInitPosition (0, 0, 800, 600);
auxInitWindow ("OpengGL Animation");
myInit();
auxIdleFunc(myDisplay);
auxReshapeFunc(myReshape);
auxMainLoop(myDisplay);
}
void initsphere(float rad,int nlat,int nlong,float point[][DIVISION_NUM][3])
{
int i,j;
double pi=3.1415926,inclat,heigh,dval,magnitude;
for(i=0;i<nlat;i++)
{
inclat=pi/(nlat-1)*i-pi/2.;
magnitude=cos(inclat)*rad;
heigh=sin(inclat)*rad;
for(j=0;j<nlong+1;j++)
{
point[i][j][1]=(float)heigh;
dval=cos(2.*pi*j/nlong)*magnitude;
point[i][j][0]=(float)dval;
dval=sin(2.*pi*j/nlong)*magnitude;
point[i][j][2]=(float)dval;
}
}
}
void fillsphere(int nlat,int nlong,float point[][DIVISION_NUM][3])
{
int i,j;
for(i=0;i<nlat;i++) {
glBegin(GL_QUAD_STRIP);
for(j=0;j<nlong+1;j++)
{
glNormal3fv(point[i+1][j]);
glVertex3fv(point[i+1][j]);
glNormal3fv(point[i][j]);
glVertex3fv(point[i][j]);
} // end j
glEnd();
} // end i
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
if (!h) return;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, .1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(3.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);
// gluLookAt(10.0,2.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
void myInit()
{
int j,seg_num=36;
float PI=3.1415926f;
GLfloat mat_amb_dif[]={0.1f,0.1f,.8f,1.0f};
GLfloat mat_specular[] = { 0.1f, 0.1f, .7f, 1.0f };
GLfloat mat_shininess = 50.0;
GLfloat light_amb[] = { .2f, .2f, .2f, 1.0f };
GLfloat light_pos[] = { -1.0f, 1.0f, 1.0f, 0.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_amb_dif);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
// glLightfv(GL_LIGHT0, GL_AMBIENT, light_amb);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
initsphere(.99f,DIVISION_NUM,DIVISION_NUM-1,sphere);
glEnable(GL_DEPTH_TEST);
glNewList(CIRCLE_LIST,GL_COMPILE);
glBegin(GL_LINE_LOOP);
for(j=0;j<seg_num;j++)
glVertex3d(cos(j*2*PI/seg_num),0,sin(j*2*PI/seg_num));
glEnd();
glEndList();
drawmap();
}
void CALLBACK myDisplay(void)
{
static float posi=300;
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
posi+=.1f;
glEnable(GL_LIGHTING);
glPushMatrix();
glRotatef(posi/12.0f,0.0,1.0,0.0);
fillsphere(DIVISION_NUM,DIVISION_NUM-1,sphere);
glDisable(GL_LIGHTING); //
glCallList(MAP_LIST);
glPopMatrix();
draw_sat(0.f,posi,1.4f,50.f);
glColor3f(0.0f,1.0f,0.0f);
draw_orbit(0.f,300.f,1.4f,50.f);
glFlush();
auxSwapBuffers();
}
/*
void CALLBACK myDisplay(void)
{
static float t_delta = 2.0, time = 0.0, se_dis = 5.0, em_dis = 1.0;
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
time += t_delta;
glPushMatrix();
auxSolidSphere(1.0);
glPopMatrix();
glPushMatrix();
glRotatef(360.f/365.0f/24.f*time, 0.0f, 1.0f, 0.0f);
glTranslatef(se_dis, 0.f, 0.f);
auxSolidSphere(0.3);
glPushMatrix();
glRotatef(360.f/29.5f/24.f*time, 0.0f, 1.0f, 0.0f);
glTranslatef(em_dis, 0.f, 0.f);
auxSolidSphere(0.1);
glPopMatrix();
glPopMatrix();
glFlush();
auxSwapBuffers();
}
*/
void draw_sat(float Omig,float omig,float a,float i)
{
glPushMatrix();
glRotatef(Omig,0.0,1.0,0.0);
glRotatef(i,1.0,0.0,0.0);
glRotatef(omig,0.0,1.0,0.0);
glTranslatef(a,0.,0.);
glRotatef(90,0.0,0.0,1.0);
glScalef(.1f,.1f,.1f);
glColor3f(0.5f,0.5f,0.0f);
auxSolidCube(1.0);
glColor3f(0.f,0.f,1.0f);
auxSolidBox(4.0,0.1,0.9);
glColor4f(1.0f, 0.f, 0.f, 0.1f);
glRotatef(90.f, 1.f, 0.f, 0.f);
glTranslatef(0.f, 0.f, -5.f);
auxSolidCone(2.0f, 5.0f);
glPopMatrix();
}
void draw_orbit(float Omig,float omig,float a,float i)
{
glPushMatrix();
glRotatef(Omig,0.0,1.0,0.0);
glRotatef(i,1.0,0.0,0.0);
glScalef(a,a,a);
glCallList(CIRCLE_LIST);
glPopMatrix();
}
void drawmap(void)
{
int i;
glNewList(MAP_LIST,GL_COMPILE);
glColor3f(.0,.5,1.);
glBegin(GL_LINE_LOOP);
for(i=0;i<45;i++)
glVertex3fv(mape1[i]);
glEnd();
glColor3f(1.0,0.,1.);
glBegin(GL_LINE_LOOP);
for(i=0;i<32;i++)
glVertex3fv(mape2[i]);
glEnd();
glColor3f(.0,1.,1.);
glBegin(GL_LINE_LOOP);
for(i=0;i<12;i++)
glVertex3fv(mape3[i]);
glEnd();
glColor3f(1.0,1.,0.);
glBegin(GL_LINE_LOOP);
for(i=0;i<54;i++)
glVertex3fv(mape4[i]);
glEnd();
glColor3f(1.0,.5,1.);
glBegin(GL_LINE_LOOP);
for(i=0;i<73;i++)
glVertex3fv(mape5[i]);
glEnd();
glColor3f(.5f,0.7f,1.f);
glBegin(GL_LINE_STRIP);
for(i=0;i<168;i++)
glVertex3fv(mape6[i]);
glEnd();
glColor3f(1.0,0.,0.);
glBegin(GL_LINE_LOOP);
for(i=0;i<124;i++)
glVertex3fv(mape7[i]);
glEnd();
glEndList();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -