OpenGL; podstawy

0

Witam,

zaczalem "nauke" OpenGL, postanowilem napisac prosty program wyswietlajacy trojkat na ekranie. Wczesniej znalazlem w internecie program, ktory wyswietal szescian. Postanowilem wiec edytowac zawartosc jednej funkcji. RysujSzescian. Nie wiem czemu nie dziala. Podpowiecie?

////////////////////////////////////////////////////////////
#include <GL/glut.h>


// Definicja stalych
#define DLUGOSC_BOKU            5.0
#define OBSERWATOR_ODLEGLOSC    20.0
#define OBSERWATOR_OBROT_X      20.0
#define OBSERWATOR_OBROT_Y      20.0
#define OBSERWATOR_FOV_Y        30.0  

// Zmienne globalne
double  bok           = DLUGOSC_BOKU; // Dlugosc boku szescianu
int     szerokoscOkna = 800;
int     wysokoscOkna  = 600;


// Prototypy funkcji
void RysujSzescian(double a);
void UstawParametryWidoku(int szer, int wys);
void WyswietlObraz(void);
void ObslugaKlawiatury(unsigned char klawisz, int x, int y);


//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
// Srodek szescianu znajduje się w punkcie (0,0,0).
void RysujSzescian(double a)
{
     glPushMatrix();
  glBegin(GL_TRIANGLES);
            glColor4ub(255, 0, 0, 50);
                glVertex2d(304,224);
                glVertex2d(304,256);
                glVertex2d(336,224);
        glEnd();
        glPopMatrix();

}

//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
// być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
void UstawParametryWidoku(int szer, int wys)
{
  // Zapamietanie wielkosci widoku
  szerokoscOkna = szer;
  wysokoscOkna  = wys;

  // Ustawienie parametrow viewportu
  glViewport(0, 0, szerokoscOkna, wysokoscOkna);

  // Przejscie w tryb modyfikacji macierzy rzutowania
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
}


//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja wyswietlajaca pojedyncza klatke animacji
void WyswietlObraz(void)
{
  // Wyczyszczenie bufora koloru i bufora glebokosci
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

  // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  glMatrixMode(GL_MODELVIEW);

  // Zastapienie aktywnej macierzy macierza jednostkowa
  glLoadIdentity();

  // Ustalenie polozenia obserwatora
  glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
  glRotatef(OBSERWATOR_OBROT_X, 1, 0, 0);
  glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);

  // Narysowanie szescianu
  RysujSzescian(bok);

  // Przelaczenie buforow ramki
  glutSwapBuffers();
}


//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja obslugi klawiatury
void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
{
  if(klawisz == '+')
      bok *= 2.0;
  else if (klawisz == '-')
      bok /= 2.0;
  else if (klawisz == 27)
      exit(0);      
}


//////////////////////////////////////////////////////////////////////////////////////////
// Glowna funkcja programu
int  main(int argc, char **argv)
{
  // Zainicjowanie biblioteki GLUT
  glutInit(&argc, argv);

  // Ustawienie trybu wyswietlania
  glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

  // Ustawienie polozenia dolenego lewego rogu okna
  glutInitWindowPosition(100, 100);

  // Ustawienie rozmiarow okna
  glutInitWindowSize(szerokoscOkna, wysokoscOkna);

  // Utworzenie okna
  glutCreateWindow("Szescian");

  // Odblokowanie bufora glebokosci
  glEnable(GL_DEPTH_TEST);

  // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  glClearDepth(1000.0);

  // Ustawienie koloru czyszczenia bufora ramki
  glClearColor (0.0f, 0.0f, 0.3f, 0.0f);

  // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  
  // Zarejestrowanie funkcji (callback) odpowiedzialnej za 
  glutDisplayFunc(WyswietlObraz);

  // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  // zmieniane sa rozmiary okna
  glutReshapeFunc(UstawParametryWidoku);

  // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  // zadnych zadan
  glutIdleFunc(WyswietlObraz);

  // Zarejestrowanie funkcji obslugi klawiatury
  glutKeyboardFunc(ObslugaKlawiatury);

  // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  glutMainLoop();

  return 0;
}
0

