Program wyswietlajacy szescian w rzucie perspektywicznym


//////////////////////////////////////////////////////////////////////////////////////////
//
// Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
// moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
//
//////////////////////////////////////////////////////////////////////////////////////////
#include <GL/glut.h>
#include <math.h>

// Definicja stalych
#define DLUGOSC_BOKU            1.0

#define OBSERWATOR_OBROT_X      10.0
#define OBSERWATOR_OBROT_Y      10.0
#define OBSERWATOR_FOV_Y        60.0 
#define GL_PI                   3.14

// Zmienne globalne
double  bok           = DLUGOSC_BOKU; // Dlugosc boku szescianu
int     szerokoscOkna = 800;
int     wysokoscOkna  = 600;
double  OBSERWATOR_ODLEGLOSC = 180.0;
double  OBSERWATOR_OBR_X = 80.0;
double  OBSERWATOR_OBR_Y = 0.0;
// Prototypy funkcji
void RysujKule(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 RysujKule(double a)
{
     double angle,angle2,x,y,z;
    
    
     glBegin(GL_TRIANGLE_STRIP);
     glVertex3f(0.0,0.0,0.0);
    
     for(angle = -GL_PI; angle <= (2*GL_PI);angle += (GL_PI/64.0f))
     {
     for(angle2=-GL_PI;angle2 <= (2*GL_PI);angle2 += (GL_PI/64.0f)){
                                      
     x = 1.0f*cos(angle)*cos(angle2);
     y = 1.0f*cos(angle)*sin(angle2);
     z = 1.0f*sin(angle);
     glVertex3f(x, y, z) ;
     }
     }
     glEnd();
    
}


//////////////////////////////////////////////////////////////////////////////////////////
// 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
  // Przesunięcie osi
  glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
  glRotatef(OBSERWATOR_OBR_X, 1, 0, 0);
  glRotatef(OBSERWATOR_OBR_Y, 0, 1, 0);

  // Narysowanie szescianu
  RysujKule(bok);

  // Przelaczenie buforow ramki
  glutSwapBuffers();
}


//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja obslugi klawiatury
void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
{
  if(klawisz == '+')
      OBSERWATOR_ODLEGLOSC *= 2.0;
  else if (klawisz == '-')
      OBSERWATOR_ODLEGLOSC /= 2.0;
  else if (klawisz == 27)
      exit(0);     
  else if(klawisz == 'a')
       OBSERWATOR_OBR_Y -=2.0;
  else if(klawisz == 'd')
       OBSERWATOR_OBR_Y +=2.0;
  else if(klawisz == 's')
       OBSERWATOR_OBR_X -=2.0;
  else if(klawisz == 'w')
       OBSERWATOR_OBR_X +=2.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;
}



Wyszukiwarka

Podobne podstrony:
Program dla sześciolatków
PROGRAM dla sześciolatków NOWA ERA
Programowanie '51 cd Sterowanie układami wyświetlania
Program testujący dla wyświetlaczy VFD firmy Noritake z interfejsem szeregowym
bryła (sześcian w perspektywie prost druk ZSZ
Program zajęć z rytmiki dla dzieci sześcioletnich, przedszkole(1)
Procedura na szesciokąt, proste procedury w programie logo komeniusz
Rodzina w perspektywie diagnostycznej, Oligofrenopedagogika, Różnice programowe, Diagnoza psychopeda
bryła (sześcian w perspektywie dowolnej drukZSZ
fras,systemy wbudowane L, Obsługa wyświetlacza siedmiosegmentowego oraz programowanie eliminacji ze
Edytor Wyświetlaczy, Instrukcja do edytora, Program wspomagający tworzenie
„Bić kurwy i złodziei”, czyli program dla Polski z perspektywy Mostu Poniatowskiego
ROZWÓJ RYNKU ELEKTRYCZNYCH SILNIKÓW ENERGOOSZCZEDNYCH WIDZIANY Z PERSPEKTYWY REALIZACJI PROGRAMU PEM
CELE I MECHANIZMY PROGRAMU PEMP ORAZ STAN OBECNY I PERSPEKTYWY PROGRAMU RABATOWEGO
Heidmann, Jean Las Perspectivas del Programa SETI

więcej podobnych podstron