2013-05-23 13 views
7

Sto lavorando al sistema solare e sto cercando di ottenere che il sole sia la fonte di luce centrale di questo programma, ma non funziona come pensavo.Sole come sorgente di luce usando opengl e C++

Ecco un'immagine di ciò che ho senza illuminazione. enter image description here

Ecco lo stesso programma con illuminazione.

enter image description here

un angolo diverso qui in modo da poter vedere che la Terra non ha ombra, come si suppone (ignorare il rosso sulla luna, questo è il mio riferimento)

enter image description here

Non so se puoi dirlo, ma sembra che la luce sia centrata in ogni sfera e non nel Sole. L'ombra sulla Terra è come se la luce provenisse dall'alto. Lo stesso con il sole. Il Sole qui non è una fonte di luce, è solo una sfera che viene anche illuminata da qualche fonte. Non c'è ombra dalla Terra sulla luna o dalla luna sulla Terra.

Questo qui è il codice che disegna il sistema

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; 

Queste prossime due funzioni sono responsabili per le coordinate e disegnare le sfere

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(); 

} 

Se sto fuori strada su quello che sto facendo potresti indicarmi un buon tutorial? Ne ho letti alcuni, ma credo di non averli compresi come pensavo di aver fatto. Se sono sulla buona strada, potresti mostrarmi dove ho sbagliato e cosa devo fare bene?

+0

Mi sembra bello, cosa stai cercando di ottenere esattamente? Forse non ho capito bene. –

+0

Metto un'altra immagine qui ... La luce della Terra non viene dal sole. – TRod

+0

Oh, intendi un'ombra della luna sulla Terra. Era difficile da capire dalla foto. –

risposta

3

È necessario chiamare glLightfv(GL_LIGHT0, GL_POSITION, pos); e impostare la posizione della sorgente luminosa al centro del sole.

+0

che tipo di variabile è 'pos'? Continuo a ricevere un errore quando lo faccio. Errore sotto: Nella funzione membro 'virtual void SolarSystem :: display (GLContextData &) const': solarSystem.cpp: 31: 40: errore: impossibile convertire 'float' in 'const GLfloat * {aka const float *}' per argomento '3' a 'void glLightfv (GLenum, GLenum, const GLfloat *)' make: *** [o/g ++ - 3.g0.O3/solarSystem.o] Errore 1 – TRod

+2

La componente W della posizione è anche importante da menzionare però. Se la componente w della posizione è 0, la luce viene trattata come una sorgente direzionale. – Grimmy

+0

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