OpenGL模拟太阳地球月亮系统

我想说这是我们的结课作业,做完感觉不错哦,发上来与大家分享分享。

我编写时使用的是visual studio 2008,用的vc++。

这次编写使用了多文件管理。

控制功能:

1、a和d控制地球月亮一起转动

2、s和w是缩放,按太多图形会跑到视景体外,就看不到咯

3、z和x控制月亮单独绕地球转

4、空格按一下自动旋转,再按一下停止

5、鼠标可拖动控制

一、创建一个解决方案 solarSystem

二、画球的静态库

现在opengl教学基本都使用glut库,里面就有画球的函数,现成的,不过还是自己手写了一个,不是特别好。

1、在solarSystem中创建静态库项目 mysphere

2、在静态库中创建mySphere.h的头文件

#pragma once
void mySphere(double radius,int slices,int stacks);


3、在静态库中创建mySphere.cpp文件

#include "stdafx.h"
#include<cmath>
#include<glut.h>
#include<cstring>
#define pi 3.141592653
void mySphere(double radius,int slices,int stacks)
{
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
	double a[1000],b[1000],c[1000],e[1000],f[1000],g[1000];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,radius,sizeof(c));
	for(int x=0;2*x<=stacks;x++)
	{
		double xx=x;
		double rr=sin(pi/2.0-xx*pi/stacks)*radius;
		for(int i=0;i<=slices;i++)g[i]=cos(pi/2.0-xx*pi/stacks)*radius;
		for(int y=0;y<=slices;y++)
		{
			e[y]=cos((double)y*2*pi/(double)slices)*rr;
			f[y]=sin((double)y*2*pi/(double)slices)*rr;
		}
		glBegin(GL_QUAD_STRIP);
		for(int y=0;y<slices;y++)
		{
			glVertex3d(e[y],f[y],g[y]);
			glVertex3d(a[y],b[y],c[y]);
		}
		glVertex3d(e[0],f[0],g[0]);
		glVertex3d(a[0],b[0],c[0]);
		glEnd();
		glBegin(GL_QUAD_STRIP);
		for(int y=0;y<slices;y++)
		{
			glVertex3d(e[y],f[y],-g[y]);
			glVertex3d(a[y],b[y],-c[y]);
		}
		glVertex3d(e[0],f[0],-g[0]);
		glVertex3d(a[0],b[0],-c[0]);
		glEnd();
		for(int i=0;i<=slices;i++)
		{
			a[i]=e[i];
			b[i]=f[i];
			c[i]=g[i];
		}
	}
}


三、solarSystem的主体项目

创建了项目solarSystem后,在里面分别创建一下文件

1、创建主函数文件solarSystem.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
int rotate=0;
float translate=4.5;
float eangle=0;
float mangle=0;
bool autorotate=0;
int xmouse;
void init(void);
void sun(void);
void earth(void);
void moon(void);
void display(void);
void reshape(int w,int h);
void keyboard(unsigned char key,int x,int y);
void timer(int value);
void mouse(int button,int state,int x,int y);
void mousemove(int x,int y);
int main(int argc,char** argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(600,600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("solarSystem");
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutMotionFunc(mousemove);
	glutMouseFunc(mouse);
	glutMainLoop();
	return 0;
}


2、init.cpp

#include "stdafx.h"
#include<glut.h>
void init(void)
{
	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_FLAT);
}


3、reshape.cpp

#include "stdafx.h"
#include<glut.h>
void reshape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-2.0,2.0,-2.0,2.0,1.0,10.0);//视景体
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}


4、display.cpp

#include "stdafx.h"
#include<glut.h>
void sun(void);
void earth(void);
void moon(void);
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	sun();
	earth();
	moon();
	glFlush();
}


5、sun.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
extern int rotate;
extern float translate;
extern float eangle;
extern float mangle;
void sun(void)
{
	glColor3f(1.0,0.0,0.0);//绘制颜色
	glPushMatrix();
	glTranslatef(0.0,0.0,-translate);
	glRotatef(0,0.0,0.0,0.0);
	mySphere(1.0,15,15);
	glPopMatrix();
}


