Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.93 KB | None | 0 0
  1. /////////////////////////////////////////////////////////////////////////////////////////
  2. // Program demonstruje skladanie transformacji przy modelowaniu zlozonych obiektow
  3. // skladajacych sie z wielu elementow ruchomych (ramie robota).
  4.  
  5. #include "GL/glut.h"
  6. #include <math.h>
  7.  
  8. #define WINDOW_SIZE 800
  9.  
  10.  
  11. // Wskazniki do wykorzystywanych kwadryk
  12.  
  13. GLUquadricObj *podstawaLampy;
  14. GLUquadricObj *walec;
  15. GLUquadricObj *kolo;
  16. GLUquadricObj *klosz;
  17.  
  18. GLfloat rotObsX = 40;
  19. GLfloat rotObsY = 40;
  20. GLfloat rotObsZ = 0;
  21. GLfloat distance = -100;
  22. GLfloat minn = -20;
  23. GLfloat maxx = -120;
  24. GLfloat obrLampy = 0;
  25. GLfloat podnRamienia = 0;
  26.  
  27.  
  28. //////////////////////////////////////////////////////////////////////////////////////////
  29. // Funkcja inicjujaca elementy skladowe lampy
  30. //
  31. void InicjujLampe()
  32. {
  33. podstawaLampy = gluNewQuadric();
  34. gluQuadricDrawStyle(podstawaLampy, GLU_LINE);
  35.  
  36. walec = gluNewQuadric();
  37. gluQuadricDrawStyle(walec, GLU_LINE);
  38.  
  39. kolo = gluNewQuadric();
  40. gluQuadricDrawStyle(kolo, GLU_LINE);
  41.  
  42. klosz = gluNewQuadric();
  43. gluQuadricDrawStyle(klosz, GLU_LINE);
  44. }
  45.  
  46.  
  47. void RysujLampe(GLfloat obrLampy, GLfloat podnRamienia) {
  48. glPushMatrix();
  49.  
  50.  
  51.  
  52. glPushMatrix();
  53. glRotatef(-90, 1, 0, 0);
  54. gluDisk(podstawaLampy, 0, 5, 20, 20);
  55. glPopMatrix();
  56.  
  57. glPushMatrix();
  58. glRotatef(-90, 1, 0, 0);
  59. gluCylinder(podstawaLampy,5 ,5 , 0.5, 20,20);
  60. glPopMatrix();
  61.  
  62. glPushMatrix();
  63. glRotatef(-90, 1, 0, 0);
  64. glTranslatef(0, 0, 0.5);
  65. gluDisk(podstawaLampy, 0, 5, 20, 20);
  66. glPopMatrix();
  67.  
  68.  
  69. //kat obrotu lampy CWW CW
  70. glRotatef(obrLampy*2,0,1,0);
  71.  
  72. glPushMatrix();
  73.  
  74. glTranslatef(0, 3, 0);
  75. glScalef(0.5, 5, 0.5);
  76. glutSolidCube(1);
  77. glPopMatrix();
  78.  
  79. //podnoszenie ramienia
  80. glTranslatef(-0.375, 5, 0);
  81. glRotatef(podnRamienia*2, 1,0 , 0);
  82. glTranslatef(0.375, -5, 0);
  83.  
  84. glPushMatrix();
  85.  
  86. glTranslatef(-0.375, 5, -2);
  87. glScalef(0.25, 0.5, 6);
  88. glutSolidCube(1);
  89. glPopMatrix();
  90.  
  91. //walec nad kloszem
  92. glTranslatef(-0.375, 4.6, -5);
  93.  
  94. glPushMatrix();
  95.  
  96. glRotatef(-90, 1, 0, 0);
  97. gluCylinder(walec, 0.25, 0.25, 1, 20, 20);
  98. glPopMatrix();
  99.  
  100. glTranslatef(0, 1, 0);
  101.  
  102. //pierwsza warstwa klosza
  103. glPushMatrix();
  104. glRotatef(-90, 1, 0, 0);
  105. gluDisk(kolo, 0, 0.25, 20, 20);
  106. glPopMatrix();
  107.  
  108. glTranslatef(0, -1, 0);
  109.  
  110. //gorna podstawa klosza
  111. glPushMatrix();
  112. glRotatef(-90, 1, 0, 0);
  113. gluDisk(kolo, 0, 0.5, 20, 20);
  114. glPopMatrix();
  115.  
  116. //klosz
  117. glPushMatrix();
  118. glRotatef(90, 1, 0, 0);
  119. gluCylinder(klosz, 0.5, 1, 1, 20, 20);
  120. glPopMatrix();
  121.  
  122. glPopMatrix();
  123. }
  124.  
  125.  
  126. void DrawCartesian()
  127. {
  128. glBegin(GL_LINES);
  129.  
  130. // Os X
  131. glColor3f(1.0, 0.0, 0.0);
  132. glVertex3f(-120.0, 0.0, 0.0);
  133. glVertex3f(120.0, 0.0, 0.0);
  134.  
  135. // Os Y
  136. glColor3f(0.0, 1.0, 0.0);
  137. glVertex3f(0.0, -120.0, 0.0);
  138. glVertex3f(0.0, 120.0, 0.0);
  139.  
  140. // Os Z
  141. glColor3f(0.0, 0.0, 0.0);
  142. glVertex3f(0.0, 0.0, -120.0);
  143. glVertex3f(0.0, 0.0, 120.0);
  144.  
  145. // Koniec tworzenia ukladu wspolrzednych
  146. glEnd();
  147. }
  148.  
  149.  
  150. //////////////////////////////////////////////////////////////////////////////////////////
  151. // Funkcja generujaca pojedyncza klatke animacji
  152. void WyswietlObraz(void)
  153. {
  154. // Wyczyszczenie bufora ramki i bufora glebokosci
  155. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  156.  
  157. // Powielenie macierzy na wierzcholku stosu
  158. glPushMatrix();
  159.  
  160.  
  161.  
  162. // Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
  163. // sceny do ukladu wspolrzednych obserwatora).
  164. glTranslatef(0, 0, distance);
  165. glRotatef(rotObsX, 1, 0, 0);
  166. glRotatef(rotObsY,0,1,0);
  167. glRotatef(rotObsZ, 0, 0, 1);
  168.  
  169.  
  170. //Narysowanie ukladu wspolrzednych
  171. DrawCartesian();
  172.  
  173. // Generacja obrazu sceny w niewidocznym buforze ramki
  174. RysujLampe(obrLampy, podnRamienia);
  175.  
  176. // Usuniecie macierzy lezacej na wierzcholku stosu (powrot do stanu
  177. // sprzed wywolania funkcji)
  178. glPopMatrix();
  179.  
  180. // Przelaczenie buforow ramki
  181. glutSwapBuffers();
  182.  
  183.  
  184. }
  185.  
  186. //////////////////////////////////////////////////////////////////////////////////////////
  187. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu
  188. void UstawParametryWidoku(int szerokosc, int wysokosc)
  189. {
  190. // Ustawienie parametrow viewportu
  191. glViewport(0, 0, szerokosc, wysokosc);
  192.  
  193. // Przejscie w tryb modyfikacji macierzy rzutowania
  194. glMatrixMode(GL_PROJECTION);
  195. glLoadIdentity();
  196. gluPerspective(40.0, (float)szerokosc/(float)wysokosc, 1.0, 1000.0);
  197.  
  198. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  199. glMatrixMode(GL_MODELVIEW);
  200.  
  201. // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa
  202. glLoadIdentity();
  203. }
  204.  
  205. //////////////////////////////////////////////////////////////////////////////////////////
  206. // Funkcja klawiszy specjalnych
  207. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  208. {
  209. switch(klawisz)
  210. {
  211. case GLUT_KEY_UP:
  212. rotObsX = rotObsX + 1.0;
  213. break;
  214.  
  215. case GLUT_KEY_DOWN:
  216. rotObsX = rotObsX - 1.0;
  217. break;
  218.  
  219. case GLUT_KEY_LEFT:
  220. rotObsY = rotObsY - 1.0;
  221. break;
  222.  
  223. case GLUT_KEY_RIGHT:
  224. rotObsY = rotObsY + 1.0;
  225. break;
  226.  
  227. /* case GLUT_KEY_PAGE_UP:
  228. rotObsY = rotObsZ + 1.0;
  229. break;
  230.  
  231. case GLUT_KEY_PAGE_DOWN:
  232. rotObsY = rotObsZ + 1.0;
  233. break;*/
  234. }
  235. }
  236. //////////////////////////////////////////////////////////////////////////////////////////
  237. // Funkcja obslugi klawiatury
  238. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  239. {
  240.  
  241. switch(klawisz)
  242. {
  243. case '1':
  244. obrLampy++;
  245. break;
  246. case '2':
  247. obrLampy--;
  248. break;
  249. case '3':
  250. if (podnRamienia > 0) podnRamienia--;
  251. break;
  252. case '4':
  253. if (podnRamienia < 45) podnRamienia++;
  254. break;
  255. case '+':
  256. if (distance < minn) distance++;
  257. break;
  258. case '-':
  259. if (distance > maxx) distance--;
  260. break;
  261.  
  262. case '`':
  263. rotObsZ++;
  264. break;
  265.  
  266. case ' ':
  267. rotObsZ--;
  268. break;
  269.  
  270. }
  271.  
  272. if(klawisz == 27)
  273. exit(0);
  274. }
  275.  
  276. //////////////////////////////////////////////////////////////////////////////////////////
  277. // Glowna funkcja programu
  278. int main(int argc, char **argv)
  279. {
  280. // Zainicjowanie biblioteki GLUT
  281. glutInit(&argc, argv);
  282.  
  283. // Ustawienie trybu wyswietlania
  284. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  285.  
  286. // Ustawienie polozenia dolenego lewego rogu okna
  287. glutInitWindowPosition(100, 100);
  288.  
  289. // Ustawienie rozmiarow okna
  290. glutInitWindowSize(1000, 1000);
  291.  
  292. // Utworzenie okna
  293. glutCreateWindow("Lampa");
  294.  
  295. // Odblokowanie bufora glebokosci
  296. glEnable(GL_DEPTH_TEST);
  297.  
  298. // Ustawienie funkcji wykonywanej na danych w buforze glebokosci
  299. glDepthFunc(GL_LEQUAL);
  300.  
  301. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  302. glClearDepth(1000.0);
  303.  
  304. // Ustawienie koloru czyszczenia bufora ramki
  305. glClearColor (0.2, 0.2, 0.2, 0.0);
  306.  
  307. // Zarejestrowanie funkcji (callback) wyswietlajacej
  308. glutDisplayFunc(WyswietlObraz);
  309.  
  310. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  311. // zmieniane sa rozmiary okna
  312. glutReshapeFunc(UstawParametryWidoku);
  313.  
  314. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  315. // zadnych zadan
  316. glutIdleFunc(WyswietlObraz);
  317.  
  318. // Zarejestrowanie funkcji obslugi klawiatury
  319. glutKeyboardFunc(ObslugaKlawiatury);
  320.  
  321. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  322. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  323.  
  324.  
  325. // Zainicjowanie kwadryk tworzacych elementy lampy
  326. InicjujLampe();
  327.  
  328. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  329. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  330. glutMainLoop();
  331.  
  332. return 0;
  333. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement