#include "LoadBMP.h"
#include <math.h>
#include "GL\fmod.h" // 音频库的头文件
float star[2000][3];
GLint width,height,w1,h1,fovy=60;
int mouseDx ;
int mouseDy ;
#pragma comment(lib, "fmodvc.lib") // 把音频库加入到链接器中
#pragma comment(lib, "opengl32.lib") // 链接时查找OpenGL32.lib
#pragma comment(lib, "glu32.lib") // 链接时查找glu32.lib
#pragma comment(lib, "glaux.lib") // 链接时查找glaux.lib
BOOL play=TRUE;
FSOUND_STREAM *mp3back; // 背景音乐 *.mp3格式
float pox=5,poy=3,poz=3;
//选择字体函数
void selectFont(int size, int charset, const char* face)
{
HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
DeleteObject(hOldFont);
}
//生成中文字体函数
void drawCNString(const char* str)
{
int len, i;
wchar_t* wstring;
HDC hDC = wglGetCurrentDC();
GLuint list = glGenLists(1);
// 计算字符的个数
// 如果是双字节字符的(比如中文字符),两个字节才算一个字符
// 否则一个字节算一个字符
len = 0;
for(i=0; str[i]!='\0'; ++i)
{
if( IsDBCSLeadByte(str[i]) )
++i;
++len;
}
// 将混合字符转化为宽字符
wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
wstring[len] = L'\0';
// 逐个输出字符
for(i=0; i<len; ++i)
{
wglUseFontBitmapsW(hDC, wstring[i], 1, list);
glCallList(list);
}
// 回收所有临时资源
free(wstring);
glDeleteLists(list, 1);
}
// 载入音频文件
GLvoid InitFMOD(void)
{
if (FSOUND_Init(44100, 32, 0)) // 把声音初始化为44khz
{
// 载入文件bgmusic.mp3
mp3back = FSOUND_Stream_OpenFile("yuzhou.mp3", FSOUND_LOOP_NORMAL, 0);
}
}
// 释放音频文件
GLvoid FreeFMOD(void)
{
if (mp3back != NULL)
{
FSOUND_Stream_Close(mp3back); // 释放文件bgmusic.mp3
}
}
void init_stars()
{
for ( int i=0; i < 2000; i++ )
{
for(int j=0;j<3;j++)
{
star[i][j]=rand()%20-10;
}
}
}
void init(void)
{
GLfloat mat_specular []={1,1,1,1.0}; //材料的镜面颜色
GLfloat mat_shininess []={500.0}; //镜面指数
GLfloat light_position[] = {7, 7, 0, 0}; //设置光源位置
GLfloat white_light[] = {1, 1, 1, 1}; //设定光源颜色
GLfloat lmodel_ambient[] = {0.8, 0.8,0.8,1}; //环境光强度,全局光照
GLfloat mat_emission []={0.1,0.1,0.1,1.0}; //材料的发射颜色
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light); //漫反射光
glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); // 镜面反射强光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient); //环境光
glEnable(GL_LIGHTING); //启用光照
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
GLfloat LightAmbient[] = {0.8, 0.8,0.8,1};
GLfloat LightDiffuse[] = {1, 0.8, 0.8, 1};
GLfloat LightPosition[] = {0,0,2, 0};
glEnable(GL_LIGHTING); // 开启光照
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 设置环境光
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫反射光
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); // 设置光源1位置
// 初始化音频文件
InitFMOD();
glEnable(GL_TEXTURE_2D); //启用二维纹理
LoadAllTextures(); //调入纹理
}
void drawCircle(GLdouble R)
{
glPushMatrix();
glRotated(90,1.0,0.0,0.0);
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINE_LOOP);
for(int i=0;i<1000;i++)
{
GLdouble angle = i*2*PI/1000.0;
glVertex2d(R*cos(angle),R*sin(angle));
}
glEnd();
glPopMatrix();
}
void stars()
{
glBegin( GL_POINTS );
glColor3f( 1.0f, 1.0f, 1.0f );
for ( int i=0; i < 2000; ++i )
{
glVertex3f( star[i][0], star[i][1], star[i][2] );
}
glEnd();
}
void idle()
{
day+=angle;
glutPostRedisplay();
}
void mouse(int button,int state,int x,int y) //定义鼠标响应
{
if(state==GLUT_DOWN && button==GLUT_LEFT_BUTTON){
if(first)
{
glutIdleFunc(idle);
first=!first;
}
else
{
glutIdleFunc(0);
first=!first;
}
}
}
void display(void)
{
year=day/365;
month=day/30;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 暂停和播放背景音乐 mp3
if(play==TRUE)
FSOUND_Stream_Play(FSOUND_FREE,mp3back);
else
FSOUND_Stream_Stop(mp3back );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fovy, (GLfloat) w1/(GLfloat) h1, 2, 60.0);
gluLookAt (pox,poy,poz, 0, 0, 0.0, 0.0, 1.0, 0.0); //指定照相机的位置
glMatrixMode(GL_MODELVIEW);
glPushMatrix();//画宇宙背景
glBindTexture(GL_TEXTURE_2D,universe->texID);
glRotatef(month/30,1.0,0.0,0.0);
glBegin(GL_QUADS);
//back
glTexCoord2f(0.0f, 0.0f);glVertex3f(-width /80, -height/80, -10);
glTexCoord2f(1.0f, 0.0f);glVertex3f( width/80 , -height/80, -10);
glTexCoord2f(1.0f, 1.0f);glVertex3f( width/80, height/80, -10);
glTexCoord2f(0.0f, 1.0f);glVertex3f(-width /80, height/80, -10);
//head
glTexCoord2f(0.0f, 0.0f);glVertex3f(-width /100, -height/100, 10);
glTexCoord2f(1.0f, 0.0f);glVertex3f( width/100 , -height/100, 10);
glTexCoord2f(1.0f, 1.0f);glVertex3f( width/100, height/100, 10);
glTexCoord2f(0.0f, 1.0f);glVertex3f(-width /100, height/100, 10);
//top
glTexCoord2f(0.0f, 0.0f); glVertex3f(-width /100, height/100, -10);
glTexCoord2f(1.0f, 0.0f); glVertex3f( width /100, height/100, -10);
glTexCoord2f(1.0f, 1.0f); glVertex3f( width /100, height/100, 10);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-width /100, height/100, 10);
//bottom
glTexCoord2f(0.0f, 0.0f); glVertex3f(-width /100, -height/100, -10);
glTexCoord2f(1.0f, 0.0f); glVertex3f( width /100, -height/100, -10);
glTexCoord2f(1.0f, 1.0f); glVertex3f( width /100, -height/100, 10);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-width /100, -height/100, 10);
//left
glTexCoord2f(0.0f, 0.0f); glVertex3f(-width /100, height/100, -10);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-width /100, height/100, 10);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/100, -height/100, 10);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/100, -height/100, -10);
//right
glTexCoord2f(0.0f, 0.0f); glVertex3f(width/100, height/100, 10);
glTexCoord2f(1.0f, 0.0f); glVertex3f(width/100, height/100, -10);
glTexCoord2f(1.0f, 1.0f); glVertex3f(width/100, -height/100, -10);
glTexCoord2f(0.0f, 1.0f); glVertex3f(width/100, -height/100, 10);
glEnd();
glPopMatrix();
//glEnable(GL_BLEND); // 开启混合,利用混合实现光晕。
//glDisable(GL_DEPTH_TEST); // 关闭深度测试, 光晕在z=0处,否则星球转到其后面会挡住
// 绘制太阳光晕
//glDisable(GL_LIGHTING); // 关闭光照,否则光照会影响。
//glBlendFunc(GL_SRC_ALPHA,GL_ONE);
//画太阳
glPushMatrix();
glEnable(GL_LIGHT1);
glBindTexture(GL_TEXTURE_2D,sun->texID);
glRotatef((GLfloat) month, 0.0, 1.0, 0.0); //太阳自转
glRotatef (90, -1, 0, 0);
gltDrawSphere(1.0, 50, 50); /* draw sun */
glPopMatrix();
用opengl实现的太阳系模型
2星 需积分: 50 110 浏览量
2014-06-18
10:05:47
上传
评论 1
收藏 8.28MB RAR 举报
qinyana
- 粉丝: 1
- 资源: 2
最新资源
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
- 基于matlab+DWT的图像水印项目,数字水印+源代码+文档说明+图片+报告pdf
- (优秀毕业设计)基于python实现的数字图像可视化水印系统的设计与实现,多种数字算法实现+源代码+文档说明+理论演示pdf
- 基于DWT-DCT-SVD和deflate压缩的数字水印方法python源码+Gui界面+演示视频(高分毕业设计)
- 基于matlab实现DWT、DCT、SVD算法数字图像水印可视化系统+GUI界面+文档说明+详细注释(高分毕业设计)
- NCIAE-Data-Structure大一大二笔记
- 学习wireshark笔记
- digital-image-数据可视化笔记
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