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 <glut.h>
- // Stale wyznaczajace predkosci katowe planety i ksiezyca (w stopniach/sek.)
- #define PREDKOSC_KATOWA_PLANETY 1.0
- #define PREDKOSC_KATOWA_KSIEZYCA -5.0
- // Wskazniki do wykorzystywanych kwadryk
- GLUquadricObj *kolo;
- GLUquadricObj *podstawaSciany;
- GLUquadricObj *podstawaDyskG;
- GLUquadricObj *przegubSciany;
- GLUquadricObj *przegubDyskG;
- GLUquadricObj *przegubDyskD;
- GLUquadricObj *glowicaSciany;
- GLUquadricObj *glowicaDyskG;
- GLUquadricObj *glowicaDyskD;
- GLfloat rotObsY = 40.0;
- GLfloat rotObsX = 40.0;
- GLfloat rotPodstawy = 0.0;
- GLfloat rotRamienia1= 30.0;
- GLfloat rotRamienia2= 10;
- GLfloat rotGlowicy = 0;
- GLfloat rozUchwytow = -40;
- GLfloat ruchoper = 0;
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja inicjujaca elementy skladowe ramienia robota zamodelowane jako kwadryki
- //
- void InicjujRamieRobota(void)
- {
- // Zainicjowanie scian bocznych walca bedacego podstawa ramienia
- kolo = gluNewQuadric();
- gluQuadricDrawStyle(kolo, GLU_LINE);
- // Zainicjowanie scian bocznych walca bedacego podstawa ramienia
- podstawaSciany = gluNewQuadric();
- gluQuadricDrawStyle(podstawaSciany, GLU_LINE);
- // Zainicjowanie gornej podstawy walca
- podstawaDyskG = gluNewQuadric();
- gluQuadricDrawStyle(podstawaDyskG, GLU_LINE);
- // Zainicjowanie scian bocznych cylindrycznego przegubu ramienia
- przegubSciany = gluNewQuadric();
- gluQuadricDrawStyle(przegubSciany, GLU_LINE);
- // Zainicjowanie gornej podstawy walca
- przegubDyskG = gluNewQuadric();
- gluQuadricDrawStyle(przegubDyskG, GLU_LINE);
- // Zainicjowanie dolnej podstawy walca
- przegubDyskD = gluNewQuadric();
- gluQuadricDrawStyle(przegubDyskD, GLU_LINE);
- // Zainicjowanie scian bocznych cylindra glowicy
- glowicaSciany = gluNewQuadric();
- gluQuadricDrawStyle(glowicaSciany, GLU_LINE);
- // Zainicjowanie gornej podstawy walca
- glowicaDyskG = gluNewQuadric();
- gluQuadricDrawStyle(glowicaDyskG, GLU_LINE);
- // Zainicjowanie dolnej podstawy walca
- glowicaDyskD = gluNewQuadric();
- gluQuadricDrawStyle(glowicaDyskD, GLU_LINE);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca obraz sceny widzianej z biezacej pozycji obserwatora
- // Zalozenie: Funkcja glutWireSpehere moze ryswac tylko sfere o promieniu 1
- void RysujRamieRobota(GLfloat obrotPodstawy, GLfloat obrotRamienia1,
- GLfloat obrotRamienia2, GLfloat obrotGlowicy,
- GLfloat rozstawUchwytow)
- {
- // Pocztaek tworzenia ukladu wspolrzednych
- glBegin(GL_LINES);
- // Os X
- glColor3f(1.0, 0.0, 0.0); //red
- glVertex3f(-20.0, 0.0, 0.0);
- glVertex3f(20.0, 0.0, 0.0);
- // Os Y
- glColor3f(0.0,1.0,0.0); // green
- glVertex3f(0.0, -20.0, 0.0);
- glVertex3f(0.0, 20.0, 0.0);
- // Os Z
- glColor3f(0.0,0.0,1.0); // blue
- glVertex3f(0.0, 0.0, -20.0);
- glVertex3f(0.0, 0.0, 20.0);
- // Koniec tworzenia ukladu wspolrzednych
- glEnd();
- glColor3f(1.0,1.0,1.0);
- // Przygotowanie stosu macierzy modelowania
- glPushMatrix();
- glRotatef(rotRamienia2, 0, 1, 0);
- glPushMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 0);
- glScalef(20, 10, 5);
- glutWireCube(1);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 5, 0);
- glScalef(5, 2, 1);
- glutWireCube(1);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 5, 0);
- glScalef(5, 2, 1);
- glutWireCube(1);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(-7, 5, 0);
- glutSolidSphere(1, 20, 20);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0,0,2.5);
- gluCylinder(kolo, 4, 4, 5, 100, 100);
- glColor3f(0.0, 0.0, 1.0); // blue
- gluDisk(kolo, 0, 4, 100, 100);
- glTranslatef(0, 0, 5);
- gluDisk(kolo, 0, 4, 100, 100);
- glPopMatrix();
- glColor3f(1.0, 1.0, 1.0);
- // obiektyw maly
- glTranslatef(0, 0, rotGlowicy);
- glRotatef(rotGlowicy, 0, 0, 1);
- glPushMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 5);
- gluCylinder(kolo, 3, 3, 5, 100, 100);
- glColor3f(0.0, 1.0, 0.0); // green
- gluDisk(kolo, 0, 3, 100, 100);
- glTranslatef(0, 0, 5);
- gluDisk(kolo, 0, 3, 100, 100);
- glPopMatrix();
- glColor3f(1.0, 1.0, 1.0);
- glPushMatrix();
- glTranslatef(0, 0, 5);
- gluCylinder(kolo, 3, 3, 5, 100, 100);
- glColor3f(0.0, 1.0, 0.0); // green
- gluDisk(kolo, 0, 3, 100, 100);
- glTranslatef(0, 0, 5);
- gluDisk(kolo, 0, 3, 100, 100);
- glPopMatrix();
- glColor3f(1.0, 1.0, 1.0);
- glPushMatrix();
- glTranslatef(0, 0, 10);
- gluCylinder(kolo, 3, 5, 2, 50,50);
- glColor3f(0.0, 0.5, 0.3);
- glPopMatrix();
- glColor3f(1.0, 1.0, 1.0);
- glPopMatrix();
- glPopMatrix();
- //statyw
- glPushMatrix();
- glTranslatef(0, -5, 0);
- //glScalef(10, 3, 4);
- glRotatef(90, 1, 0, 0);
- gluCylinder(kolo, 2, 2, 2, 100, 100);
- glTranslatef(0, 0, 2);
- gluDisk(kolo, 0, 2, 100, 100);
- glPopMatrix();
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, -7, 0);
- glRotatef(90, 1, 0, 0);
- glRotatef(rotRamienia1, 1, 0, 0);
- gluCylinder(kolo, 0.15, 0.15, 10, 50, 50);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, -7, 0);
- glRotatef(90, 1, 0, 0);
- glRotatef(rotRamienia1, 0, 1, 0);
- gluCylinder(kolo, 0.15, 0.15, 10, 50, 50);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, -7, 0);
- glRotatef(90, 1, 0, 0);
- glRotatef(-rotRamienia1, 1, 0, 0);
- gluCylinder(kolo, 0.15, 0.15, 10, 50, 50);
- glPopMatrix();
- //glPushMatrix();
- //glTranslatef(0, 0.4, 0);
- //glScalef(10, 0.8, 4);
- //glutWireCube(1);
- //glPopMatrix();
- //glPushMatrix();
- //glTranslatef(0, -0.7, 0);
- //glScalef(10, 1.4 , 2);
- //glutWireCube(1);
- //glPopMatrix();
- //glPushMatrix();
- //glTranslatef(3, -1.4, -2);
- //gluCylinder(kolo, 1, 1, 1, 50, 50);
- //glColor3f(0.0, 0.0, 1.0); // blue
- //gluDisk(kolo, 0, 1, 50, 50);
- //glTranslatef(0, 0, 1);
- //gluDisk(kolo, 0, 1, 50, 50);
- //glPopMatrix();
- //glColor3f(1.0, 1.0, 1.0);
- //// kolo
- //glPushMatrix();
- //glTranslatef(-3, -1.4, -2);
- //gluCylinder(kolo, 1, 1, 1, 50, 50);
- //glColor3f(0.0, 0.0, 1.0); // blue
- //gluDisk(kolo, 0, 1, 50, 50);
- //glTranslatef(0, 0, 1);
- //gluDisk(kolo, 0, 1, 50, 50);
- //glPopMatrix();
- //glColor3f(1.0, 1.0, 1.0);
- //// koniec kola
- //glPushMatrix();
- //glTranslatef(3, -1.4, 1);
- //gluCylinder(kolo, 1, 1, 1, 50, 50);
- //glColor3f(0.0, 0.0, 1.0); // blue
- //gluDisk(kolo, 0, 1, 50, 50);
- //glTranslatef(0, 0, 1);
- //gluDisk(kolo, 0, 1, 50, 50);
- //glPopMatrix();
- //glColor3f(1.0, 1.0, 1.0);
- //glPushMatrix();
- //glTranslatef(-3, -1.4, 1);
- //gluCylinder(kolo, 1, 1, 1, 50, 50);
- //glColor3f(0.0, 0.0, 1.0); // blue
- //gluDisk(kolo, 0, 1, 50, 50);
- //glTranslatef(0, 0, 1);
- //gluDisk(kolo, 0, 1, 50, 50);
- //glPopMatrix();
- //glColor3f(1.0, 1.0, 1.0);
- //
- //glTranslatef(1.4, 0, 0);
- //// wieżyczka
- //glPushMatrix();
- //glTranslatef(0,0.8,0);
- //glRotatef(rotGlowicy, 0, 1, 0);
- //glRotatef(-90, 1,0,0);
- //
- //gluCylinder(kolo, 2, 1, 1.1, 50,50);
- //glColor3f(0.0, 0.5, 0.3); // zielony ala
- //gluDisk(kolo, 0, 2, 50, 50);
- //glTranslatef(0, 0, 1.1);
- //gluDisk(kolo, 0, 1, 50, 50);
- //glPopMatrix();
- //// lufa
- //glRotatef(rotGlowicy, 0, 1, 0);
- //glRotatef(rotRamienia2, 0, 0, 1);
- //glPushMatrix();
- //glRotatef(90, 0, 1, 0);
- //glTranslatef(0, 1.5, 0);
- //gluCylinder(kolo, 0.15, 0.15, 4.5, 50, 50);
- //glPopMatrix();
- // Posprzatanie na stosie macierzy modelowania
- glPopMatrix();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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, ruchoper, 0);
- glTranslatef(0, 0, rozUchwytow);
- glRotatef(rotObsY,0,1,0);
- // Generacja obrazu sceny w niewidocznym buforze ramki
- RysujRamieRobota(rotPodstawy, rotRamienia1, rotRamienia2, rotGlowicy, rozUchwytow);
- // 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;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- switch(klawisz)
- {
- case '2':
- rotRamienia1 = (rotRamienia1 < 90.0) ? rotRamienia1 + 1.0 : rotRamienia1;
- break;
- case '@':
- rotRamienia1 = (rotRamienia1 > 0.0) ? rotRamienia1 - 1.0 : rotRamienia1;
- break;
- case '3':
- rotRamienia2 = rotRamienia2 + 1.0;
- break;
- case '#':
- rotRamienia2 = rotRamienia2 - 1.0;
- break;
- case '4':
- rotGlowicy = (rotGlowicy < 360.0) ? rotGlowicy + 0.01 : rotGlowicy;
- break;
- case '$':
- rotGlowicy = (rotGlowicy > 0.0) ? rotGlowicy - 0.01 : rotGlowicy;
- break;
- case '5':
- rozUchwytow = rozUchwytow + 0.1;
- break;
- case '%':
- rozUchwytow = rozUchwytow - 0.1;
- break;
- case '6':
- ruchoper = ruchoper + 0.1;
- break;
- case '7':
- ruchoper = ruchoper - 0.1;
- 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(400, 400);
- // Utworzenie okna
- glutCreateWindow("Robot");
- // 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.0, 0.3, 0.0, 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 ramie robota
- InicjujRamieRobota();
- // 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