⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 earthsat.c

📁 opengl source code download
💻 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 + -