OpenGL 实现模拟太阳系运动

#include 

static int year = 0, day = 0;
static int sun = 0;

void init()
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glShadeModel(GL_FLAT);
}

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0);

	glPushMatrix();

	glRotatef((GLfloat)sun, 0.0, 1.0, 0.0);
	glutWireSphere(1.0, 20, 16);
	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, 10, 8);

	glPopMatrix();

	glutSwapBuffers();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei)w, (GLsizei)h);
	glMatrixMode(GL_PROJECTION);

	glLoadIdentity();
	gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void keyboard(unsigned char key, int x, int y)
{
	switch (key)
	{

	case 'd':
		day = (day + 10) % 360;
		sun = (sun + 1) % 360;
		glutPostRedisplay();
		break;

	case 'D':
		day = (day - 10) % 360;
		sun = (sun + 1) % 360;
		glutPostRedisplay();
		break;

	case 'y':
		year = (year + 5) % 360;
		sun = (sun + 1) % 360;
		glutPostRedisplay();
		break;

	case 'Y':
		year = (year - 5) % 360;
		sun = (sun + 1) % 360;
		glutPostRedisplay();
		break;

	default:
		break;
	}
}

int main(int argc, char **argv)
{
	glutInit(&argc, argv);
	glutInitWindowSize(500, 500);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutCreateWindow(argv[0]);

	init();

	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutMainLoop();

	return 0;
}


太阳系会自己转动,行星会自传以及绕着太阳进行旋转,因此行星先进性绕着太阳的转动在全局坐标系进行旋转,之后偏移到指定的位置,然后在自己的局部坐标系中进行自传

你可能感兴趣的:(编程,OpenGL)