To jest całe namieszane... to coś sześcianu na pewno nie narysuje poza tym po co przesyłać a ? Oprócz tego możliwe, że reshape nie jest dobrze ustawiony i nic nie widać...

void RysujSzescian(double a)
{
     glPushMatrix();
  glBegin(GL_TRIANGLES);
            glColor4ub(255, 0, 0, 50);
                glVertex2d(304,224);
                glVertex2d(304,256);
                glVertex2d(336,224);
        glEnd();
        glPopMatrix();

}
0

Jak juz napisalem, nie chce narysowac Szescianu, to jest tylko podstawa ktora sie wzoruje.
Ja chce narysowac trojkat.
Podany przez Ciebie kod jest identyczny, dzialac dziala tak jak dzialal.
Niestety dobrze dodales, ze nic nie widac.

Wspomniales reshape, jestem zupelnie zielony jesli chodzi o OpenGL, a to moje pierwsze cwiczenie (przerobienie szescianu na trojkat ;P), takze prosze o wyjasnienie o co chodzi z "reshapem" ;)

0

Z tego powinien wyjść trójkąt:

void RysujSzescian(double a)
{
	glBegin(GL_TRIANGLES);
		glColor4ub(255, 0, 0, 50);
        glVertex2d(5.0, 0.0);
        glVertex2d(0.0, 0.0);
        glVertex2d(0.0, 5.0);
	glEnd();
}

Reshape : void glutReshapeFunc(void (*func)(int width, int height));
W tym kodzie używane jest UstawParametryWidoku, w uproszczeniu pozwala zachować kształt wyrenderowanych figur po zmianie rozmiaru okna.

0

Powinien i zapewne wychodzi, tylko ze jest niewidoczny ;)
Z tego co mowisz, reshape chyba nie powinien odgrywac tutaj jakiejs roli zwlaszcza ze w oryginale, tzn.
przy rysowaniu szescianu zmieniona jest wlasnie tylko ta funkcja:

void RysujSzescian(double a)
{
  // Sciany boczne
  glBegin(GL_QUAD_STRIP); 
    glVertex3f(a/2.0, a/2.0, a/2.0);
    glVertex3f(a/2.0, -a/2.0, a/2.0);
    glVertex3f(a/2.0, a/2.0, -a/2.0);
    glVertex3f(a/2.0, -a/2.0, -a/2.0);

    glVertex3f(-a/2.0, a/2.0, -a/2.0);
    glVertex3f(-a/2.0, -a/2.0, -a/2.0);

    glVertex3f(-a/2.0, a/2.0, a/2.0);
    glVertex3f(-a/2.0, -a/2.0, a/2.0);

    glVertex3f(a/2.0, a/2.0, a/2.0);
    glVertex3f(a/2.0, -a/2.0, a/2.0);
  glEnd(); 

  // Gorna sciana
  glBegin(GL_QUAD_STRIP); 
    glVertex3f(-a/2.0, a/2.0, a/2.0);
    glVertex3f(a/2.0, a/2.0, a/2.0);
    glVertex3f(-a/2.0, a/2.0, -a/2.0);
    glVertex3f(a/2.0, a/2.0, -a/2.0);
  glEnd();

  // Dolna sciana
  glBegin(GL_QUAD_STRIP); 
    glVertex3f(-a/2.0, -a/2.0, a/2.0);
    glVertex3f(a/2.0, -a/2.0, a/2.0);
    glVertex3f(-a/2.0, -a/2.0, -a/2.0);
    glVertex3f(a/2.0, -a/2.0, -a/2.0);
  glEnd();

}

I nie dosc ze wszystko dziala jak nalezy to jeszcze wszystko jest ladnie i widocznie rysowane ;)

0

Przepraszam, zwracam honor. Zadzialalo tak jak powinno. ;)
Pewnie jeszcze nie jeden raz bede sie zwracal o pomoc ;)

Pozdrawiam

W jaki sposob moge pogrubic linie?
Jak wypelnic trojkat kolorem?

0

glLineWidth(grubosc); - musi byc przed rysowanym obiektem

Zamiast glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); i będzie wypełniony

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