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