Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OPENGL] glViewport a gluOtrho2d

Ostatnio zmodyfikowano 2010-10-22 08:41
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
[OPENGL] glViewport a gluOtrho2d
» 2010-10-19 23:42:45
witam, stawiam pierwsze kroki w opengl :) po przeanalizowaniu paru kursow( namalowalem juz ten trojkacik wielokolorowy i pare innych figur) zastanawiam sie nad funkcjami wymienionymi w temacie, poniewaz w roznych kursach, funkcja resize() raz zmienia wlasnie glViewport a raz gluOrtho2D(do rzutowania prostokatnego) - pierwsza jak doczytalem, okresla rozmiar obszaru renderowania (okreslamy brzegi lewy, prawy, gorny i dolny), a druga obcina obszar widocznosci przyjmujac lewa, prawa, gorna i dolna powierzchnie jako parametry, i poza nimi brak widocznosci, wiec chcialem zapytac, ktora prawidlowo powinna byc uzywana w kodzie na resize()?

po drugie, chcialem zapytac, czego lepiej uzywac, wymiarow typu 1.0f, -2,0f,  czy wartosci w pixelach 100, 550 - przy rysowaniu?

po trzecie, czy dobrze rozumiem, ze gluOrtho2D(-2.0f,2.0f,-2.0f,2.0f) - dostepne bedzie cale okno, podzielone na 4jednostki x 4jednostki,domyslnie ze srodkiem w srodku monitora, 2 w prawo, 2 w lewo, tak samo gora i dol?

po czwarte - initializeGL() - co na pewno powinno sie tu znalezc? czasem podawane jest np kolor czyszczenia bufora, a czasem podawany jest on w funkcji rysujacej, czy glViewport tam dawac? czy "resetowac" MatrixMode i ProjectionMode, czy dopiero przy resize i rysowaniu?

mam nadzieje, ze te pytania nie sa jakos zawile, a wole dobrze wszytsko zrozumiec, w kursach raczej pobieznie jest to opisane, probuje tez eksperymentowac, ale wole sie upewnic, czy wszytskie dotad poznane mechanizmy dobrze rozumiem, zanim przejde dalej

i jeszcze jedno mi sie przypomnialo - resize jest wywolywane automatycznie, przy zmianie rozmiarow okna, ale czy musze tez wywolywac rysowanie w resize? bo w niektorych kursach tak wlasnie jest (ja uzywam QT do okienek, wiec moze tu inne mechanizmy dzialaja)

ps>> do ostatniego pytania chyba doszedlem juz do odp - qt od razu przy zmianie rozmiaru robi repaint() - wiec nie musze wywolywac osobno - a doszedlem do tego - probujac poruszac obiektem - zmienial polozenie dopiero przy zmianie wielkosci okna, dopiero jak po ruchu dopisalem repaint - ruch byl aktualizowany na biezaco :)


P-23049
VND
» 2010-10-21 23:25:27
Ad1. Obie ;)
Funkcję resize powinieneś wywołać po każdej zmianie rozmiaru okna, jeśli QT nie robi tego automatycznie.

Obie te instrukcje powinny się znaleźć w funkcji resize, ponieważ służą do czego innego. To nie jest ta sama instrukcja, ale z innym zestawem argumentów.
glViewport służy do ustalenia obszaru rysowania na ekranie, argumenty podaje się w pixelach. Defaultowo obejmuje cały ekran, ale można to zmienić i rysować np: prawej górnej w ćwiartce ekranu. Można w ten sposób uzyskać na przykład ekran z podglądem z kilku kamer albo rysować kilka scen jednocześnie.
Składnia: glViewport(x,y,szerokość,wysokość) x,y - współrzędne lewego dolnego rogu, szerokość, wysokość  - obszar rysowania
Tak dla przypomnienia punkt (0,0) to lewy dolny narożnik ekranu, ale to pewnie wiesz. ;)

gluOrtho2D - to instrukcja do ustalenia macierzy rzutowania, w tym przypadku 2D. Tak po ludzku mówiąc, ustala współrzędne rogów ekranu w przestrzeni 3D i ustawia odpowiednio macierz rzutowania.

W OpenGL są dwa rodzaje macierzy rzutowania. Perspektywiczna i ortogonalna(równoległa/prostokątna). Pierwsza powoduje, że narysowane obiekty maleją ze wzrostem współrzędnej z (a właściwie z pomniejszaniem bo patrzysz w kierunku ujemnej osi z ;) )
Czyli tak jak w normalnym świecie, wszystko co jest dalej jest mniejsze. Druga służy do wyświetlania obiektów bez perspektywy. Jeśli narysujesz dwa kwadraty o tych samych wymiarach, ale o różnych współrzędnych z (różnych odległościach od obserwatora) to na ekranie otrzymasz dokładnie takie same kwadraty. Przydaje się to np w grach 2d, podczas rysowania menu w grze albo wszelkiego rodzaju informacji, które są cały czas na ekranie (licznik amunicji,życia itp. ) Co nie znaczy, że przy rzutowaniu perspektywicznym nie można tego zrobić, ale tak jest wygodniej.
Do ustalenia macierzy rzutowania służą cztery instrukcje:
-glFrustrum
-gluPerspective
-glOrtho
-gluOrtho2D
dwie pierwsze do perspektywy, kolejne dwie do prostokątnego. Za dużo by to zajęło aby wszystkie opisywać, chyba że bardzo chcesz, ale to najwcześniej jutro wieczorem. Dziś jestem padnięty ;)

