Advertisement
Guest User

KKKKKK

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