Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.51 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 <glut.h>
  6.  
  7. // Stale wyznaczajace predkosci katowe planety i ksiezyca (w stopniach/sek.)
  8. #define PREDKOSC_KATOWA_PLANETY 1.0
  9. #define PREDKOSC_KATOWA_KSIEZYCA -5.0
  10.  
  11. // Wskazniki do wykorzystywanych kwadryk
  12. GLUquadricObj *kolo;
  13. GLUquadricObj *podstawaSciany;
  14. GLUquadricObj *podstawaDyskG;
  15. GLUquadricObj *przegubSciany;
  16. GLUquadricObj *przegubDyskG;
  17. GLUquadricObj *przegubDyskD;
  18. GLUquadricObj *glowicaSciany;
  19. GLUquadricObj *glowicaDyskG;
  20. GLUquadricObj *glowicaDyskD;
  21.  
  22. GLfloat rotObsY = 40.0;
  23. GLfloat rotObsX = 40.0;
  24. GLfloat rotPodstawy = 0.0;
  25. GLfloat rotRamienia1= 30.0;
  26. GLfloat rotRamienia2= 10;
  27. GLfloat rotGlowicy = 0;
  28. GLfloat rozUchwytow = -40;
  29. GLfloat ruchoper = 0;
  30.  
  31.  
  32. //////////////////////////////////////////////////////////////////////////////////////////
  33. // Funkcja inicjujaca elementy skladowe ramienia robota zamodelowane jako kwadryki
  34. //
  35. void InicjujRamieRobota(void)
  36. {
  37. // Zainicjowanie scian bocznych walca bedacego podstawa ramienia
  38. kolo = gluNewQuadric();
  39. gluQuadricDrawStyle(kolo, GLU_LINE);
  40.  
  41.  
  42. // Zainicjowanie scian bocznych walca bedacego podstawa ramienia
  43. podstawaSciany = gluNewQuadric();
  44. gluQuadricDrawStyle(podstawaSciany, GLU_LINE);
  45.  
  46. // Zainicjowanie gornej podstawy walca
  47. podstawaDyskG = gluNewQuadric();
  48. gluQuadricDrawStyle(podstawaDyskG, GLU_LINE);
  49.  
  50. // Zainicjowanie scian bocznych cylindrycznego przegubu ramienia
  51. przegubSciany = gluNewQuadric();
  52. gluQuadricDrawStyle(przegubSciany, GLU_LINE);
  53.  
  54. // Zainicjowanie gornej podstawy walca
  55. przegubDyskG = gluNewQuadric();
  56. gluQuadricDrawStyle(przegubDyskG, GLU_LINE);
  57.  
  58. // Zainicjowanie dolnej podstawy walca
  59. przegubDyskD = gluNewQuadric();
  60. gluQuadricDrawStyle(przegubDyskD, GLU_LINE);
  61.  
  62. // Zainicjowanie scian bocznych cylindra glowicy
  63. glowicaSciany = gluNewQuadric();
  64. gluQuadricDrawStyle(glowicaSciany, GLU_LINE);
  65.  
  66. // Zainicjowanie gornej podstawy walca
  67. glowicaDyskG = gluNewQuadric();
  68. gluQuadricDrawStyle(glowicaDyskG, GLU_LINE);
  69.  
  70. // Zainicjowanie dolnej podstawy walca
  71. glowicaDyskD = gluNewQuadric();
  72. gluQuadricDrawStyle(glowicaDyskD, GLU_LINE);
  73.  
  74. }
  75.  
  76.  
  77. //////////////////////////////////////////////////////////////////////////////////////////
  78. // Funkcja rysujaca obraz sceny widzianej z biezacej pozycji obserwatora
  79. // Zalozenie: Funkcja glutWireSpehere moze ryswac tylko sfere o promieniu 1
  80. void RysujRamieRobota(GLfloat obrotPodstawy, GLfloat obrotRamienia1,
  81. GLfloat obrotRamienia2, GLfloat obrotGlowicy,
  82. GLfloat rozstawUchwytow)
  83. {
  84. // Pocztaek tworzenia ukladu wspolrzednych
  85. glBegin(GL_LINES);
  86.  
  87. // Os X
  88. glColor3f(1.0, 0.0, 0.0); //red
  89. glVertex3f(-20.0, 0.0, 0.0);
  90. glVertex3f(20.0, 0.0, 0.0);
  91.  
  92. // Os Y
  93. glColor3f(0.0,1.0,0.0); // green
  94. glVertex3f(0.0, -20.0, 0.0);
  95. glVertex3f(0.0, 20.0, 0.0);
  96.  
  97. // Os Z
  98. glColor3f(0.0,0.0,1.0); // blue
  99. glVertex3f(0.0, 0.0, -20.0);
  100. glVertex3f(0.0, 0.0, 20.0);
  101.  
  102. // Koniec tworzenia ukladu wspolrzednych
  103. glEnd();
  104.  
  105. glColor3f(1.0,1.0,1.0);
  106.  
  107.  
  108.  
  109.  
  110. // Przygotowanie stosu macierzy modelowania
  111. glPushMatrix();
  112. glRotatef(rotRamienia2, 0, 1, 0);
  113. glPushMatrix();
  114. glPushMatrix();
  115. glTranslatef(0, 0, 0);
  116. glScalef(20, 10, 5);
  117. glutWireCube(1);
  118. glPopMatrix();
  119.  
  120. glPushMatrix();
  121. glTranslatef(0, 5, 0);
  122. glScalef(5, 2, 1);
  123. glutWireCube(1);
  124. glPopMatrix();
  125.  
  126. glPushMatrix();
  127. glTranslatef(0, 5, 0);
  128. glScalef(5, 2, 1);
  129. glutWireCube(1);
  130. glPopMatrix();
  131.  
  132. glPushMatrix();
  133. glTranslatef(-7, 5, 0);
  134. glutSolidSphere(1, 20, 20);
  135. glPopMatrix();
  136.  
  137. glPushMatrix();
  138. glTranslatef(0,0,2.5);
  139. gluCylinder(kolo, 4, 4, 5, 100, 100);
  140. glColor3f(0.0, 0.0, 1.0); // blue
  141. gluDisk(kolo, 0, 4, 100, 100);
  142. glTranslatef(0, 0, 5);
  143. gluDisk(kolo, 0, 4, 100, 100);
  144. glPopMatrix();
  145.  
  146. glColor3f(1.0, 1.0, 1.0);
  147.  
  148. // obiektyw maly
  149. glTranslatef(0, 0, rotGlowicy);
  150. glRotatef(rotGlowicy, 0, 0, 1);
  151.  
  152. glPushMatrix();
  153. glPushMatrix();
  154. glTranslatef(0, 0, 5);
  155. gluCylinder(kolo, 3, 3, 5, 100, 100);
  156. glColor3f(0.0, 1.0, 0.0); // green
  157. gluDisk(kolo, 0, 3, 100, 100);
  158. glTranslatef(0, 0, 5);
  159. gluDisk(kolo, 0, 3, 100, 100);
  160. glPopMatrix();
  161.  
  162. glColor3f(1.0, 1.0, 1.0);
  163.  
  164. glPushMatrix();
  165. glTranslatef(0, 0, 5);
  166. gluCylinder(kolo, 3, 3, 5, 100, 100);
  167. glColor3f(0.0, 1.0, 0.0); // green
  168. gluDisk(kolo, 0, 3, 100, 100);
  169. glTranslatef(0, 0, 5);
  170. gluDisk(kolo, 0, 3, 100, 100);
  171. glPopMatrix();
  172.  
  173. glColor3f(1.0, 1.0, 1.0);
  174.  
  175. glPushMatrix();
  176. glTranslatef(0, 0, 10);
  177. gluCylinder(kolo, 3, 5, 2, 50,50);
  178. glColor3f(0.0, 0.5, 0.3);
  179. glPopMatrix();
  180.  
  181. glColor3f(1.0, 1.0, 1.0);
  182. glPopMatrix();
  183. glPopMatrix();
  184. //statyw
  185. glPushMatrix();
  186. glTranslatef(0, -5, 0);
  187. //glScalef(10, 3, 4);
  188. glRotatef(90, 1, 0, 0);
  189. gluCylinder(kolo, 2, 2, 2, 100, 100);
  190. glTranslatef(0, 0, 2);
  191. gluDisk(kolo, 0, 2, 100, 100);
  192. glPopMatrix();
  193. glPopMatrix();
  194.  
  195.  
  196. glPushMatrix();
  197. glTranslatef(0, -7, 0);
  198. glRotatef(90, 1, 0, 0);
  199. glRotatef(rotRamienia1, 1, 0, 0);
  200. gluCylinder(kolo, 0.15, 0.15, 10, 50, 50);
  201. glPopMatrix();
  202.  
  203. glPushMatrix();
  204. glTranslatef(0, -7, 0);
  205. glRotatef(90, 1, 0, 0);
  206. glRotatef(rotRamienia1, 0, 1, 0);
  207. gluCylinder(kolo, 0.15, 0.15, 10, 50, 50);
  208. glPopMatrix();
  209.  
  210. glPushMatrix();
  211. glTranslatef(0, -7, 0);
  212. glRotatef(90, 1, 0, 0);
  213. glRotatef(-rotRamienia1, 1, 0, 0);
  214. gluCylinder(kolo, 0.15, 0.15, 10, 50, 50);
  215. glPopMatrix();
  216.  
  217. //glPushMatrix();
  218. //glTranslatef(0, 0.4, 0);
  219. //glScalef(10, 0.8, 4);
  220. //glutWireCube(1);
  221. //glPopMatrix();
  222.  
  223. //glPushMatrix();
  224. //glTranslatef(0, -0.7, 0);
  225. //glScalef(10, 1.4 , 2);
  226. //glutWireCube(1);
  227. //glPopMatrix();
  228.  
  229. //glPushMatrix();
  230. //glTranslatef(3, -1.4, -2);
  231. //gluCylinder(kolo, 1, 1, 1, 50, 50);
  232. //glColor3f(0.0, 0.0, 1.0); // blue
  233. //gluDisk(kolo, 0, 1, 50, 50);
  234. //glTranslatef(0, 0, 1);
  235. //gluDisk(kolo, 0, 1, 50, 50);
  236. //glPopMatrix();
  237.  
  238. //glColor3f(1.0, 1.0, 1.0);
  239.  
  240. //// kolo
  241. //glPushMatrix();
  242. //glTranslatef(-3, -1.4, -2);
  243. //gluCylinder(kolo, 1, 1, 1, 50, 50);
  244. //glColor3f(0.0, 0.0, 1.0); // blue
  245. //gluDisk(kolo, 0, 1, 50, 50);
  246. //glTranslatef(0, 0, 1);
  247. //gluDisk(kolo, 0, 1, 50, 50);
  248. //glPopMatrix();
  249.  
  250. //glColor3f(1.0, 1.0, 1.0);
  251. //// koniec kola
  252.  
  253. //glPushMatrix();
  254. //glTranslatef(3, -1.4, 1);
  255. //gluCylinder(kolo, 1, 1, 1, 50, 50);
  256. //glColor3f(0.0, 0.0, 1.0); // blue
  257. //gluDisk(kolo, 0, 1, 50, 50);
  258. //glTranslatef(0, 0, 1);
  259. //gluDisk(kolo, 0, 1, 50, 50);
  260. //glPopMatrix();
  261.  
  262. //glColor3f(1.0, 1.0, 1.0);
  263.  
  264. //glPushMatrix();
  265. //glTranslatef(-3, -1.4, 1);
  266. //gluCylinder(kolo, 1, 1, 1, 50, 50);
  267. //glColor3f(0.0, 0.0, 1.0); // blue
  268. //gluDisk(kolo, 0, 1, 50, 50);
  269. //glTranslatef(0, 0, 1);
  270. //gluDisk(kolo, 0, 1, 50, 50);
  271. //glPopMatrix();
  272.  
  273. //glColor3f(1.0, 1.0, 1.0);
  274.  
  275.  
  276. //
  277. //glTranslatef(1.4, 0, 0);
  278. //// wieżyczka
  279. //glPushMatrix();
  280. //glTranslatef(0,0.8,0);
  281. //glRotatef(rotGlowicy, 0, 1, 0);
  282. //glRotatef(-90, 1,0,0);
  283. //
  284. //gluCylinder(kolo, 2, 1, 1.1, 50,50);
  285. //glColor3f(0.0, 0.5, 0.3); // zielony ala
  286. //gluDisk(kolo, 0, 2, 50, 50);
  287. //glTranslatef(0, 0, 1.1);
  288. //gluDisk(kolo, 0, 1, 50, 50);
  289. //glPopMatrix();
  290. //// lufa
  291. //glRotatef(rotGlowicy, 0, 1, 0);
  292. //glRotatef(rotRamienia2, 0, 0, 1);
  293. //glPushMatrix();
  294. //glRotatef(90, 0, 1, 0);
  295. //glTranslatef(0, 1.5, 0);
  296. //gluCylinder(kolo, 0.15, 0.15, 4.5, 50, 50);
  297. //glPopMatrix();
  298.  
  299.  
  300.  
  301. // Posprzatanie na stosie macierzy modelowania
  302. glPopMatrix();
  303. }
  304.  
  305.  
  306. //////////////////////////////////////////////////////////////////////////////////////////
  307. // Funkcja generujaca pojedyncza klatke animacji
  308. void WyswietlObraz(void)
  309. {
  310. // Wyczyszczenie bufora ramki i bufora glebokosci
  311. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  312.  
  313. // Powielenie macierzy na wierzcholku stosu
  314. glPushMatrix();
  315.  
  316. // Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
  317. // sceny do ukladu wspolrzednych obserwatora).
  318. glTranslatef(0, ruchoper, 0);
  319. glTranslatef(0, 0, rozUchwytow);
  320.  
  321. glRotatef(rotObsY,0,1,0);
  322.  
  323.  
  324. // Generacja obrazu sceny w niewidocznym buforze ramki
  325. RysujRamieRobota(rotPodstawy, rotRamienia1, rotRamienia2, rotGlowicy, rozUchwytow);
  326.  
  327. // Usuniecie macierzy lezacej na wierzcholku stosu (powrot do stanu
  328. // sprzed wywolania funkcji)
  329. glPopMatrix();
  330.  
  331. // Przelaczenie buforow ramki
  332. glutSwapBuffers();
  333.  
  334.  
  335. }
  336.  
  337. //////////////////////////////////////////////////////////////////////////////////////////
  338. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu
  339. void UstawParametryWidoku(int szerokosc, int wysokosc)
  340. {
  341. // Ustawienie parametrow viewportu
  342. glViewport(0, 0, szerokosc, wysokosc);
  343.  
  344. // Przejscie w tryb modyfikacji macierzy rzutowania
  345. glMatrixMode(GL_PROJECTION);
  346. glLoadIdentity();
  347. gluPerspective(40.0, (float)szerokosc/(float)wysokosc, 1.0, 1000.0);
  348.  
  349. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  350. glMatrixMode(GL_MODELVIEW);
  351.  
  352. // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa
  353. glLoadIdentity();
  354. }
  355.  
  356. //////////////////////////////////////////////////////////////////////////////////////////
  357. // Funkcja klawiszy specjalnych
  358. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  359. {
  360. switch(klawisz)
  361. {
  362. case GLUT_KEY_UP:
  363. rotObsX = rotObsX + 1.0;
  364. break;
  365.  
  366. case GLUT_KEY_DOWN:
  367. rotObsX = rotObsX - 1.0;
  368. break;
  369.  
  370. case GLUT_KEY_LEFT:
  371. rotObsY = rotObsY - 1.0;
  372. break;
  373.  
  374. case GLUT_KEY_RIGHT:
  375. rotObsY = rotObsY + 1.0;
  376. break;
  377. }
  378. }
  379. //////////////////////////////////////////////////////////////////////////////////////////
  380. // Funkcja obslugi klawiatury
  381. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  382. {
  383.  
  384. switch(klawisz)
  385. {
  386. case '2':
  387. rotRamienia1 = (rotRamienia1 < 90.0) ? rotRamienia1 + 1.0 : rotRamienia1;
  388. break;
  389.  
  390. case '@':
  391. rotRamienia1 = (rotRamienia1 > 0.0) ? rotRamienia1 - 1.0 : rotRamienia1;
  392. break;
  393.  
  394. case '3':
  395. rotRamienia2 = rotRamienia2 + 1.0;
  396. break;
  397.  
  398. case '#':
  399. rotRamienia2 = rotRamienia2 - 1.0;
  400. break;
  401.  
  402. case '4':
  403. rotGlowicy = (rotGlowicy < 360.0) ? rotGlowicy + 0.01 : rotGlowicy;
  404. break;
  405.  
  406. case '$':
  407. rotGlowicy = (rotGlowicy > 0.0) ? rotGlowicy - 0.01 : rotGlowicy;
  408. break;
  409.  
  410. case '5':
  411. rozUchwytow = rozUchwytow + 0.1;
  412. break;
  413.  
  414. case '%':
  415. rozUchwytow = rozUchwytow - 0.1;
  416. break;
  417. case '6':
  418. ruchoper = ruchoper + 0.1;
  419. break;
  420.  
  421. case '7':
  422. ruchoper = ruchoper - 0.1;
  423. break;
  424. }
  425.  
  426. if(klawisz == 27)
  427. exit(0);
  428. }
  429.  
  430. //////////////////////////////////////////////////////////////////////////////////////////
  431. // Glowna funkcja programu
  432. int main(int argc, char **argv)
  433. {
  434. // Zainicjowanie biblioteki GLUT
  435. glutInit(&argc, argv);
  436.  
  437. // Ustawienie trybu wyswietlania
  438. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  439.  
  440. // Ustawienie polozenia dolenego lewego rogu okna
  441. glutInitWindowPosition(100, 100);
  442.  
  443. // Ustawienie rozmiarow okna
  444. glutInitWindowSize(400, 400);
  445.  
  446. // Utworzenie okna
  447. glutCreateWindow("Robot");
  448.  
  449. // Odblokowanie bufora glebokosci
  450. glEnable(GL_DEPTH_TEST);
  451.  
  452. // Ustawienie funkcji wykonywanej na danych w buforze glebokosci
  453. glDepthFunc(GL_LEQUAL);
  454.  
  455. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  456. glClearDepth(1000.0);
  457.  
  458. // Ustawienie koloru czyszczenia bufora ramki
  459. glClearColor (0.0, 0.3, 0.0, 0.0);
  460.  
  461. // Zarejestrowanie funkcji (callback) wyswietlajacej
  462. glutDisplayFunc(WyswietlObraz);
  463.  
  464. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  465. // zmieniane sa rozmiary okna
  466. glutReshapeFunc(UstawParametryWidoku);
  467.  
  468. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  469. // zadnych zadan
  470. glutIdleFunc(WyswietlObraz);
  471.  
  472. // Zarejestrowanie funkcji obslugi klawiatury
  473. glutKeyboardFunc(ObslugaKlawiatury);
  474.  
  475. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  476. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  477.  
  478.  
  479. // Zainicjowanie kwadryk tworzacych ramie robota
  480. InicjujRamieRobota();
  481.  
  482. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  483. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  484. glutMainLoop();
  485.  
  486. return 0;
  487. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement