#include <windows.h>
#include <stdio.h>
#include <gl/glaux.h>
#include <gl/glut.h>
GLfloat sun_self_angle=10.0f;
GLfloat s_radius[11]={2.4f,4.1f,4.4f,3.0f,7.0f,7.4f,
5.5f,5.4f,2.3f,0.6f,8.0f};
GLfloat c_radius[11]={0.68f,1.0f,1.5f,2.5f,3.2f,4.0f,
5.0f,5.8f,6.4f,1.0f,0.0f};
GLfloat c_angle[11]={30.0f,20.0f,16.0f,11.0f,8.0f,5.0f,3.0f,1.5f,1.0f,48.0f,0.0f};
char filename[][20]={
"data/mercurial.bmp","data/venus.bmp","data/earth.bmp","data/mars.bmp","data/jupiter.bmp","data/saturn.bmp",
"data/uranus.bmp","data/neptune.bmp","data/pluto.bmp","data/moon.bmp","data/sun.bmp"
};
GLuint texture[11];// 存放11个纹理
typedef struct
{
GLfloat self_radius;//行星半径
GLfloat cir_radius;//公转半径
GLfloat angle;//观察角度
}Planet;
Planet planet[9];
GLfloat z_depth=-15.0f; // 离观察者的距离
GLfloat angle=90.0f; // planet的倾角
GLfloat spin; //自转
HDC hDC=NULL;// 窗口着色描述表句柄
HGLRC hRC=NULL;// OpenGL渲染描述表句柄
HWND hWnd=NULL;// 保存我们的窗口句柄
HINSTANCE hInstance;// 保存程序的实例
bool keys[256]; // 保存键盘按键的数组
bool active=TRUE;// 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE;// 全屏标志缺省,缺省设定成全屏模式
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// WndProc的定义
AUX_RGBImageRec *LoadBMP(char *Filename)// 载入位图文件
{
FILE *File=NULL;// 文件句柄
if (!Filename) // 确认已给出文件名
{
return NULL;// 若无返回 NULL
}
File=fopen(Filename,"r");// 检查文件是否存在
if (File)// 文件存在么?
{
fclose(File);// 关闭文件句柄
return auxDIBImageLoad(Filename);// 载入位图并返回指针
}
return NULL;// 如果载入失败返回 NULL
}
int LoadGLTextures()// 载入位图并转换成纹理
{
int Status=FALSE;// 状态指示器
AUX_RGBImageRec *TextureImage[1];// 为纹理分配存储空间
memset(TextureImage,0,sizeof(void *)*1);// 将指针设为 NULL
for(int i=0;i<11;i++)// 载入位图,查错,如果未找到位图文件则退出
{
if (TextureImage[0]=LoadBMP(filename[i]))
{
if(i==10)
Status=TRUE;// 将 Status 设为TRUE
glGenTextures(1, &texture[i]);// 创建一个纹理
glBindTexture(GL_TEXTURE_2D,texture[i]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//映射方式
}
}
if (TextureImage[0])// 如果纹理存在
{
if (TextureImage[0]->data)// 如果纹理图像存在
{
free(TextureImage[0]->data);// 释放纹理图像所占的内存
}
free(TextureImage[0]); // 释放图像结构
}
return Status;// 返回 Status的值
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置OpenGL窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 将Height设为1
}
glViewport(0,0,width,height); // 重置当前的视口
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);// 设置视口的大小
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置
{
if (!LoadGLTextures()) // 调用纹理载入子例程
{
return FALSE; // 如果未能载入,返回FALSE
}
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);// 启用纹理映射
for(int i=0;i<9;i++)
{
planet[i].angle=c_angle[i];
planet[i].self_radius=s_radius[i];
planet[i].cir_radius=c_radius[i];
}
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // 设置混色函数取得半透明效果
glEnable(GL_BLEND); // 启用混色
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告诉系统对透视进行修正
return TRUE; // 初始化 OK
}
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
GLUquadricObj * quadric=gluNewQuadric();//???
glEnable(GL_CULL_FACE);//??
glCullFace(GL_BACK);
gluQuadricTexture(quadric,GL_TRUE);
// glRotatef(sun_self_angle,0.0f,0.0f,1.0f); // 自转
// sun_self_angle+=10.0f;
glTranslatef(0.0f,0.0f,z_depth); // 深入屏幕里面
glTranslatef(c_radius[10],0.0f,0.0f);
glBindTexture(GL_TEXTURE_2D,texture[10]);
gluSphere(quadric,s_radius[10]/10,120,120);
//glutSolidSphere(s_radius[10]/20,30,30);
for(int i=0;i<9;i++)
{
glPushMatrix();
glRotatef(angle,1.0f,0.0f,0.0f); // 倾斜视角
glRotatef(planet[i].angle,0.0f,1.0f,0.0f); // 旋转至当前所画planet的角度
glTranslatef(planet[i].cir_radius*3,0.0f,0.0f); // 沿X轴正向移动
glBindTexture(GL_TEXTURE_2D,texture[i]);
gluSphere(quadric,planet[i].self_radius/7,120,120);
//glutSolidSphere(planet[i].self_radius/7,15,15);
planet[i].angle+=c_angle[i]/5;
if(planet[i].angle>360.0f)
{
planet[i].angle-=360.0f;
}
c_angle[9]+=c_angle[9]/280;
if(c_angle[9]>360.0f)
c_angle[9]-=360.f;
if(i==2)
{
glRotatef(c_angle[9]*3,0.0f,1.0f,0.0f); // 旋转至当前角度
glTranslatef(c_radius[9]*1.3,0.0f,0.0f); // 沿X轴正向移动
glBindTexture(GL_TEXTURE_2D,texture[9]);
gluSphere(quadric,s_radius[9]/4,120,120);
//glutSolidSphere(s_radius[9]/4,15,15);
//c_angle[9]+=c_angle[9]/180;
//if(c_angle[9]>360.0f)
// c_angle[9]-=360.f;
}
glPopMatrix();
}
return TRUE; // 一切 OK
}
GLvoid KillGLWindow(GLvoid) // 正常销毁窗口
{
if (fullscreen) // 我们处于全屏模式吗?
{
ChangeDisplaySettings(NULL,0); // 是的话,切换回桌面
ShowCursor(TRUE); // 显示鼠标指针
}
if (hRC) //我们拥有OpenGL描述表吗?
{
if (!wglMakeCurrent(NULL,NULL)) // 我们能否释放DC和RC描述表?
{
MessageBox(NULL,"释放DC或RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // 我们能否删除RC?
{
MessageBox(NULL,"释放RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // 将RC设为 NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // 我们能否释放 DC?
{
MessageBox(NULL,"释放DC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // 将 DC 设为 NULL
}
if (hWnd && !DestroyWindow(hWnd)) // 能否销毁窗口?
{
MessageBox(NULL,"释放窗口句柄失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // 将 hWnd 设为 NULL
}
if (!UnregisterClass("OpenG",hInstance)) // 能否注销类?
{
MessageBox(NULL,"不能注销窗口类。","关闭错误",MB_OK | MB_ICONINFORMATION);
hInstance=NULL; // 将 hInstance 设为 NULL
}
}
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat; // 保存查找匹配的结果
WNDCLASS wc; // 窗口类结构
DWORD dwExStyle; // 扩展窗口风格
DWORD dwStyle; // 窗口风格
RECT WindowRect; // 取得矩形的左上角和右下角的坐标值
WindowRect.left=(long)0; // 将Left 设为 0
WindowRect.right=(long)width; // 将Right 设为要求的宽度
WindowRect.top=(long)0; // 将Top 设为 0
WindowRect.bottom=(long)height; // 将Bottom 设为要求的高度
fullscreen=fullscreenflag; // 设置全局全屏标志
hInstance = GetModuleHandle(NULL); // 取得我们窗口的实例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移动时重画,并为窗口取得DC
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc处理消息
wc.cbClsExtra = 0; // 无额外窗口数据
wc.cbWndExtra = 0; // 无额外窗口数据
wc.hInstance = hInstance; // 设置实例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 装入缺省图标
wc.hCurs
太阳系(OPENGL)
3星 · 超过75%的资源 需积分: 10 123 浏览量
2008-06-11
23:48:09
上传
评论 1
收藏 557KB RAR 举报
bnutch
- 粉丝: 0
- 资源: 1
最新资源
- WIN10及WIN11系统PL2303USB 串口驱动问题解决方法,亲测好用
- 省 市 县 三级联动 数据字典
- 1D-moc-to-CKJ.py
- VMware vCenter Server 7.0U3r安装ISO的度盘地址,由Patch界面提供,产品界面仍然为7.0U3p
- python脚本-批量修改文件后缀
- VMware vCenter Server 8.0U2d安装ISO的度盘地址,由Patch界面提供,下载界面仍然为8.0U2c
- bge-reranker-base本地模型
- 前端学习笔记,做一个简单的网站-学生成绩.HTML
- go语言实现的简单搜索引擎demo,使用了redis,colly,gin-gonic等技术
- 基于时空图卷积(ST-GCN)的骨骼动作识别(python源码+毕业设计).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