Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Crystek

Symulacja lotu kosmicznego - animacja

Polecane posty

Witam szanownych forowiczów,

otóż w ramach projektu muszę stworzyć modelowy lot rakiety z Ziemi na Marsa. Matematyczna część symulacji jest wykonana, tzn mam wyznaczone położenia obiektów w kolejnych chwilach czasu -> wyniki wyrzucam np. w postaci pliku tekstowego.

Problem w tym, że muszę wykonać animacje prezentującą cały lot. Dlatego szukam sposobu, aby w jak najprostszy / najszybszy sposób wykonać to zadanie.

Myślałem, nad OpenGL, tylko nie wiem, czy robiąc to 'na pałe' tzn. wyświetlając kolejne klatki animacji, uzyskam dosyć płynny obraz biorąc pod uwagę fakt, że muszę wczytać, odpowiednio przygotować dane do wyświetlenia, narysować scenę.

^Dodam, że w sumie mógłbym sam sobie odpowiedzieć na to pytanie implementując taką metodę, tylko problem jest taki, że nie znam OpenGL w wystarczającym stopniu, a wole czasu nie zmarnować na coś co i tak nie zadziała.

A może macie jakieś inne nie-murzyńskie metody?

Link do komentarza
Udostępnij na innych stronach

Okazało się, że dosyć łatwo zacząć przygodę z OpenGL, a Internet ugina się pod ciężarem podstawowych przykładów i tutoriali, które potem łatwo skleić w jakąś całość.

Obecnie program śmiga i prezentuje 3 kulki które w kolejnych klatkach są rysowane w kolejnych pozycjach - chodzi to całkiem sprawniesmile_prosty.gif

Czasami mnie zadziwia działanie OpenGL i nie potrafię wyjaśnić (pewnie mój błąd w kodzeniu), dlaczego raz obiekt narysowany nad innym wyświetlany jest poprawnie, a w innym przypadku zagadnienie zostało rozwiązane tak samo i nagle kolejność nakładania obiektów nie jest taka jak zamierzona.


//ZIEMIA
glPushMatrix();
glTranslatef(zx, zy, -10.0f);
glColor3f(0.0f,1.0f,0.0f);
glBegin ( GL_TRIANGLES );
glutSolidSphere( 2*6377E6, 12.0f, 12.0f );
glEnd();
glPopMatrix();

//RAKIETA
glPushMatrix();
glTranslatef(rx, ry, 10.0f);
glColor3f(1.0f,1.0f,1.0f);
glBegin ( GL_TRIANGLES );
glutSolidSphere( 2*1000E6, 12.0f, 12.0f );
glEnd();
glPopMatrix();

//MARS
glPushMatrix();
glTranslatef(mx, my, -10.0f);
glColor3f(1.0f,0.0f,0.0f);
glBegin ( GL_TRIANGLES );
glutSolidSphere( 2*3401E6, 12.0f, 12.0f );
glEnd();
glPopMatrix();

Myślałem, że może ziemia swoją objętością zasłania rakietę, jednak wyniesienie rakiety o promień ziemi i tak nie rozwiązuje problemu. Co więcej podobnie określony jest w przestrzeni w kierunku osi Z Mars. Dla Marsa jednak rakieta leci nad nim ( jest wyświetlana) a dla Ziemi już nie...

Też nie rozumiem, dlaczego rysując sferę i dzieląc ją na te równoleżniki i południki, wybierając odpowiedni kolor, w czasie wyświetlania pojawiają się w obiekcie dziury jak gdyby nie cały obiekt był pokryty kolorem ( kolorowymi trójkątami? ) ?

http://i.imgur.com/HARIV.png

Link do komentarza
Udostępnij na innych stronach

Jakie dziwne dziury ? Na tym obrazku dziwna jest ta biała krecha.

Generalnie symptomy wskazują na to, że coś jest nie tak z ZBuffer'em.

Czyścisz bufor głębokości co klatkę ?

Nie zmieniałeś przypadkiem funkcji Z?

Jak masz ustawiony culling? Może te funkcje z glut'a używają odwrotnej kolejności?

Jak tworzysz macierz świata? Może odwróciłeś współrzędną Z? X prawo, Y góra, Z w głąb.

Link do komentarza
Udostępnij na innych stronach

Na początku myślałem, że może wartość zNear w macierzy projekcji, jest za mała, przez co jakimś cudem obiekt znalazł się przed tą wartością i jest niewidoczny - jednak to nie było to. Problem rozwiązał się kiedy narysowałem najpierw ziemie, potem rakietę. Nie wiem w sumie dlaczego to robi różnice - a co najśmieszniejsze (nielogiczne), że nie musiałem wtedy w ogóle manipulować współrzędna wzdłuż osi Z, oba obiekty są narysowane na tym samym poziomie, a mimo to rakieta jest wyżej, mimo że jest mniejsza i w rzeczywistości rakieta byłaby przysłonięta przez ziemię, ze względu na jej gabaryty, aleeeeeee ok...

Na razie tego nie rozumiem i nie wiem czy chcę pilnie wiedzieć dlaczego tak jest :) Najważniejsze jest, że działa i mogę się dalej zająć sesją, bo Diablo już czeka ;p

Problem rozwiązany. Temat można wg mnie zamknąć.

Link do komentarza
Udostępnij na innych stronach

oba obiekty są narysowane na tym samym poziomie, a mimo to rakieta jest wyżej, mimo że jest mniejsza i w rzeczywistości rakieta byłaby przysłonięta przez ziemię, ze względu na jej gabaryty, aleeeeeee ok...
Mhm, rysujesz obiekty w przeciwnym kierunku niż funkcja "cullingu", albo nie działa buffor Z.

Trójkąt można rysować zgodnie lub przeciwnie do ruchu wskazówek zegara.

1 2 1 3

3 2

W zależności od tego jak ustawisz funkcję "cullingu" i jaką kolejność wierzchołków stosujesz będą rysowane trójkąty zewnętrzne, lub wewnętrzne.

Zgaduje, że rysujesz wnętrza obiektów. W efekcie większe planety znajduję się dalej od obserwatora niż mała rakieta.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...