OpenGl rotacja 2d

0

Witam, mam problem z obróceniem figury trójkąta/kwadratu narysowanego w openGL.
Mój kod do rysowania prezentuje się następująco:

glMatrixMode (GL_PROJECTION);
 glLoadIdentity ();
 glOrtho (0, XSize, YSize, 0, 0, 1);
 glMatrixMode (GL_MODELVIEW);
glDisable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT);


 glBegin(GL_POLYGON);

glColor3f(  0.0f, 1.0f, 0.0f);

 glVertex2f(200,200);
 glVertex2f(250,200);
 glVertex2f(250,250);
 glVertex2f(200,250);
 glEnd();

 glBegin(GL_TRIANGLES);
 glColor3f(  1.0f, 0.0f, 0.0f);
 glVertex2f(300,150);
 glVertex2f(250,250);
 glVertex2f(350,250);

 glEnd();

Głowie się z tym przez większość dzisiejszego dnia, próbując wielu sposobów, ale większość powoduje bardzo dziwne zachowanie.
Po obróceniu pozycja środka figury nie powinna ulec zmianie, a przy wielu próbach działo się inaczej.

0

Generalnie w OpenGL manipulujesz osiami współrzędnych, a nie obiektami.

Przykładowo do narysowania obróconego kwadratu musisz rozłożyć rysowanie na parę etapów i stosuj proste zasady:

  • figury rysuj tak, żeby punkt 0,0,0 był środkiem obrotu i idealnie rozmiar każdego boku/średnicy wynosił 1 (ułatwia nie jest to konieczne)
  • żeby powiększyć kwadrat przed narysowaniem go skaluj osie (glScalef)
  • żeby obrócić go przed narysowaniem go obróć osie
  • przed narysowaniem figury zapamiętuj stan osi i po narysowaniu go przywracaj go do stanu poprzedniego (glPushMatrix, glPopMatrix)
  • żeby przeskalować wszystkie figury przeskaluj wszystkie osie przed narysowaniem wszystkich figur które chcesz powiększyć
  • wszystko dzieje się w każdej klatce od nowa

Staraj się nie manipulować zbytnio kamerą jeśli nie rozumiesz co robisz.

Poczytaj o geometrii w grafice 3d bez tego będziesz ślepo wszystko robił

1

Właśnie znalazłem swój kod sprzed paru lat w C++ co na robotyce kiedyś oddałem. Zmodyfikowałem, żeby kompilował się w C++11, łap i edytuj do woli. Mało intuicyjne sterowanie - przeczytaj instrukcje i pobaw się potem w modyfikowanie kodu.

manipulator.7z

Mi poza jedną zmianą (M_PI nie było zdefiniowane) to wszystko chodziło od razu. Może być trochę syfu w kodzie, nie pamiętam co tam jest tak szczerze mówiąc, ale efekt dość estetycznie wyszedł.

1

Nie trać czasu na glVertex(itp) to już jest tak przestarzała metoda że niedługo nie będzie się dało jej używać.

0

@krwq, @xxxxxxxadasdasd, ok, Dzięki. Ale, w takim razie, jakiej biblioteki graficznej powinienem się uczyć/używać myśląc o przyszłości?
Znalazlem kurs OpenGl 3 i 4 http://www.opengl-tutorial.org Co o nim myślicie?

1

Naucz się przekształceń macierzowych i ładuj macierze do karty metodą glLoadMatrix, pamiętaj że glTranslate, glRotate też są przestarzałe i nie należy ich używać. Dodatkowo możesz doszkolić się z kwaternionów
Zapoznaj się z renderowaniem VBO/VAO.
Zapoznaj się z shaderami minimum vertex i pixel, dodatkowo geometry i tessellation
Poczytaj o renderowaniu do tekstury.
Przeczytaj co to Forward Rendering i Deferred Rendering http://gamedevelopment.tutsplus.com/articles/forward-rendering-vs-deferred-rendering--gamedev-12342
Dowiedz się co to stencil buffer i jak go używać, przydatne przy tworzeniu np cieni.
Na koniec zostaje ci poznawanie technik usuwania powierzchni niewidocznych (Portal, PVS, occlusion culling itp).

Mając taką wiedzę możesz zacząć bawić sie w tworzenie własnego silnika do renderowania grafiki. Na pełny silnik 3D to jeszcze troche za mało, brakuje np wiedzy o tym kolizjach, fizyce itp.

0

@xxxxxxxadasdasd wątpie, żeby on chciał kiedykolwiek pisać silnik. Wszystkie macierze, które będzie chciał użyć i tak najpierw trzeba obliczyć, a zamiast ich obliczać można po prostu użyć tych "przestarzałych" funkcji. Przy małej liczbie obiektów zupełnie nie ma to znaczenia. Dodatkowo OpenGL udostępnia możliwość zapamiętania w jaki sposób obiekt był rysowany i sam tworzy sobie takie macierze jeśli odpowiednio użyte. Mam wrażenie, że próbujesz mieszać newbie w głowie.

1

Wiedza którą podałem to taki minimum obecnie do pisania czegokolwiek w opengl 2d lub 3d (nie licząc usuwania powierzchni niewidocznych). Tych przestarzałych metod nie należy używać nie tylko ze względu na wydajność, ale dlatego że mogą przestać być wspierane. Przykładowo opengl es 2.0
Mało tego nowa metoda(VBO) jest równie łatwa w użyciu i dodatkowo kod jest czytelniejszy.
Jeżeli chodzi o macierze to można znaleźć tutorial z gotowymi odpowiednikami przekształceń glRotate i glTransform. Mając taką bibliotekę można później znacznie łatwiej składać przekształcenia i znowu robić to znacznie czytelniej nie zastanawiając sie co jest teraz na stosie macierzy.
W przypadku shadera znowu można skorzystać z gotowych podstawowych shaderów. Mając takie środowisko, możesz później bawić sie shaderam i sprawić że gra będzie ładniejsza.
Poznawanie tych przestarzałych metod w takim przypadku jest stratą czasu.

0

Jeśli robisz coś po to, żeby tylko oddać na uczelni to lepiej używać kodu który ma więcej przykładów w internecie i materiałów do nauki.

0
Abq01 napisał(a):

@krwq, @xxxxxxxadasdasd, ok, Dzięki. Ale, w takim razie, jakiej biblioteki graficznej powinienem się uczyć/używać myśląc o przyszłości?
Znalazlem kurs OpenGl 3 i 4 http://www.opengl-tutorial.org Co o nim myślicie?

krwq napisał(a):

Jeśli robisz coś po to, żeby tylko oddać na uczelni to lepiej używać kodu który ma więcej przykładów w internecie i materiałów do nauki.

Autora interesuje przyszłość opengl, nie odklepanie tego na uczelni.

0

Nie trać czasu na glVertex(itp) to już jest tak przestarzała metoda że niedługo nie będzie się dało jej używać.

Dać się będzie dało, ale lepiej zaczynać od glDrawArrays/glDrawElements.

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