您的位置:首页 > 运维架构

VS 平台下 OpenGL 实现地球、月球、太阳运动

2016-03-09 16:08 519 查看
#include <GL\glut.h>

#include <GL\gl.h>

#include <math.h>

// 旋转的步进值

static float fMoonRot = 0.0f;

static float fEarthRot = 0.0f;

// 设置渲染状态

void SetupRC()

{
// 设置清除窗口的颜色(黑色背景)
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 设置绘图颜色为绿色
glColor3f(0.0f, 1.0f, 0.0f);
// 打开深度测试  根据坐标的远近自动隐藏被遮住的图形
glEnable(GL_DEPTH_TEST);

}

// 绘制场景(显示回调函数)

void RenderScene()

{
//将清除的颜色设为黑色
glClearColor(0.0, 0.0, 0.0,0.0);
// 用黑色清除颜色缓冲以及深度缓冲  glClear():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 保存矩阵状态(模型视图矩阵):即平移、旋转、缩放
// GL_PROJECTION  指明随后的矩阵操作为投影矩阵栈  GL_TEXTURE   指明随后的矩阵操作为纹理矩阵栈
glMatrixMode(GL_MODELVIEW);
//把当前的矩阵数据压栈(就是保存起来)
glPushMatrix();
// 向z轴平移-300.0f,注意是相对于视觉坐标的位置
glTranslatef(0.0f, 0.0f, -300.0f);

// 绘制太阳
glColor3ub(255, 0, 0);
//渲染一个球体 参数1:球体半径 参数2:以z轴上线段为直径分布的圆周线的条数(将z轴看成地球的地轴(经线))
//参数3:围绕在z轴周围的线的条数(纬线)  后两个值较大 渲染时间长  效果逼真
glutSolidSphere(15.0f, 15, 15);
// 旋转坐标系,累加效果
//参数1:旋转的角度
//注意,如果设置的旋转值(x,y,z的值)为正数,那么旋转的方向是逆时针的,如果旋转值是负数,那么旋转的方向是顺时针的。
glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);

// 绘制地球
glColor3ub(60, 60, 255);
// 平移坐标系,累加效果
glTranslatef(105.0f, 0.0f, 0.0f);
// 设置地球的旋转步进
fEarthRot += 5.0f;
if (fEarthRot > 360.0f) {
fEarthRot = 0.0f;
}
glutSolidSphere(15.0f, 15, 15);

// 绘制月球
glColor3ub(200, 200, 200);
// 旋转坐标系,累加效果
glRotatef(fMoonRot, 0.0f, 1.0f, 0.0f);
// 平移坐标系,累加效果
glTranslatef(30.0f, 0.0f, 0.0f);
// 设置月亮的旋转步进
fMoonRot += 15.0f;
if (fMoonRot > 360.0f) {
fMoonRot = 0.0f;
}
glutSolidSphere(6.0f, 15, 15);

// 恢复矩阵原来的状态(当前坐标系与视觉坐标重合)
glPopMatrix();

// 执行双缓冲交换
glutSwapBuffers();

}

// 当窗口大小改变时由GLUT函数库调用

void ChangeSize(GLsizei w, GLsizei h)

{
// 窗口的纵横比
GLfloat fAspect;
// 防止被0除
if (0 == h) {
h = 1;
}
// 将视口设置为窗口的大小
glViewport(0, 0, w, h);
// 计算窗口的纵横比
fAspect = (GLfloat)w / (GLfloat)h;
// 设置当前操作的矩阵为投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 定义平截头体, 45度视野,近、远平面为1.0和425.0
gluPerspective(45.0f, fAspect, 1.0, 425.0);
// 设置当前操作的矩阵为模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

// 计时器函数,每秒触发10次窗口重绘事件

void TimerFunc(int value)

{
glutPostRedisplay();
//glutTimerFunc(毫秒数, 回调函数指针, 区别值);
glutTimerFunc(100, TimerFunc, 1);//需要在函数中再调用一次,才能保证循环

}

int main(int argc, char *argv[])

{
// 传递命令行参数,并对GLUT函数库进行初始化
glutInit(&argc, argv);
// 设置创建窗口时的显示模式(双缓冲区、RGB颜色模式)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
// 设置窗口的初始大小
glutInitWindowSize(500, 400);
//设置窗口所在位置
glutInitWindowPosition(300, 300);
// 创建窗口
glutCreateWindow("Test");
// 绘制RenderScene里的内容
glutDisplayFunc(RenderScene);
// 设置当窗口的大小发生变化时的回调函数
glutReshapeFunc(ChangeSize);
// 设置计时器函数
glutTimerFunc(100, TimerFunc, 1);
// 设置渲染状态
SetupRC();
// 启动GLUT框架的运行,一经调用便不再返回,直到程序终止
glutMainLoop();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: