2013-05-23 6 views
7

Ich arbeite an dem Sonnensystem und ich versuche, die Sonne zu der zentralen Lichtquelle dieses Programms zu machen, aber es funktioniert nicht so, wie ich dachte.Sonne als Lichtquelle mit OpenGL und C++

Hier ist ein Bild von dem, was ich ohne Beleuchtung habe. enter image description here

Hier ist das gleiche Programm mit Beleuchtung.

enter image description here

Ein anderer Winkel hier so, dass sich die Erde hat keinen Schatten sehen kann, wie es soll (die rote auf dem Mond ignorieren, das ist für meine Referenz)

enter image description here

Ich weiß nicht, ob du es sehen kannst, aber es sieht so aus, als ob das Licht in jeder Kugel zentriert ist und nicht in der Sonne. Der Schatten auf der Erde ist so, als würde das Licht von oben kommen. Gleich mit der Sonne. Die Sonne ist hier keine Lichtquelle, es ist nur eine Kugel, die auch von irgendeiner Quelle beleuchtet wird. Es gibt keinen Schatten von der Erde auf dem Mond oder vom Mond auf der Erde.

Das hier ist der Code, der das System

GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; 
GLfloat pos[] = { 0.0, 0.0, 1.0, 0.0 }; 
glEnable(GL_LIGHTING); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 
glLightf(GL_LIGHT0, GL_POSITION, pos); 
//SUN 
     //Picture location, major radius, minor radius, major orbit, minor orbit, angle 
Planet Sun ("/home/rodrtu/Desktop/SolarSystem/images/Sun.png", 
      100, 99, 200.0, 0.0, 0.0); 
double sunOrbS = 0; 
double sunRotS = rotatSpeed/10; 
//orbit speed, rotation speed, moon reference coordinates (Parent planet's major and minor Axis) 
Sun.displayPlanet(sunOrbS, sunRotS, 0.0, 0.0); 

//EARTH 
Planet Earth ("/home/rodrtu/Desktop/SolarSystem/images/EarthTopography.png", 
      50, 49, 500.0, 450.0, 23.5); 
double eaOrbS = orbitSpeed*2; 
double eaRotS = rotatSpeed*5; 

Earth.displayPlanet(eaOrbS, eaRotS, 0.0, 0.0); 
//Orbit path 
drawCircle(800, 720, 1, 50); 

//EARTH'S MOON 
Planet Moon ("/home/rodrtu/Desktop/SolarSystem/images/moonTest.png", 
      25, 23, 100.0, 100.0, 15); 
double moOrbS = rotatSpeed*4; 
double moRotS = eaOrbS; 

Moon.displayPlanet(moOrbS, moRotS, Earth.getMajorAxis(), Earth.getMinorAxis()); 

orbitSpeed+=.9; 
if (orbitSpeed > 359.0) 
orbitSpeed = 0.0; 

rotatSpeed+=2.0; 
if (rotatSpeed > 719.0) 
rotatSpeed = 0.0; 

Diese beiden nächsten Funktionen sind verantwortlich für die Koordinaten zieht und zeichnen die Kugeln

void Planet::setOrbit(double orbitSpeed, double rotationSpeed, 
       double moonOrbitX, double moonOrbitY) 
{ 
    majorAxis = orbitSemiMajor * cos(orbitSpeed/180.0 * Math::Constants<double>::pi); 
    minorAxis = orbitSemiMinor * sin(orbitSpeed/180.0 * Math::Constants<double>::pi); 

    glTranslate(majorAxis+moonOrbitX, minorAxis+moonOrbitY, 0.0); 
    glRotatef(orbitAngle, 0.0, 1.0, 1.0); 
    glRotatef(rotationSpeed, 0.0, 0.0, 1.0); 

} 

void Planet::displayPlanet(double orbitSpeed,double rotationSpeed, 
       double moonOrbitX, double moonOrbitY) 
{ 
    GLuint surf; 
    Images::RGBImage surfaceImage; 
    surfaceImage=Images::readImageFile(texture); 
    glEnable(GL_TEXTURE_2D); 
    glGenTextures(0, &surf); 
    glBindTexture(GL_TEXTURE_2D, surf); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB); 

    glPushMatrix(); 
    setOrbit(orbitSpeed,rotationSpeed, moonOrbitX, moonOrbitY); 
    drawSolidPlanet(equatRadius, polarRadius, 1, 40, 40); 
    glPopMatrix(); 

} 

Wenn ich weg auf bin, was ich tue, Könntest du mich auf ein gutes Tutorial hinweisen? Ich habe ein paar gelesen, aber ich glaube, ich habe sie nicht so verstanden, wie ich gedacht habe. Wenn ich auf dem richtigen Weg bin, könntest du mir zeigen, wo ich falsch liege und was ich tun muss, richtig?

+0

Das sieht für mich gut aus, was genau willst du erreichen? Ich habe vielleicht nicht richtig verstanden. –

+0

Ich werde hier ein anderes Bild machen ... Das Licht der Erde kommt nicht von der Sonne. – TRod

+0

Oh, du meinst einen Schatten vom Mond auf der Erde. Es war schwer von dem Bild zu unterscheiden. –

Antwort

3

Sie müssen glLightfv(GL_LIGHT0, GL_POSITION, pos); anrufen und die Position der Lichtquelle auf das Zentrum der Sonne einstellen.

+0

Welche Variable ist 'pos'? Ich bekomme immer einen Fehler, wenn ich das mache. Fehler unten: In Mitgliedsfunktion 'virtual void SolarSystem :: display (GLContextData &) const': solarSystem.cpp: 31: 40: Fehler: kann 'float' nicht in 'const GLfloat * {aka const float *}' konvertieren für Argument '3' zu 'void glLightfv (GLenum, GLenum, const GLfloat *)' make: *** [o/g ++ - 3.g0.O3/solarSystem.o] Fehler 1 – TRod

+2

Die W-Komponente der Position ist auch wichtig zu erwähnen, obwohl. Wenn die w-Komponente der Position 0 ist, wird das Licht als eine gerichtete Quelle behandelt. – Grimmy

+0

http://www.khronos.org/opengles/sdk/1.1/docs/man/glLight.xml – Grimmy