2013-05-23 25 views
7

Pracuję nad układem słonecznym i staram się, aby słońce było centralnym źródłem światła tego programu, ale nie działa tak, jak myślałem.Słońce jako źródło światła przy użyciu opengl i C++

Oto zdjęcie tego, co mam bez oświetlenia. enter image description here

Oto ten sam program z oświetleniem.

enter image description here

inny kąt tutaj, dzięki czemu można zobaczyć, że Ziemia nie ma cienia, jak to ma (zignorować czerwony na Księżycu, to dla mojego odniesienia)

enter image description here

Nie wiem, czy potrafisz powiedzieć, ale wygląda na to, że światło skupia się w każdej sferze, a nie w Słońcu. Cień na Ziemi jest taki, jakby światło nadchodziło od góry. To samo dotyczy Słońca. Słońce tutaj nie jest źródłem światła, jest tylko kulą, która jest również oświetlana przez jakieś źródło. Nie ma cienia z Ziemi na Księżycu lub z Księżyca na Ziemi.

ten oto kod, który czerpie z systemu

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; 

Te kolejne dwie funkcje są odpowiedzialne za współrzędnych i rysunek sfer

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

} 

Jeśli jestem daleko od tego, co robię czy możesz wskazać mi na dobry samouczek? Przeczytałem kilka, ale myślę, że nie rozumiałem ich tak jak myślałem. Jeśli jestem na dobrej drodze, czy możesz pokazać mi, gdzie się mylę i co muszę zrobić dobrze?

+0

Wygląda dobrze dla mnie, co dokładnie próbujesz osiągnąć? Być może nie zrozumiałem poprawnie. –

+0

Podam tutaj inny obraz ... Światło Ziemi nie pochodzi od Słońca. – TRod

+0

Och, masz na myśli cień z księżyca na Ziemi. Trudno było odróżnić od obrazu. –

Odpowiedz

3

Należy zadzwonić pod numer glLightfv(GL_LIGHT0, GL_POSITION, pos); i ustawić pozycję źródła światła na środek słońca.

+0

jaka jest zmienna "pos"? Wciąż robię błąd, kiedy to robię. Błąd poniżej: W funkcji użytkownika 'wirtualna pustka SolarSystem :: display (GLContextData &) const': solarSystem.cpp: 31: 40: error: nie można przekonwertować 'float' na 'const GLfloat * {vel flo float *}' dla argumentu "3" do "void glLightfv (GLenum, GLenum, const GLfloat *)" make: *** [o/g ++ - 3.g0.O3/solarSystem.o] Błąd 1 – TRod

+2

Składnik W pozycji jest również ważne, aby o tym wspomnieć. Jeśli składowa w pozycji wynosi 0, światło traktowane jest jako źródło kierunkowe. – Grimmy

+0

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