[C++, OpenGL] Zanikający obraz podczas animacji

0

Witam,
Posiadam animacje dwóch planet, krążących wokół Słońca. Ziemia, oddalona troszke dalej, w trakcie obrotu przestaje byc wyswietlana na ekranie. Dzieje sie tak za Sloncem, na przestrzeni od ok. 200-300 stopnia- znika. To pewnie dosc popularny problem, moze z perspektywa lub głebia? Nie mam pomysłu dlaczego. Dodam, że Merkury jest widoczny nieprzerwanie wykonując pełen 360' obrót.

Niebieski punkt to Merkury. W tym momencie Ziemi nie widać, choć jest za Słońcem. Za kilka klatek pojawi się znowu :/
http://img113.imageshack.us/my.php?image=przykladrs3.jpg

Troche kodu, wydaje mi sie, ze gdzies tu jest blad:

// Wspolrzedne polozenia obserwatora
GLdouble okoX = -8.0;
GLdouble okoY = 5.0;
GLdouble okoZ = -15.0;

// Wspolrzedne punktu, na ktory zorientowany jest obserwator
GLdouble patrzX = 0;
GLdouble patrzY = 0;
GLdouble patrzZ = 0;


void oSlonce() {
   glColor3f(2.0,0.0,0.0);
   glutWireSphere(1.0, 20, 20);
}

// Animacja: Merkury
void oMerkury() {
   // Obroc Merkury wedlug roku ziemskiego
   glPushMatrix();
   glRotatef ((GLfloat) Proporcja(1,Merkury.obiegaSlonce)+(Merkury.dzien*Proporcja(1,Merkury.obiegaSlonce)), 0.0, 1.0, 0.0);
   glTranslatef (2.0, 0.0, 0.0);    
   glColor3f(0.0,2.0,1.0);
   glutWireSphere(Proporcja(0,Merkury.srednicaRownikowa), 10, 8);  
   glPopMatrix(); 
}

// Animacja: Ziemia
void oZiemia() {
   glPushMatrix();
   glRotatef ((GLfloat) Proporcja(1,Ziemia.obiegaSlonce)+(Ziemia.dzien*Proporcja(1,Ziemia.obiegaSlonce)), 0.0, 1.0, 0.0);
   glTranslatef (8.0, 0.0, 0.0);    
   glColor3f(0.0,2.0,0.0);
   glutWireSphere(Proporcja(0,Ziemia.srednicaRownikowa), 10, 8);  
   glPopMatrix(); 
}

void Reshape(int width,int height) {     
     glViewport (0, 0, (GLsizei) width, (GLsizei) height); 
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
     gluPerspective(60.0, (GLfloat) width/(GLfloat) height, 1.0, 20.0);
     gluLookAt (okoX,okoY,okoZ,patrzX,patrzY,patrzZ, 0.0, 1.0, 0.0);
     Display();
}

// Funkcja generujaca scene
void Display() {
   glClearColor (0.0, 0.0, 0.0, 1.0);      
   glClear(GL_COLOR_BUFFER_BIT);
   oSlonce();
   oMerkury();  
   oZiemia();
   glFlush();
   glutSwapBuffers();
}

// Menu klawiaturowe
void MenuKlawiatura(unsigned char znak, int x, int y) {
    switch (znak) {
           case 'q' : exit(1); break;
           case '+' : okoY -= 0.1; 
                      Reshape(glutGet(GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break;
           case '-' : // Animacja jednego roku ziemskiego
                      for (int i=1; i<=365; i++) {
                          if (Merkury.dzien == Merkury.obiegaSlonce) Merkury.dzien = 1; else Merkury.dzien++;
                          if (Ziemia.dzien == Ziemia.obiegaSlonce) Ziemia.dzien = 1; else Ziemia.dzien++;
                      
                          Reshape(glutGet(GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
                      }  break;           
    } 
}

Jesli bedzie potrzebne cos wiecej to zamieszcze. Display() nie posiada nic nadzwyczajnego.
Pozdrawiam

0

gluPerspective(60.0, (GLfloat) width/(GLfloat) height, 1.0, 20.0);

podkreślony parametr far_plane sobie zmień na większy, np. 200.0 lub experymentalnie sobie dobierz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1