6、earth.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
extern int rotate;
extern float translate;
extern float eangle;
extern float mangle;
void earth(void)
{
	
	glColor3f(0.0,1.0,0.0);//绘制颜色
	glPushMatrix();
	glTranslatef(3*cos(eangle*pi/360.0),0.0,3*sin(eangle*pi/360.0)-translate);
	glRotatef(2*rotate,0.0,1.0,0.0);
	mySphere(0.5,15,15);
	glPopMatrix();
}


7、moon.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
extern int rotate;
extern float translate;
extern float eangle;
extern float mangle;
void moon(void)
{
	glColor3f(1.0,1.0,0.0);//绘制颜色
	glPushMatrix();
	glTranslatef(3*cos(eangle*pi/360.0)+cos(mangle*pi/360.0),0.0,3*sin(eangle*pi/360.0)+sin(mangle*pi/360.0)-translate);
	glRotatef(rotate,0.0,1.0,0.0);
	mySphere(0.3,15,15);
	glPopMatrix();
}


8、keyboard.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
extern int rotate;
extern float translate;
extern float eangle;
extern float mangle;
extern bool autorotate;
void timer(int value);
void keyboard(unsigned char key,int x,int y)
{
	switch(key)
	{
	case 'a':
		rotate=(rotate+10)%360;
		eangle+=3;
		mangle+=20;
		glutPostRedisplay();
		break;
	case 'd':
		rotate=(rotate-10)%360;
		eangle-=3;
		mangle-=20;
		glutPostRedisplay();
		break;
	case 's':
		translate-=0.25;
		glutPostRedisplay();
		break;
	case 'w':
		translate+=0.25;
		glutPostRedisplay();
		break;
	case 'z':
		//rotate=(rotate+10)%360;
		mangle+=20;
		glutPostRedisplay();
		break;
	case 'x':
		//rotate=(rotate-10)%360;
		mangle-=20;
		glutPostRedisplay();
		break;
	case ' ':
		if(autorotate==0)autorotate=1;
		else autorotate=0;
		if(autorotate)glutTimerFunc(20,timer,1);
		break;
	default:
		break;
	}
}


9、mouse.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
extern int rotate;
extern float translate;
extern float eangle;
extern float mangle;
extern int xmouse;
void mouse(int button,int state,int x,int y)
{
	if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)
	{
		xmouse=x;
		glutPostRedisplay();
	}
}


10、mousemove.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
extern int rotate;
extern float translate;
extern float eangle;
extern float mangle;
extern int xmouse;
void mousemove(int x,int y)
{
	x-=xmouse;
	rotate-=(float)x;
	eangle-=3.0*(float)x/10;
	mangle-=(float)x*2.0;
	xmouse+=x;
	glutPostRedisplay();
}


11、timer.cpp

#include "stdafx.h"
#include "mySphere.h"
#include<glut.h>
#include<math.h>
#define pi 3.141592653
extern int rotate;
extern float translate;
extern float eangle;
extern float mangle;
extern bool autorotate;
void timer(int value)
{
	rotate=(rotate-10)%360;
	eangle-=3;
	mangle-=20;
	glutPostRedisplay();
	if(autorotate)glutTimerFunc(20,timer,1);
}


四、环境配置

按照自己的习惯写的,不对的地方见谅

1、依赖项目:在菜单栏,找到项目,找到项目依赖项,将solarSystem依赖于mySphere,solarSystem的属性中c/c++常规项附加包含目录填..\mySphere

2、glut库配置:将glut的三个文件放入glut文件夹中,文件夹再放入解决方案的文件夹中,然后在编译器里,将mySphere和solarSystem的属性中c/c++常规项附加包含目录填..\glut,solarSystem的属性中连接器常规的附加库目录填写..\glut,mySphere的属性管理员常规的附加库目录填写..\glut

3、dll文件配置:编译后将glut32.dll放入Debug文件夹中即可


你可能感兴趣的:(OpenGL,OpenGL,OpenGL,OpenGL,OpenGL,鼠标拖动,球体,Baoge,地球太阳月亮)