[C++, OpenGL] Przeskoczenie z widoku 3D na 2D


#1

Witam,

jedno pytanie.

Robię grę 3d z widokiem FPS. Chciałbym żeby podczas grania, widoczne było menu w u dołu ekranu. Dlatego chciałbym przeskoczyć (tylko na chwilę) z widoku 3d na 2d. Widok 2d ma być tylko podczas rysowania menu. Gra ma być normalnie 3D + perspektywa. Tylko problem w tym, że nie wiem jak to zrobić :oops:

Pomożecie mi?

Pozdrawiam.


(Fiołek) #2

Główna pętla:

-


#3

(Razi) #4

Resetujesz macierz widoku i rzucasz na Ortho. Ogólnie wygląda to tak na klatkę:

  1. Zresetuj macierz projekcji (GL_PROJECTION), i rzuć na perspektywę (glFrustum, albo gluPerspective)

  2. Zmień na macierz widoku (GL_MODELVIEW) i rysuj scenę 3D

  3. Zresetuj macierz projekcji (GL_PROJECTION) i rzuć na 2D (glOrtho)

  4. Zmień na macierz widoku (GL_MODELVIEW) i rysuj 2D.

Oczywiście musisz też czyścić bufor głębi przed rysowaniem 2D (lub wyłączyć test głębi)


#5

No więc zmieniłem kod na coś takiego:

#include // Header File For The GLUT Library

#include "..\zmienne.cpp"

#include 

#include "..\include\Menu.h"



void Menu::InitMenu(){

    float w = zmienne::window_width;

    float h = zmienne::window_height;

    glMatrixMode(GL_PROJECTION);

    gluOrtho2D(0.0f, w, 0.0f, h);

    glMatrixMode(GL_MODELVIEW);

}


void Menu::Menuwgrze(){


    glPushMatrix();

    InitMenu();


    glDisable(GL_DEPTH_TEST);

    std::cout << std::endl << zmienne::przycisk;


    glTranslatef(0.0f,0.0f,-3.0f);

    glColor3f(0.0,1.0,1.0);


    glBegin(GL_QUADS); // Rysujemy kwadraty

        glVertex2f(-20.0f, 20.0f); // górny lewy

        glVertex2f( 20.0f, 20.0f); // górny prawy

        glVertex2f( 20.0f,-20.0f); // dolny prawy

        glVertex2f(-20.0f,-20.0f); // dolny lewy

    glEnd(); // Koniec rysowania kwadratu

    glEnable(GL_DEPTH_TEST);

    glPopMatrix();

}

(Zmiany w funkcji InitMenu).

No i nie wyświetla mi się teraz nic :frowning:


(Fiołek) #6

glMatrixMode i glLoadIdentity, usuń glPush/PopMatrix, albo używaj tego nie tylko w ModelView ale i w stosie macierzy projekcji.


#7
#include // Header File For The GLUT Library

#include "..\zmienne.cpp"

#include 

#include "..\include\Menu.h"



void Menu::InitMenu(){

    float w = zmienne::window_width;

    float h = zmienne::window_height;

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluOrtho2D(0.0f, w, 0.0f, h);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

}


void Menu::Menuwgrze(){

    InitMenu();


    glDisable(GL_DEPTH_TEST);

    std::cout << std::endl << zmienne::przycisk;


    glTranslatef(0.0f,0.0f,-5.0f);

    glColor3f(0.0,1.0,1.0);


    glBegin(GL_QUADS); // Rysujemy kwadraty

        glVertex2f(-1.0f, 1.0f); // górny lewy

        glVertex2f( 1.0f, 1.0f); // górny prawy

        glVertex2f( 1.0f,-1.0f); // dolny prawy

        glVertex2f(-1.0f,-1.0f); // dolny lewy

    glEnd(); // Koniec rysowania kwadratu

    glEnable(GL_DEPTH_TEST);

}

Czy o to chodziło? Bo efekt się nie zmienił :confused:

Nie rozumiem tutaj o co ci chodzi. Mógłbyś jaśniej?


(Fiołek) #8

Tak, o to mi chodziło.

glMatrixMode - zmiana aktualnej macierz, glLoadIdentity - ładuje macierz tożsamościową do aktualnej.

Poczytaj o układzie osi w OpenGL(hint: usuń translacje po osi Z albo zamień znak bo aktualnie kamera jest za quadem, acz nie jestem pewien, czy zmiana znaku da pożądany efekt).

EDIT: mea culpa - błąd, ale na wszelki wypadek usuń glTranslatef w ogóle, bo też miewałem z tym problemy.


#9

Nie, translacje są jak najbardziej dobrze.

Nadal nie rozwiązuje to mojego problemu/

najlepiej by było gdyby ktoś wkleił tutaj kawałek przykładowego kodu. Wtedy najprawdopodobniej zrozumiem o co chodzi. Teraz jak próbujecie mi to wytłumaczyć, to jakoś nie widzę światełka w tunelu #-o


(Fiołek) #10

Moja ostatnia próba. Dawno nie pisałem w OpenGL, nigdy tego dobrze przerobionego nie miałem i przyznam, że strzelam. Teraz poprzeglądałem zasoby opengl.org, MSDN i kilku innych stron. Do tego doszedłem:

OpenGL używa prawoskrętnego układu współrzędnych(AFAIK nie ma większego problemu sobie tego przemodelować), czyli wywołując gluOrtho2D(0, 100, 100, 0) mamy punkt 0, 0 w lewym górnym rogu, a 100, 100 w prawym dolnym rogu. Oś X idzie "w prawo", Y "w dół", a Z "od monitora do nas". gluOrtho2D ustawia near clipping plane na -1(czyli to co jest -1 "przed kamerą" też jest wyświetlane), a far clipping plane na 1(czyli to co jest 1 za kamerą też jest wyświetlane). glTranslatef przyjmuje jako pierwszy parametr translacje na X, drugi - Y, a ostatni - Z. Ty przesuwasz quada 5 jednostek w przód od kamery, czyli daleko za far clipping plane i tutaj leży problem.