Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /////////////////////////////////////////////////////////////////////////////////////////
- // Program demonstruje skladanie transformacji przy modelowaniu zlozonych obiektow
- // skladajacych sie z wielu elementow ruchomych (ramie robota).
- #include "GL/glut.h"
- #include <math.h>
- #define WINDOW_SIZE 800
- // Wskazniki do wykorzystywanych kwadryk
- GLUquadricObj *podstawaLampy;
- GLUquadricObj *walec;
- GLUquadricObj *kolo;
- GLUquadricObj *klosz;
- GLfloat rotObsX = 40;
- GLfloat rotObsY = 40;
- GLfloat rotObsZ = 0;
- GLfloat distance = -100;
- GLfloat minn = -20;
- GLfloat maxx = -120;
- GLfloat obrLampy = 0;
- GLfloat podnRamienia = 0;
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja inicjujaca elementy skladowe lampy
- //
- void InicjujLampe()
- {
- podstawaLampy = gluNewQuadric();
- gluQuadricDrawStyle(podstawaLampy, GLU_LINE);
- walec = gluNewQuadric();
- gluQuadricDrawStyle(walec, GLU_LINE);
- kolo = gluNewQuadric();
- gluQuadricDrawStyle(kolo, GLU_LINE);
- klosz = gluNewQuadric();
- gluQuadricDrawStyle(klosz, GLU_LINE);
- }
- void RysujLampe(GLfloat obrLampy, GLfloat podnRamienia) {
- glPushMatrix();
- glPushMatrix();
- glRotatef(-90, 1, 0, 0);
- gluDisk(podstawaLampy, 0, 5, 20, 20);
- glPopMatrix();
- glPushMatrix();
- glRotatef(-90, 1, 0, 0);
- gluCylinder(podstawaLampy,5 ,5 , 0.5, 20,20);
- glPopMatrix();
- glPushMatrix();
- glRotatef(-90, 1, 0, 0);
- glTranslatef(0, 0, 0.5);
- gluDisk(podstawaLampy, 0, 5, 20, 20);
- glPopMatrix();
- //kat obrotu lampy CWW CW
- glRotatef(obrLampy*2,0,1,0);
- glPushMatrix();
- glTranslatef(0, 3, 0);
- glScalef(0.5, 5, 0.5);
- glutSolidCube(1);
- glPopMatrix();
- //podnoszenie ramienia
- glTranslatef(-0.375, 5, 0);
- glRotatef(podnRamienia*2, 1,0 , 0);
- glTranslatef(0.375, -5, 0);
- glPushMatrix();
- glTranslatef(-0.375, 5, -2);
- glScalef(0.25, 0.5, 6);
- glutSolidCube(1);
- glPopMatrix();
- //walec nad kloszem
- glTranslatef(-0.375, 4.6, -5);
- glPushMatrix();
- glRotatef(-90, 1, 0, 0);
- gluCylinder(walec, 0.25, 0.25, 1, 20, 20);
- glPopMatrix();
- glTranslatef(0, 1, 0);
- //pierwsza warstwa klosza
- glPushMatrix();
- glRotatef(-90, 1, 0, 0);
- gluDisk(kolo, 0, 0.25, 20, 20);
- glPopMatrix();
- glTranslatef(0, -1, 0);
- //gorna podstawa klosza
- glPushMatrix();
- glRotatef(-90, 1, 0, 0);
- gluDisk(kolo, 0, 0.5, 20, 20);
- glPopMatrix();
- //klosz
- glPushMatrix();
- glRotatef(90, 1, 0, 0);
- gluCylinder(klosz, 0.5, 1, 1, 20, 20);
- glPopMatrix();
- glPopMatrix();
- }
- void DrawCartesian()
- {
- glBegin(GL_LINES);
- // Os X
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(-120.0, 0.0, 0.0);
- glVertex3f(120.0, 0.0, 0.0);
- // Os Y
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, -120.0, 0.0);
- glVertex3f(0.0, 120.0, 0.0);
- // Os Z
- glColor3f(0.0, 0.0, 0.0);
- glVertex3f(0.0, 0.0, -120.0);
- glVertex3f(0.0, 0.0, 120.0);
- // Koniec tworzenia ukladu wspolrzednych
- glEnd();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja generujaca pojedyncza klatke animacji
- void WyswietlObraz(void)
- {
- // Wyczyszczenie bufora ramki i bufora glebokosci
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- // Powielenie macierzy na wierzcholku stosu
- glPushMatrix();
- // Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
- // sceny do ukladu wspolrzednych obserwatora).
- glTranslatef(0, 0, distance);
- glRotatef(rotObsX, 1, 0, 0);
- glRotatef(rotObsY,0,1,0);
- glRotatef(rotObsZ, 0, 0, 1);
- //Narysowanie ukladu wspolrzednych
- DrawCartesian();
- // Generacja obrazu sceny w niewidocznym buforze ramki
- RysujLampe(obrLampy, podnRamienia);
- // Usuniecie macierzy lezacej na wierzcholku stosu (powrot do stanu
- // sprzed wywolania funkcji)
- glPopMatrix();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu
- void UstawParametryWidoku(int szerokosc, int wysokosc)
- {
- // Ustawienie parametrow viewportu
- glViewport(0, 0, szerokosc, wysokosc);
- // Przejscie w tryb modyfikacji macierzy rzutowania
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(40.0, (float)szerokosc/(float)wysokosc, 1.0, 1000.0);
- // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
- glMatrixMode(GL_MODELVIEW);
- // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa
- glLoadIdentity();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja klawiszy specjalnych
- void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
- {
- switch(klawisz)
- {
- case GLUT_KEY_UP:
- rotObsX = rotObsX + 1.0;
- break;
- case GLUT_KEY_DOWN:
- rotObsX = rotObsX - 1.0;
- break;
- case GLUT_KEY_LEFT:
- rotObsY = rotObsY - 1.0;
- break;
- case GLUT_KEY_RIGHT:
- rotObsY = rotObsY + 1.0;
- break;
- /* case GLUT_KEY_PAGE_UP:
- rotObsY = rotObsZ + 1.0;
- break;
- case GLUT_KEY_PAGE_DOWN:
- rotObsY = rotObsZ + 1.0;
- break;*/
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- switch(klawisz)
- {
- case '1':
- obrLampy++;
- break;
- case '2':
- obrLampy--;
- break;
- case '3':
- if (podnRamienia > 0) podnRamienia--;
- break;
- case '4':
- if (podnRamienia < 45) podnRamienia++;
- break;
- case '+':
- if (distance < minn) distance++;
- break;
- case '-':
- if (distance > maxx) distance--;
- break;
- case '`':
- rotObsZ++;
- break;
- case ' ':
- rotObsZ--;
- break;
- }
- 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(1000, 1000);
- // Utworzenie okna
- glutCreateWindow("Lampa");
- // Odblokowanie bufora glebokosci
- glEnable(GL_DEPTH_TEST);
- // Ustawienie funkcji wykonywanej na danych w buforze glebokosci
- glDepthFunc(GL_LEQUAL);
- // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
- glClearDepth(1000.0);
- // Ustawienie koloru czyszczenia bufora ramki
- glClearColor (0.2, 0.2, 0.2, 0.0);
- // Zarejestrowanie funkcji (callback) wyswietlajacej
- 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);
- // Zarejestrowanie funkcji obslugi klawiszy specjalnych
- glutSpecialFunc(ObslugaKlawiszySpecjalnych);
- // Zainicjowanie kwadryk tworzacych elementy lampy
- InicjujLampe();
- // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
- // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement