OpenGL:太阳、地球、月球模型模拟动画
2016-04-01 20:21
417 查看
源代码:
#include<stdio.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include<gl/GLUT.H>
static float year = 0, day = 0;
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);//设定着色模式,使用图元中某个顶点的颜色来渲染整个图元。
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
glPushMatrix();
gluLookAt(0.0,0.0,5,0.0,0.0,0.0,0.0,1.0,0.0);
//绘制太阳
glRotatef((GLfloat)year,0.0,1.0,0.0);
glutWireSphere(0.8,20,20);
//绘制地球
glRotatef((GLfloat)year,0.0,1.0,0.0);
glTranslatef(2.0,0.0,0.0);
glRotatef((GLfloat)day,0.0,1.0,0.0);
glutWireSphere(0.2,20,20);
//绘制月球
glRotatef((GLfloat)year,0.0,1.0,0.0);
glTranslatef(0.4,0.0,0.0);
glRotatef((GLfloat)day,0.0,1.0,0.0);
glutWireSphere(0.1,15,15);
//glutWireCube(2.0);
glPopMatrix();
glutSwapBuffers();
}
void spinDisplay(void)
{
year = year + 0.03;
if ( year > 360.0)
{
year = year - 360.0;
}
day = day + 0.06;
if ( day > 360.0)
{
day = day - 360.0;
}
glutPostRedisplay();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei) w,(GLsizei) h);//函数作用:用一个视景体截取图像
//glFrustum(-1.0,1.0,-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_PROJECTION);//mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,参数表示接下来要进行投影相关的操作
glLoadIdentity();//设置当前变化矩阵为单位矩阵;单位矩阵就是对角线上都是1,其余元素皆为0的矩阵。然后复位
//glOrtho(-3.0,3.0,-3.0,3.0,-3.0,3.0);
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20);
glMatrixMode(GL_MODELVIEW);//进行视景相关的操作
//glLoadIdentity();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(600,600);
glutInitWindowPosition(50,50);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(spinDisplay);
glutMainLoop();
return 0;
}
效果:
重要函数之:
gluLookAt(0.0,0.0,5,0.0,0.0,0.0,0.0,1.0,0.0);
作用:视点变换,初始化矩阵后,可使用此函数来制定视点变换,相当于设置相机的位置和方向。
参数理解:
第一组(三个数据为一组):脑袋的位置
第二组:看得物体的位置
第三组:头顶朝向的方向
#include<stdio.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include<gl/GLUT.H>
static float year = 0, day = 0;
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);//设定着色模式,使用图元中某个顶点的颜色来渲染整个图元。
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
glPushMatrix();
gluLookAt(0.0,0.0,5,0.0,0.0,0.0,0.0,1.0,0.0);
//绘制太阳
glRotatef((GLfloat)year,0.0,1.0,0.0);
glutWireSphere(0.8,20,20);
//绘制地球
glRotatef((GLfloat)year,0.0,1.0,0.0);
glTranslatef(2.0,0.0,0.0);
glRotatef((GLfloat)day,0.0,1.0,0.0);
glutWireSphere(0.2,20,20);
//绘制月球
glRotatef((GLfloat)year,0.0,1.0,0.0);
glTranslatef(0.4,0.0,0.0);
glRotatef((GLfloat)day,0.0,1.0,0.0);
glutWireSphere(0.1,15,15);
//glutWireCube(2.0);
glPopMatrix();
glutSwapBuffers();
}
void spinDisplay(void)
{
year = year + 0.03;
if ( year > 360.0)
{
year = year - 360.0;
}
day = day + 0.06;
if ( day > 360.0)
{
day = day - 360.0;
}
glutPostRedisplay();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei) w,(GLsizei) h);//函数作用:用一个视景体截取图像
//glFrustum(-1.0,1.0,-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_PROJECTION);//mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,参数表示接下来要进行投影相关的操作
glLoadIdentity();//设置当前变化矩阵为单位矩阵;单位矩阵就是对角线上都是1,其余元素皆为0的矩阵。然后复位
//glOrtho(-3.0,3.0,-3.0,3.0,-3.0,3.0);
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20);
glMatrixMode(GL_MODELVIEW);//进行视景相关的操作
//glLoadIdentity();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(600,600);
glutInitWindowPosition(50,50);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(spinDisplay);
glutMainLoop();
return 0;
}
效果:
重要函数之:
gluLookAt(0.0,0.0,5,0.0,0.0,0.0,0.0,1.0,0.0);
作用:视点变换,初始化矩阵后,可使用此函数来制定视点变换,相当于设置相机的位置和方向。
参数理解:
第一组(三个数据为一组):脑袋的位置
第二组:看得物体的位置
第三组:头顶朝向的方向
相关文章推荐
- 《Linux操作系统分析》之分析Linux内核创建一个新进程的过程
- 编译安装nginx及简单优化配置
- Linux平台下变量在栈帧中的存储
- I.MX6 Android Linux shell MMPF0100 i2c 获取数据
- linux常用命令之cat使用方法
- Hadoop 学习自定义数据类型
- .bash_profile
- CentOS 6.0 启动时出现fstab错误时的修复
- 如何禁用centos7中的ipv6
- popupwindow放的位置有错,又找不到原因?可能是这个搞了我一天的问题。
- Tomcat源码导入eclipse的步骤
- 从MVC框架看MVC架构的设计
- linux命令(二)uname命令
- linux中eclipse报错: program g++ not found in path
- linux 文件夹/文件管理
- Linux工作管理(job control)
- OpenGL(二)
- Linux系统中主要系统目录的功能
- Apache Shiro去掉URL中的JSESSIONID
- Linux常用软件总结