OpenGL实现太阳,地球,月球的公转与自转


//光照模型必须保留reshape 和开启深度

#include "stdafx.h"
#include <GL/glut.h>
#include "math.h"
GLint b;//默认初始值为0
void display(void)
{
	gluLookAt(1,0.5,1,0,0,0,0,1,0);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
         	glLoadIdentity();
	glColor3f(1.0,0.0,0.0);
	glRotatef(b,0,1,0);//自传函数 旋转10度
	glutSolidSphere(3.0,40,40);//半径为3 10 条经线 10 条纬线  原来是线框的经纬线 将WIRER 改为 sOLID时候 球不圆
	
	glTranslatef(6, 0, 0);//相对于原点中心地平移
	glRotatef(b,0,1,0);
	glColor3f(0.0,0.0,1.0);
	glutSolidSphere(1.0,20,20);
	
	//月亮转
	glTranslatef(2.0, 0, 0);//不是相对于原点平移 是在上一个基础上再次平移 所以只需要2.0即可
	glRotatef(b,0,1,0);
	glColor3f(1.0,1.0,0.0);
	glutSolidSphere(0.5,10,10);
	glutSwapBuffers();
}

void time(int value)
{
	b+=2;
	//为防止b的数据溢出 对b进行一个判断
	if(b>=360)
		b=b-360;
	glutPostRedisplay();//表示再次调用display
	//回调time函数
	glutTimerFunc(30,time,1);
}
void reshape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if(w<h)
	glOrtho(-10, 10, -10,10 * (GLfloat)h / (GLfloat)w, -10, 10 );
	else
		glOrtho(-10 * (GLfloat)w / (GLfloat)h, 10, -10 ,10, -10,10 );
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity();
}

void init ()
{
glClearColor(1.0,1.0,1.0,0.0);//设置白色背景
glColor3f(1.0,1.0,0.0);//
//漫反射 位置参数赋值
GLfloat light0_diffuse[]= { 1.0, 1.0, 1, 1.0};
//打开灯光时如需保留图形颜色,使用颜色材质:glEnable(GL_COLOR_MATERIAL);

GLfloat light0_position[] = { 1.0, 1.0, 1.0, 0.0 };
//调用漫反射 位置
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION,light0_position);
glShadeModel(GL_SMOOTH);//光滑着色,过渡色效果
glEnable(GL_LIGHTING);//启动光照,总开关
glEnable(GL_LIGHT0);//打开0号光源
glEnable(GL_DEPTH_TEST);//打开深度缓冲区,3D时候用
glEnable(GL_COLOR_MATERIAL);

}

int main(int argc, char* argv[])
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);//SINGLE对应glfush()改为double对应glutSwapBuffers();
	glutInitWindowPosition(200,200);
    glutInitWindowSize(500,500);
	glutCreateWindow("001");
	init();
	glutTimerFunc(30,time,1);//每隔30ms调用time函数
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}

运行结果

 

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值