// This program illustrates both lighting and // relative movement (moon around earth and earth around sun #include "stdafx.h" #using using namespace System; #include #include // 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 }; // Called to draw scene void RenderScene(void) { // Earth and Moon angle of revolution static float fMoonRot = 0.0f; static float fEarthRot = 0.0f; // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Save the matrix state and do the rotations glMatrixMode(GL_MODELVIEW); glPushMatrix(); // Set light position before viewing transformation glLightfv(GL_LIGHT0,GL_POSITION,lightPos); // Translate the whole scene out and into view glTranslatef(0.0f, 0.0f, -300.0f); // Set material color, Red // Sun glColor3ub(255, 255, 0); glutSolidSphere(15.0f, 15, 15);//draws a sphere with radius 15. //the smoothness of the sphere depends on the number of subdivisions //around and along the z axis, the other parameters. // Move the light after we draw the sun! glLightfv(GL_LIGHT0,GL_POSITION,lightPos); // Rotate coordinate system glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);//around y axis, the vector //formed by joining the point (0,1,0) to the origin. // Draw the Earth glColor3ub(0,0,255); glTranslatef(105.0f,0.0f,0.0f); glutSolidSphere(15.0f, 15, 15); // Rotate from Earth based coordinates and draw Moon glColor3ub(200,200,200); glRotatef(fMoonRot,0.0f, 1.0f, 0.0f); glTranslatef(30.0f, 0.0f, 0.0f); fMoonRot+= 15.0f; if(fMoonRot > 360.0f) fMoonRot = 0.0f;//keep angle of rotation under 360 glutSolidSphere(6.0f, 15, 15); // Restore the matrix state glPopMatrix(); // Modelview matrix // Step earth orbit 5 degrees fEarthRot += 5.0f; if(fEarthRot > 360.0f) fEarthRot = 0.0f; // Show the image glutSwapBuffers(); } // This function does any needed initialization for the rendering // context. void SetupRC() { // Light values and coordinates glEnable(GL_DEPTH_TEST); // Hidden surface removal glFrontFace(GL_CCW); // Counter clock-wise polygons face out glEnable(GL_CULL_FACE); // hide back faces // Enable lighting glEnable(GL_LIGHTING); // Setup and enable light 0 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight); glLightfv(GL_LIGHT0,GL_POSITION,lightPos); glEnable(GL_LIGHT0);//tell openGL to use material properties and //lighting parameters in determining the color for each //vertex in the scene. If no material properties are secified, //the scene will remain dark. // Enable color tracking glEnable(GL_COLOR_MATERIAL);//This tells openGL that a function //called glColorMaterial will specify the material //parameters that follow the values set by glColor // Set Material properties to follow glColor values glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // Black background glClearColor(0.0f, 0.0f, 0.0f, 1.0f ); } void TimerFunc(int value) { glutPostRedisplay(); glutTimerFunc(100, TimerFunc, 1);//keep the solar system //from spinning too fast } void ChangeSize(int w, int h) { GLfloat fAspect; // Prevent a divide by zero if(h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Calculate aspect ratio of the window fAspect = (GLfloat)w/(GLfloat)h; // Set the perspective coordinate system glMatrixMode(GL_PROJECTION); glLoadIdentity(); // field of view of 45 degrees, near and far planes 1.0 and 425 gluPerspective(45.0f, fAspect, 1.0, 425.0); // Modelview matrix reset glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow("Earth/Moon/Sun System"); glutReshapeFunc(ChangeSize); glutDisplayFunc(RenderScene); glutTimerFunc(500, TimerFunc, 1); SetupRC(); glutMainLoop(); return 0; }