2012-10-24 17 views
7

oryginalne pytanie

chcę użyć '', 'gluPerspective glViewport' oraz '' gluLookAt manipulować mojego aparatu i ekranu.gluPerspective, glViewport, gluLookAt i GL_PROJECTION i GL_MODELVIEW Matricies

Jakie funkcje mam stosować w jakim trybie matrycy? W jakiej kolejności powinienem/powinienem z nich skorzystać?

Na przykład próbuję skonfigurować ekran i aparat tak: (ale to nie działa!)

glMatrixMode(GL_PROJECTION) // Apply following to projection matrix - is this correct? 
glLoadIdentity(); // Reset first 
glPerspective(45.0, (double)w/(double)h, 1.0, 200.0); // Set perspective 
glViewport(0, 0, w, h); // Set viewport 

glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here? 
glLoadIdentity(); // Reset first 
gluLookAt(px, py, pz, cx, cy, cz, ux, uy, uz); // Set position, centre and then up vectors 
// This surely comes after calling GL_MODELVIEW? 

Mam rozejrzał do dokumentacji online, i rozumiem funkcji, po prostu nie tam, gdzie powinny iść iw jakiej kolejności!

Jakiś czas później ...

Jest kilka miesięcy później, a teraz dodaję szybko zmienił pokazać system używam do renderowania rzeczy z OpenGL. Ma to pomóc innym, którzy zobaczą to pytanie w przyszłości.

Używam głównie dwóch metod.

Metoda 1:

Ta metoda grupy wszystko razem.

// Firstly, the window may have been resized so re-create the viewing area 
glViewport(0, 0, width_of_window_rendering_area, height_of_window_rendering area); 

Powoduje odtworzenie rzutni do renderowania na całym obszarze wnętrza okna. Z SFML, byś zrobił coś podobnego window.width() lub window.height(), lub coś podobnego w zależności od okienkowy narzędzi użyć (Glut, glfw, SDL etc) ...

// The second step is to add a projection matrix. There are three main ones I like to use 
// Uncomment the one you want 
glMatrixMode(GL_PROJECTION); // Tell OpenGL to manipulate the correct matrix stack 
glLoadIdentity(); // Reset the projection matrix, or bad things happen after multiple calls to below functions! 
// glOrtho(...) // Uncomment to use 2D rendering 
// gluPerspective(...) // Uncomment to use (easy) 3D rendering 
glFrustrum(...) // Uncomment to use (harder/less intuitive?) 3D rendering 
glMatrixMode(GL_MODELVIEW); // I always prefer to leave OpenGL in the modelview manipulation mode. 
    // I consider it the "default" and safest mode to leave OpenGL in, as any rogue 
    // calls to functions changing its contents is likely to mess up your geometry 
    // which should be visible as a problem on the screen, which tells you you need 
    // to fix something! Manipulating the other matrix stacks may not show obvious 
    // problems. 

Będziesz wybrać jedną z trzech spośród "glOrtho", "gluPerspective" i "glFrustrum". Istnieje również "gluOrtho2D", ale używaj go z ostrożnością! (Ja sam wolę określać samoloty bliskie i dalekie, używając "glORto".) Musisz zastąpić "..." swoimi argumentami także dla funkcji.

// The third step is to clear the screen and set your camera/geometry position 
glClear(GL_COLOR_BUFFER_BIT); // use bitwise OR ('||') with 'GL_DEPTH_BUFFER_BIT' and 'GL_STENCIL_BUFFER_BIT' if required 
gluLookAt(...); 
// I like to use gluLookAt, or at least I _italic_used to! Now I implement my own camera... 
// That is another fun thing you should try if you are comfortable with 3D geometry and hard math! 

// The fourth step is to draw your scene. You may want to put lighting stuff first or in with the drawing 
glutWireTeapot(...); 

Metoda 2:

Drugi sposób jest taki sam jak wyżej, ale aby przesunąć pierwszy krok w oddzielnej czynności. Następnie musisz wykryć zdarzenia zmiany rozmiaru okna i wywołać tę funkcję. Przy nadkładzie możesz określić wywołanie zwrotne. Dzięki SFML można wykryć zdarzenie po zmianie rozmiaru okna. Zapominam, jak działa SDL, ale jest podobnie. Jeszcze nie nauczyłem się, jak działa glfw.

Mam nadzieję, że to ci pomoże.

Niektórzy nowicjusze OpenGL (prawdopodobnie mnie w tym samym czasie) starają się określić tłumaczenia kamer na macierzy PROJECTION. Nie rób tego - Mogę to załatwić oświetleniem i ewentualnie innymi rzeczami.

+0

To, co tam masz, wydaje mi się odpowiednie. Być może twój błąd jest gdzie indziej. – Tim

+0

Upewnij się, że scena znajduje się pomiędzy bliską i daleką płaszczyzną podaną w glPerspective. – Max

+0

Jeśli zrozumiałeś funkcje, zrozumiałbyś, dokąd się udają. Na przykład, wydajesz się wierzyć, że 'glViewport' tworzy macierz. To nie. –

Odpowiedz

3

zdefiniować mojej funkcji oddzwaniania przekształcenia jak:

Wezwania glViewport(...) raz na początku.

Następnie przeładować macierz projekcji z matrycy tożsamości:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

Następnie:

glPerspective(...) 
glMatrixMode(GL_MODELVIEW); 

gluLookAt(...) można wywołać w każdej chwili później, jeśli trzeba zmienić położenie kamery.

Działa dla moich prostych celów.

+0

Dzięki, to jest odpowiedź, której szukałem. Jeśli zadzwonię do gluLookAt dwa razy, czy kamera zostanie ponownie przeniesiona? W ten sam sposób, dwukrotne wywołanie glRotatef spowoduje dwukrotne obrócenie kamery/sceny, czy gluLookAt zrobi to samo? – user3728501

+0

Przepraszamy, kolejne pytanie: Czy glViewPort edytuje macierz? Czy powinienem zadzwonić do glMatrixMode (GL_PROJECTION) przed jakimkolwiek wywołaniem glViewPort? – user3728501

+0

Tak, obróci całą scenę dwukrotnie. Ale jeśli umieścisz go w swojej funkcji wywołania zwrotnego, pamiętaj, że funkcja wyświetlania jest wywoływana wielokrotnie, musisz załadować matrycę widoku modelu z macierzą tożsamości na początku swojej funkcji wywołania zwrotnego. – Max