Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.44 KB | None | 0 0
  1. #include <gl/freeglut.h>
  2.  
  3. //////////////////////////////////////////////////////////////////////////////////////////
  4. // Program demonstruje skladanie transformacji przy modelowaniu zlozonych obiektow
  5. // skladajacych sie z wielu elementow ruchomych (ramie robota).
  6.  
  7.  
  8. #define PREDKOSC_KATOWA_PLANETY 1.0
  9. #define PREDKOSC_KATOWA_KSIEZYCA -5.0
  10.  
  11. // Wskazniki do wykorzystywanych kwadryk
  12. GLUquadricObj *podstawaSciany;
  13. GLUquadricObj *podstawaDyskG;
  14. GLUquadricObj *przegubSciany;
  15. GLUquadricObj *przegubDyskG;
  16. GLUquadricObj *przegubDyskD;
  17. GLUquadricObj *glowicaSciany;
  18. GLUquadricObj *glowicaDyskG;
  19. GLUquadricObj *glowicaDyskD;
  20. GLfloat odlmin = 0;
  21. GLfloat odlmax = -350.0;
  22. GLfloat odleglosc = -150.0;
  23.  
  24.  
  25. GLfloat rotObsY = 40.0;
  26. GLfloat rotObsX = 40.0;
  27. GLfloat rotObsZ = 0;
  28. GLfloat rotPodstawy = 0.0;
  29. GLfloat rotRamienia1 = 40.0;
  30. GLfloat rotRamienia2 = -40.0;
  31. GLfloat rotGlowicy = 20.0;
  32. GLfloat rozUchwytow = 0.5;
  33. int alfa = 0;
  34.  
  35. //////////////////////////////////////////////////////////////////////////////////////////
  36. // Funkcja inicjujaca elementy skladowe ramienia robota zamodelowane jako kwadryki
  37. //
  38. void InicjujRamieRobota(void)
  39. {
  40. // Zainicjowanie scian bocznych walca bedacego podstawa ramienia
  41. podstawaSciany = gluNewQuadric();
  42. gluQuadricDrawStyle(podstawaSciany, GLU_LINE);
  43.  
  44. // Zainicjowanie gornej podstawy walca
  45. podstawaDyskG = gluNewQuadric();
  46. gluQuadricDrawStyle(podstawaDyskG, GLU_LINE);
  47.  
  48. // Zainicjowanie scian bocznych cylindrycznego przegubu ramienia
  49. przegubSciany = gluNewQuadric();
  50. gluQuadricDrawStyle(przegubSciany, GLU_LINE);
  51.  
  52. // Zainicjowanie gornej podstawy walca
  53. przegubDyskG = gluNewQuadric();
  54. gluQuadricDrawStyle(przegubDyskG, GLU_LINE);
  55.  
  56. // Zainicjowanie dolnej podstawy walca
  57. przegubDyskD = gluNewQuadric();
  58. gluQuadricDrawStyle(przegubDyskD, GLU_LINE);
  59.  
  60. // Zainicjowanie scian bocznych cylindra glowicy
  61. glowicaSciany = gluNewQuadric();
  62. gluQuadricDrawStyle(glowicaSciany, GLU_LINE);
  63.  
  64. // Zainicjowanie gornej podstawy walca
  65. glowicaDyskG = gluNewQuadric();
  66. gluQuadricDrawStyle(glowicaDyskG, GLU_LINE);
  67.  
  68. // Zainicjowanie dolnej podstawy walca
  69. glowicaDyskD = gluNewQuadric();
  70. gluQuadricDrawStyle(glowicaDyskD, GLU_LINE);
  71.  
  72. }
  73.  
  74.  
  75. //////////////////////////////////////////////////////////////////////////////////////////
  76. // Funkcja rysujaca obraz sceny widzianej z biezacej pozycji obserwatora
  77. // Zalozenie: Funkcja glutWireSpehere moze ryswac tylko sfere o promieniu 1
  78. void RysujRamieRobota(GLfloat obrotPodstawy, GLfloat obrotRamienia1,
  79. GLfloat obrotRamienia2, GLfloat obrotGlowicy,
  80. GLfloat rozstawUchwytow)
  81. {
  82. // Pocztaek tworzenia ukladu wspolrzednych
  83. glBegin(GL_LINES);
  84.  
  85. // Os X
  86. glColor3f(1.0, 0.0, 0.0);
  87. glVertex3f(-20.0, 0.0, 0.0);
  88. glVertex3f(20.0, 0.0, 0.0);
  89.  
  90. // Os Y
  91. glColor3f(0.0, 1.0, 0.0);
  92. glVertex3f(0.0, -20.0, 0.0);
  93. glVertex3f(0.0, 20.0, 0.0);
  94.  
  95. // Os Z
  96. glColor3f(0.0, 0.0, 1.0);
  97. glVertex3f(0.0, 0.0, -20.0);
  98. glVertex3f(0.0, 0.0, 20.0);
  99.  
  100. // Koniec tworzenia ukladu wspolrzednych
  101. glEnd();
  102.  
  103.  
  104. glColor3f(1.0, 1.0, 1.0);
  105.  
  106.  
  107. // Przygotowanie stosu macierzy modelowania
  108. glPushMatrix();
  109.  
  110. glTranslatef(0,0,80);
  111. // Rysowanie podstawy ramienia (cylinder bez dolnej podstawy)
  112. glPushMatrix();
  113. // - sciany boczne
  114. glRotatef(-90.0, 1, 0, 0);
  115. gluCylinder(podstawaSciany, 3.0, 3.0, 1.0, 20, 4);
  116.  
  117. // - gorna podstawa
  118. glTranslatef(0.0, 0.0, 1.0);
  119. gluDisk(podstawaDyskG, 0.0, 3.0, 20, 4);
  120. glPopMatrix();
  121.  
  122.  
  123. // Rysowanie dwoch wspornikow ramienia (prostopadlosciany)
  124. glPushMatrix();
  125. glScalef(3.0, 4.0, 1.0);
  126. glTranslatef(0.0, 3.0 / 4.0, 1.0);
  127. glutWireCube(1);
  128. glTranslatef(0.0, 0.0, -2.0);
  129. glutWireCube(1);
  130. glPopMatrix();
  131.  
  132. // Wyznaczenie osi obrotu ramienia w plaszczyznie pionowej
  133. glTranslatef(0.0, 4.0, 0.0);
  134.  
  135. // Obrot ramienia w plaszczyznie pionowej
  136. glRotatef(obrotRamienia1, 0, 0, 1);
  137.  
  138. // Modelowanie ramienia nr 1
  139. glPushMatrix();
  140. glScalef(8.0, 1.0, 1.0);
  141. glTranslatef(3.5 / 8.0, 0.0, 0.0);
  142. glutWireCube(1);
  143. glPopMatrix();
  144.  
  145. // Wyznaczenie osi obrotu ramienia 2 w plaszczyznie pionowej
  146. glTranslatef(7.5, 0.0, 0.0);
  147.  
  148. // Obrot ramienia 2 wzgledem ramienia 1
  149. glRotatef(obrotRamienia2, 0, 0, 1);
  150.  
  151. // Modelowanie przegubu (walca z obiema podstawami)
  152. glPushMatrix();
  153. // - sciany boczne
  154. glTranslatef(0.0, 0.0, -0.5);
  155. gluCylinder(podstawaSciany, 1.0, 1.0, 1.0, 20, 4);
  156.  
  157. // - gorna podstawa
  158. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  159.  
  160. // - dolna podstawa
  161. glTranslatef(0.0, 0.0, 1.0);
  162. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  163. glPopMatrix();
  164.  
  165. // Modelowanie ramienia nr 2
  166. glPushMatrix();
  167. glScalef(4.0, 1.0, 1.0);
  168. glTranslatef(2.0 / 4.0, 0.0, 0.0);
  169. glutWireCube(1);
  170. glPopMatrix();
  171.  
  172. // Wyznaczenie osi obrotu glowicy
  173. glTranslatef(4.0, 0.0, 0.0);
  174. glRotatef(90, 0, 1, 0);
  175. glRotatef(obrotGlowicy, 0, 0, 1);
  176.  
  177. // Modelowanie glowicy (walca z oboma podstawami)
  178. glPushMatrix();
  179. // - sciany boczne
  180. gluCylinder(podstawaSciany, 1.0, 1.0, 1.0, 20, 4);
  181.  
  182. // - gorna podstawa
  183. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  184.  
  185. // - dolna podstawa
  186. glTranslatef(0.0, 0.0, 1.0);
  187. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  188. glPopMatrix();
  189.  
  190. // Modelowanie uchwytu (dwoch prostopadloscianow, ktore sie rozsuwaja i zsuwaja)
  191. glTranslatef(0.0, 0.0, 1.5);
  192. glScalef(0.5, 0.5, 2.0);
  193. glTranslatef(-rozstawUchwytow, 0.0, 0.25);
  194. glutWireCube(1);
  195. glTranslatef(rozstawUchwytow*2.0, 0.0, 0.0);
  196. glutWireCube(1);
  197.  
  198.  
  199.  
  200. // Posprzatanie na stosie macierzy modelowania
  201. glPopMatrix();
  202. }
  203.  
  204.  
  205. //////////////////////////////////////////////////////////////////////////////////////////
  206. // Funkcja generujaca pojedyncza klatke animacji
  207. void WyswietlObraz(void)
  208. {
  209. // Wyczyszczenie bufora ramki i bufora glebokosci
  210. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  211.  
  212. // Powielenie macierzy na wierzcholku stosu
  213. glPushMatrix();
  214.  
  215. // Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
  216. // sceny do ukladu wspolrzednych obserwatora).
  217. glTranslatef(0, 0, odleglosc);
  218. glRotatef(rotObsX, 1, 0, 0);
  219. glRotatef(rotObsY, 0, 1, 0);
  220. glRotatef(rotObsZ, 0, 0, 1);
  221.  
  222.  
  223. // Generacja obrazu sceny w niewidocznym buforze ramki
  224. RysujRamieRobota(rotPodstawy, rotRamienia1, rotRamienia2, rotGlowicy, rozUchwytow);
  225.  
  226. // Usuniecie macierzy lezacej na wierzcholku stosu (powrot do stanu
  227. // sprzed wywolania funkcji)
  228. glPopMatrix();
  229.  
  230. // Przelaczenie buforow ramki
  231. glutSwapBuffers();
  232.  
  233.  
  234. }
  235.  
  236. //////////////////////////////////////////////////////////////////////////////////////////
  237. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu
  238. void UstawParametryWidoku(int szerokosc, int wysokosc)
  239. {
  240. // Ustawienie parametrow viewportu
  241. glViewport(0, 0, szerokosc, wysokosc);
  242.  
  243. // Przejscie w tryb modyfikacji macierzy rzutowania
  244. glMatrixMode(GL_PROJECTION);
  245. glLoadIdentity();
  246. gluPerspective(40.0, (float)szerokosc / (float)wysokosc, 1.0, 1000.0);
  247.  
  248. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  249. glMatrixMode(GL_MODELVIEW);
  250.  
  251. // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa
  252. glLoadIdentity();
  253. }
  254.  
  255. //////////////////////////////////////////////////////////////////////////////////////////
  256. // Funkcja klawiszy specjalnych
  257. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  258. {
  259. switch (klawisz)
  260. {
  261. case GLUT_KEY_UP:
  262. rotObsX = rotObsX + 1.0;
  263. break;
  264.  
  265. case GLUT_KEY_DOWN:
  266. rotObsX = rotObsX - 1.0;
  267. break;
  268.  
  269. case GLUT_KEY_LEFT:
  270. rotObsY = rotObsY - 1.0;
  271. break;
  272.  
  273. case GLUT_KEY_RIGHT:
  274. rotObsY = rotObsY + 1.0;
  275. break;
  276.  
  277. case GLUT_KEY_PAGE_UP:
  278. rotObsZ = rotObsZ + 1.0;
  279. break;
  280.  
  281. case GLUT_KEY_PAGE_DOWN:
  282. rotObsZ = rotObsZ - 1.0;
  283. break;
  284.  
  285. }
  286. }
  287. //////////////////////////////////////////////////////////////////////////////////////////
  288. // Funkcja obslugi klawiatury
  289. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  290. {
  291.  
  292. switch (klawisz)
  293. {
  294. case '2':
  295. rotRamienia1 = (rotRamienia1 < 90.0) ? rotRamienia1 + 1.0 : rotRamienia1;
  296. break;
  297.  
  298. case '@':
  299. rotRamienia1 = (rotRamienia1 > 0.0) ? rotRamienia1 - 1.0 : rotRamienia1;
  300. break;
  301.  
  302. case '3':
  303. rotRamienia2 = (rotRamienia2 < 0.0) ? rotRamienia2 + 1.0 : rotRamienia2;
  304. break;
  305.  
  306. case '#':
  307. rotRamienia2 = (rotRamienia2 > -90.0) ? rotRamienia2 - 1.0 : rotRamienia2;
  308. break;
  309.  
  310. case '4':
  311. rotGlowicy = (rotGlowicy < 360.0) ? rotGlowicy + 1.0 : rotGlowicy;
  312. break;
  313.  
  314. case '$':
  315. rotGlowicy = (rotGlowicy > 0.0) ? rotGlowicy - 1.0 : rotGlowicy;
  316. break;
  317.  
  318. case '5':
  319. rozUchwytow = (rozUchwytow < 1.5) ? rozUchwytow + 0.1 : rozUchwytow;
  320. break;
  321.  
  322. case '%':
  323. rozUchwytow = (rozUchwytow > 0.5) ? rozUchwytow - 0.1 : rozUchwytow;
  324. break;
  325.  
  326.  
  327. case '-':
  328. if (odleglosc - 1 < odlmax) break;
  329. else {
  330. odleglosc--;
  331. }
  332. break;
  333.  
  334. case '+':
  335. if (odleglosc + 1 > odlmin) break;
  336. else {
  337. odleglosc++;
  338. }
  339. break;
  340.  
  341. }
  342.  
  343.  
  344. if (klawisz == 27)
  345. exit(0);
  346. }
  347.  
  348. //////////////////////////////////////////////////////////////////////////////////////////
  349. // Glowna funkcja programu
  350. int main(int argc, char **argv)
  351. {
  352. // Zainicjowanie biblioteki GLUT
  353. glutInit(&argc, argv);
  354.  
  355. // Ustawienie trybu wyswietlania
  356. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  357.  
  358. // Ustawienie polozenia dolenego lewego rogu okna
  359. glutInitWindowPosition(100, 100);
  360.  
  361. // Ustawienie rozmiarow okna
  362. glutInitWindowSize(400, 400);
  363.  
  364. // Utworzenie okna
  365. glutCreateWindow("Robot");
  366.  
  367. // Odblokowanie bufora glebokosci
  368. glEnable(GL_DEPTH_TEST);
  369.  
  370. // Ustawienie funkcji wykonywanej na danych w buforze glebokosci
  371. glDepthFunc(GL_LEQUAL);
  372.  
  373. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  374. glClearDepth(1000.0);
  375.  
  376. // Ustawienie koloru czyszczenia bufora ramki
  377. glClearColor(0.0, 0.3, 0.0, 0.0);
  378.  
  379. // Zarejestrowanie funkcji (callback) wyswietlajacej
  380. glutDisplayFunc(WyswietlObraz);
  381.  
  382. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  383. // zmieniane sa rozmiary okna
  384. glutReshapeFunc(UstawParametryWidoku);
  385.  
  386. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  387. // zadnych zadan
  388. glutIdleFunc(WyswietlObraz);
  389.  
  390. // Zarejestrowanie funkcji obslugi klawiatury
  391. glutKeyboardFunc(ObslugaKlawiatury);
  392.  
  393. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  394. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  395.  
  396.  
  397. // Zainicjowanie kwadryk tworzacych ramie robota
  398. InicjujRamieRobota();
  399.  
  400. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  401. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  402. glutMainLoop();
  403.  
  404. return 0;
  405. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement