#include <iostream>
#define NDEBUG
#include <GL/glut.h>
#include <stdlib.h>
static int year = 0, day = 0, moon = 0;
void init(void)
{
//glClearColor(0.0, 0.0, 0.0, 0.0);
//glShadeModel(GL_SMOOTH);
//Sun
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
GLfloat Light_Model_Ambient[] = { 0.2f , 0.2f , 0.2f , 1.0f }; //
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient); //
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
{
GLfloat sun_light_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_ambient);
//glutWireSphere(1.0, 20, 16); /* draw sun */
glRotatef((GLfloat)year, 0.0, 1.0, 0.0);
glutSolidSphere(1.0, 20, 16);
}
{
GLfloat sun_light_ambient[] = { 0.0, 1.0, 0.0, 0.0 };
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_ambient);
glTranslatef(2.0, 0.0, 0.0);
glRotatef((GLfloat)day, 0.0, 1.0, 0.0);
//glutWireSphere(0.2, 10, 8); /* draw earth */
glutSolidSphere(0.2, 10, 8);
}
{
GLfloat sun_light_ambient[] = { 1.0, 0.0, 0.0, 0.0 };
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_ambient);
glTranslatef(1.0, 0.0, 0.0);
glRotatef((GLfloat)moon, 0.0, 1.0, 0.0);
//glutWireSphere(0.15, 10, 8); /* draw moon */
glutSolidSphere(0.15, 10, 8);
}
glPopMatrix();
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glutSolidTeapot(0.5);
glFlush();
glutPostRedisplay();
}
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, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
/*glViewport(0, 0, (GLsizei)w, (GLsizei)h);
/glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-1.5, 1.5, -1.5 * (GLfloat)h / (GLfloat)w,
1.5 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
else
glOrtho(-1.5 * (GLfloat)w / (GLfloat)h,
1.5 * (GLfloat)w / (GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();*/
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'A':
day = (day + 10) % 360;
moon = (moon + 5) % 360;
glutPostRedisplay();
break;
case 'D':
day = (day - 10) % 360;
glutPostRedisplay();
break;
case 'S':
year = (year + 5) % 360;
day = (day + 10) % 360;
moon = (moon + 5) % 360;
glutPostRedisplay();
break;
case 'Q':
year = (year - 5) % 360;
glutPostRedisplay();
break;
case 'W':
moon = (moon + 5) % 360;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);//窗口使用RGB颜色,单缓存和深度缓存
glutInitWindowSize(800, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
OpenGL学习笔记(六)太阳 地球 月亮 键盘控制
最新推荐文章于 2025-05-30 22:49:20 发布