opengl: 太阳地球和月亮
2013-08-30 21:44
411 查看
// Solar.c
// OpenGL SuperBible
// Demonstrates OpenGL nested coordinate transformations
// and perspective
// Program by Richard S. Wright Jr.
/*原作者: Richard S. Wright Jr, 我在这里学习翻译一下 */
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include <math.h>
// Lighting values
GLfloat whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
//光源位置
GLfloat lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };
// 画场景的回调函数
void RenderScene(void)
{
// 地球和月亮旋转角度
static float fMoonRot = 0.0f;
static float fEarthRot = 0.0f;
// 清除颜色缓存和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 保存矩阵
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
//向远移动场景 -移动到300 处,为地球绕太阳旋转腾出空间
glTranslatef(0.0f, 0.0f, -300.0f);
//设置材料,颜色
// 太阳
glDisable(GL_LIGHTING);
glColor3ub(255, 255, 0);
//在屏幕中心画球体半径15
glutSolidSphere(15.0f, 30, 17);
glEnable(GL_LIGHTING);
//画完太阳,把光源置于屏幕中心!
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
//沿y=1旋转坐标系统 fEarthRot 角度
glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);
//画地球
glColor3ub(0,0,255);
//在距离太阳105处画半径15地球
glTranslatef(105.0f,0.0f,0.0f);
glutSolidSphere(15.0f, 30, 17);
//画围绕地球旋转的月亮
glColor3ub(200,200,200);
//沿着y=1旋转 fMoonRot 角度
glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);
//在距离地球30地方画半径为6月亮
glTranslatef(30.0f, 0.0f, 0.0f);
//月球旋转角度增量
fMoonRot+= 15.0f;
if(fMoonRot > 360.0f)
fMoonRot = 0.0f;
glutSolidSphere(6.0f, 30, 17);
//还原矩阵
glPopMatrix(); // Modelview matrix
//地球旋转角度增量
fEarthRot += 5.0f;
if(fEarthRot > 360.0f)
fEarthRot = 0.0f;
//显示图像
glutSwapBuffers();
}
// 渲染初始化函数,上下文环境设置.
void SetupRC()
{
//设置灯光和坐标
//启用深度测试,有遮挡的效果
glEnable(GL_DEPTH_TEST);
//逆时针为多边形正面
glFrontFace(GL_CCW);
//启用剔除效果,多边形背面不用光照处理
glEnable(GL_CULL_FACE);
//启动灯光效果
glEnable(GL_LIGHTING);
//设置灯泡0
//环境光颜色
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);
//散射光强度
glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
//光源位置
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
//开灯
glEnable(GL_LIGHT0);
//使用颜色材质
glEnable(GL_COLOR_MATERIAL);
//设置材料反射属性, 以相同的强度反射环境光和散射光
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
//黑色背景
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
}
void TimerFunc(int value)
{
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1);
}
void ChangeSize(int w, int h)
{
GLfloat fAspect;
//防止被0除
if(h == 0)
h = 1;
//设置视口大小
glViewport(0, 0, w, h);
//计算屏幕比例
fAspect = (GLfloat)w/(GLfloat)h;
//指定投影矩阵为当前矩阵
glMatrixMode(GL_PROJECTION);
//把坐标系重置为视觉坐标,即屏幕中心
glLoadIdentity();
//设置眼睛睁开的大小(摄像机焦距一般45合适,看到最近1,最远425处的东西),
gluPerspective(45.0f, fAspect, 1.0, 425.0);
//制定模型视图矩阵为当前矩阵
glMatrixMode(GL_MODELVIEW);
//把坐标系重置为视觉坐标,即屏幕中心
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("Earth/Moon/Sun System");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutTimerFunc(250, TimerFunc, 1);
SetupRC();
glutMainLoop();
return 0;
}
效果如下:
// OpenGL SuperBible
// Demonstrates OpenGL nested coordinate transformations
// and perspective
// Program by Richard S. Wright Jr.
/*原作者: Richard S. Wright Jr, 我在这里学习翻译一下 */
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include <math.h>
// Lighting values
GLfloat whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
//光源位置
GLfloat lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };
// 画场景的回调函数
void RenderScene(void)
{
// 地球和月亮旋转角度
static float fMoonRot = 0.0f;
static float fEarthRot = 0.0f;
// 清除颜色缓存和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 保存矩阵
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
//向远移动场景 -移动到300 处,为地球绕太阳旋转腾出空间
glTranslatef(0.0f, 0.0f, -300.0f);
//设置材料,颜色
// 太阳
glDisable(GL_LIGHTING);
glColor3ub(255, 255, 0);
//在屏幕中心画球体半径15
glutSolidSphere(15.0f, 30, 17);
glEnable(GL_LIGHTING);
//画完太阳,把光源置于屏幕中心!
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
//沿y=1旋转坐标系统 fEarthRot 角度
glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);
//画地球
glColor3ub(0,0,255);
//在距离太阳105处画半径15地球
glTranslatef(105.0f,0.0f,0.0f);
glutSolidSphere(15.0f, 30, 17);
//画围绕地球旋转的月亮
glColor3ub(200,200,200);
//沿着y=1旋转 fMoonRot 角度
glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);
//在距离地球30地方画半径为6月亮
glTranslatef(30.0f, 0.0f, 0.0f);
//月球旋转角度增量
fMoonRot+= 15.0f;
if(fMoonRot > 360.0f)
fMoonRot = 0.0f;
glutSolidSphere(6.0f, 30, 17);
//还原矩阵
glPopMatrix(); // Modelview matrix
//地球旋转角度增量
fEarthRot += 5.0f;
if(fEarthRot > 360.0f)
fEarthRot = 0.0f;
//显示图像
glutSwapBuffers();
}
// 渲染初始化函数,上下文环境设置.
void SetupRC()
{
//设置灯光和坐标
//启用深度测试,有遮挡的效果
glEnable(GL_DEPTH_TEST);
//逆时针为多边形正面
glFrontFace(GL_CCW);
//启用剔除效果,多边形背面不用光照处理
glEnable(GL_CULL_FACE);
//启动灯光效果
glEnable(GL_LIGHTING);
//设置灯泡0
//环境光颜色
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);
//散射光强度
glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
//光源位置
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
//开灯
glEnable(GL_LIGHT0);
//使用颜色材质
glEnable(GL_COLOR_MATERIAL);
//设置材料反射属性, 以相同的强度反射环境光和散射光
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
//黑色背景
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
}
void TimerFunc(int value)
{
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1);
}
void ChangeSize(int w, int h)
{
GLfloat fAspect;
//防止被0除
if(h == 0)
h = 1;
//设置视口大小
glViewport(0, 0, w, h);
//计算屏幕比例
fAspect = (GLfloat)w/(GLfloat)h;
//指定投影矩阵为当前矩阵
glMatrixMode(GL_PROJECTION);
//把坐标系重置为视觉坐标,即屏幕中心
glLoadIdentity();
//设置眼睛睁开的大小(摄像机焦距一般45合适,看到最近1,最远425处的东西),
gluPerspective(45.0f, fAspect, 1.0, 425.0);
//制定模型视图矩阵为当前矩阵
glMatrixMode(GL_MODELVIEW);
//把坐标系重置为视觉坐标,即屏幕中心
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("Earth/Moon/Sun System");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
glutTimerFunc(250, TimerFunc, 1);
SetupRC();
glutMainLoop();
return 0;
}
效果如下:
相关文章推荐
- 关于OpenGL入门中地球,月亮,太阳运动模拟无法显示的问题(只显示黑框)
- OpenGL “太阳、地球和月亮”天体运动动画 例子
- OpenGL入门记录--“太阳,地球和月亮”系统代码
- OpenGL 地球,月亮,太阳 相对运动
- OpenGL:太阳、地球、月球模型模拟动画
- 运用Python 模拟太阳-地球-月亮运动模型
- openGL+VS2010的例程--太阳地球月球运动模型增强版(三维)
- OpenGL-----地球与太阳绕转代码
- 太阳、地球、月亮
- 基于C#的2D太阳、地球、月亮运动轨迹模拟实现
- SVG 模拟太阳 地球 月亮旋转
- [OpenGL]使用简单的视角变化实现太阳和地球的转动
- OpenGL模拟太阳、地球、月球公转自转
- 模拟太阳、地球和月亮
- VS 平台下 OpenGL 实现地球、月球、太阳运动
- Transform类 RotateAround() 太阳、地球、月亮围绕旋转
- 太阳、地球、月亮
- openGL+VS2010的例程--太阳地球月球运动模型(三维)
- canvas 模拟地球绕太阳转动 月球绕地球转动
- [OpenGL]利用地球绕日旋转做的简单的光照效果