Ad2. Kwestia preferencji.
Używaj tego co Ci wygodniej. Większość instrukcji operujących na wierzchołkach ma wersje dla liczb całkowitych - te z przedrostkiem i, jak i zmiennoprzecinkowych - te z przedrostkiem f(float) lub d(double)).
np: glVertex2i(x,y), glVertex2f(x,y), glVertex3d(x,y,z) itd. 

Ad3. Dokładnie tak.

Ad4. To zależy tylko od Ciebie.
OpenGL to "maszyna stanów", wielka szafa z przełącznikami. Jeśli coś włączysz - np: texturowanie to działa tak długo dopóki tego nie wyłączysz. Raz ustawiony kolor czyszczenia pozostanie taki, aż go nie zmienisz. Tu nie ma zakresu ważności.
Zwykle załącza się to czego się zamierza używać. Gdy rysujesz szkielety brył nie warto włączać oświetlenia, standardowe jednostajne wystarczy itd.
Możesz każde ustawienie zmienić w dowolnym(prawie) momencie programu. To nie jest ustawione raz na zawsze.

Co do rysowania po resize: powinno się wywołać funkcję rysującą po resize, aby dostać obraz ze zmienionymi parametrami jeśli program sam tego nie robi.




P-23132
F90M
» 2010-10-21 23:35:54
Tak dla przypomnienia punkt (0,0) to lewy dolny narożnik ekranu, ale to pewnie wiesz. ;)
Chyba chciałeś powiedzieć lewy górny :)
P-23133
ison
» 2010-10-21 23:45:42
@up lewy dolny :)
P-23135
F90M
» 2010-10-21 23:59:51
Racja, tak rzuciłem tylko okiem i nie zwróciłem uwagi że tyczy się to glViewport(). Mam jeszcze w głowie rysowanie kresek, kółek i innych kwadratów :) z SDL.
P-23137
dmx81
Temat założony przez niniejszego użytkownika
» 2010-10-22 08:41:19
dzieki za odp na moje zagmatwane pytanie - ale wiadomo, nowa (na poczatek trudna) biblioteka, wiec setki pytan... ale w miedzy czasie robie rozne eksperymenty. narysowalem sobie kilka piramid w roznych odleglosciach tzn po lewej i prawej stronie sceny, a do tego jedne dalej inne blizej - pozniej sie przemieszczam do przodu przez glTranslatef, kiedy jestem juz dosyc blisko, piramidy sie jakby przecinaja (tzn ich widocznosc - podchodze do jednej i jej widoczna sciana sie przecina, bo jak wiadomo w perspektywie nie mozna podejsc na blizej niz near=1) a wiadomo, ze w wielu grach mozna podejsc pod sama sciane, zeby zajmowala ona caly ekran - czy musze cos zalaczyc, czy tu raczej bedzie wyczucie proporcji rysowanych obiektow i podzialu ekranu (nie wiem czy ktos zrozumial o co mi chodzi ;) )

a druga sprawa ktora chcialem dopytac - to przemieszczajac sie wlasnie tak przez translate, idac obok jakiegos obiektu, chcialbym sie moc obrocic w jego strone, dlugo myslalem jak to zrobic (bo np przez glRotatef to obracalo mnie, ale wkolo piramidy (jak ziemia wokol slonca, a jak chce jak ziemia wokol wlasnej osi, aby popatrzyc na slonce innym biegunem ;))) nie szukam gotowego rozwiazania, tylko podpowiedzi, czy musze kombinowac z rotate, translate w odpowiednim momencie (tzn przed lub po rysowaniu), czy raczej trzeba uzyc opcji gluLookAt - bo sluzy do ustawienia "oka" i kierunku patrzenia... w kursie o ile pamietam, bylo napisane, ze raczej powinno sie to odbywac przez modyfikacje ukladu wpolrzednych, ze to tylko taka pomocnicza funkcja (a ja kombinowalem juz w glowie ze zamiast przez translate, przemieszczac wlasnie gluLookAt - zmieniajac polozenie oka i punkt na ktory patrzy, np przez ruch myszki)

jesli lookAt - to bede musial opracowac pewnie wlasnie reakcje na ruch myszki - i pewnie bedzie to mialo zwiazek z obliczaniem katow :}, pewnie tak sie da, tylko pytam, czy tak sie robi - czy raczej innej drogi szukac, dzieki za cierpliwosc :)



edit ...
ps>>  troszke przemyslalem sprawe i na pewno obiekty musza byc wyzsze niz podzialka ekranu i bo to co widac na ekranie, zakladam, ze jest to widok na wprost obserwatora - a stojac przy tym obiekcie, aby go zobaczyc calego, trzeba popatrzyc rowniez w gore (no chyba ze jest co cos malego ;) )

a po drugie, to piramidy maja wierzcholek, a sciany boczne sa pod duzym katem, wiec nie moge zobaczyc jej z bliska, bo stoje jakby u jej podstawy, a do wierzcholka mam jeszcze daleko, wiec wydaje sie on nisko, a idac dalej, wchodze jakby w piramide juz nogami, dlatego mi ja obcina (a powinno byc tu ograniczenie kolizji aby nie wchodzic jakby w jej srodek bo widze nagle sciany z drugiej strony) czyli zostaje popracowac nad proporcjami :)
P-23139
« 1 »
  Strona 1 z 1