我想说这是我们的结课作业,做完感觉不错哦,发上来与大家分享分享。
我编写时使用的是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文件夹中即可