Advertisement
Guest User

wiatrak full

a guest
Dec 10th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.19 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.  
  8. // Wskazniki do wykorzystywanych kwadryk
  9. GLUquadricObj* podstawaSciany;
  10. GLUquadricObj* podstawaDyskG;
  11. GLUquadricObj* przegubSciany;
  12. GLUquadricObj* przegubDyskG;
  13. GLUquadricObj* przegubDyskD;
  14. GLUquadricObj* glowicaSciany;
  15. GLUquadricObj* glowicaDyskG;
  16. GLUquadricObj* glowicaDyskD;
  17.  
  18. // rakieta
  19. GLUquadricObj* srodek;
  20. GLfloat rotRakiety = 0.0;
  21. GLfloat rotRakiety2 = 0.0;
  22. GLfloat rotRakiety22 = 0.0;
  23.  
  24. // Zadanie 2
  25. GLUquadricObj* orb;
  26. GLfloat rotPlanety1 = 0.0;
  27. GLfloat spinPlanety1 = 0.0;
  28. GLfloat rotKsiezyca = 0.0;
  29.  
  30. GLfloat rotPlanety2 = 0.0;
  31. GLfloat rotPlanety3 = 0.0;
  32.  
  33. GLfloat rotObsY = 40.0;
  34. GLfloat rotObsX = 40.0;
  35. GLfloat rotObsZ = 0.0;
  36.  
  37. GLfloat rotPodstawy = 0.0;
  38. GLfloat rotRamienia1 = 40.0;
  39. GLfloat rotRamienia2 = -40.0;
  40. GLfloat rotGlowicy = 20.0;
  41. GLfloat rozUchwytow = 0.5;
  42. int alfa = 0;
  43.  
  44. GLfloat odlobs = -250.0;
  45. GLfloat odlmin = 0.0;
  46. GLfloat odlmax = -500;
  47. int frame = 0;
  48.  
  49. //////////////////////////////////////////////////////////////////////////////////////////
  50. // Funkcja inicjujaca elementy skladowe ramienia robota zamodelowane jako kwadryki
  51. //
  52. void InicjujRamieRobota(void)
  53. {
  54. // Zainicjowanie scian bocznych walca bedacego podstawa ramienia
  55. podstawaSciany = gluNewQuadric();
  56. gluQuadricDrawStyle(podstawaSciany, GLU_FILL);
  57.  
  58. // Zainicjowanie gornej podstawy walca
  59. podstawaDyskG = gluNewQuadric();
  60. gluQuadricDrawStyle(podstawaDyskG, GLU_LINE);
  61.  
  62. // Zainicjowanie scian bocznych cylindrycznego przegubu ramienia
  63. przegubSciany = gluNewQuadric();
  64. gluQuadricDrawStyle(przegubSciany, GLU_LINE);
  65.  
  66. // Zainicjowanie gornej podstawy walca
  67. przegubDyskG = gluNewQuadric();
  68. gluQuadricDrawStyle(przegubDyskG, GLU_LINE);
  69.  
  70. // Zainicjowanie dolnej podstawy walca
  71. przegubDyskD = gluNewQuadric();
  72. gluQuadricDrawStyle(przegubDyskD, GLU_LINE);
  73.  
  74. // Zainicjowanie scian bocznych cylindra glowicy
  75. glowicaSciany = gluNewQuadric();
  76. gluQuadricDrawStyle(glowicaSciany, GLU_LINE);
  77.  
  78. // Zainicjowanie gornej podstawy walca
  79. glowicaDyskG = gluNewQuadric();
  80. gluQuadricDrawStyle(glowicaDyskG, GLU_LINE);
  81.  
  82. // Zainicjowanie dolnej podstawy walca
  83. glowicaDyskD = gluNewQuadric();
  84. gluQuadricDrawStyle(glowicaDyskD, GLU_LINE);
  85.  
  86. }
  87.  
  88.  
  89. //////////////////////////////////////////////////////////////////////////////////////////
  90. // Funkcja rysujaca obraz sceny widzianej z biezacej pozycji obserwatora
  91. // Zalozenie: Funkcja glutWireSpehere moze ryswac tylko sfere o promieniu 1
  92. void RysujRamieRobota(GLfloat obrotPodstawy, GLfloat obrotRamienia1,
  93. GLfloat obrotRamienia2, GLfloat obrotGlowicy,
  94. GLfloat rozstawUchwytow)
  95. {
  96. // Pocztaek tworzenia ukladu wspolrzednych
  97. glBegin(GL_LINES);
  98.  
  99. // Os X
  100. glColor3f(1.0, 0.0, 0.0);
  101. glVertex3f(-140.0, 0.0, 0.0);
  102. glVertex3f(140.0, 0.0, 0.0);
  103.  
  104. // Os Y
  105. glColor3f(0.0, 1.0, 0.0);
  106. glVertex3f(0.0, -120.0, 0.0);
  107. glVertex3f(0.0, 120.0, 0.0);
  108.  
  109. // Os Z
  110. glColor3f(0.0, 0.0, 1.0);
  111. glVertex3f(0.0, 0.0, -120.0);
  112. glVertex3f(0.0, 0.0, 120.0);
  113.  
  114. // Koniec tworzenia ukladu wspolrzednych
  115. glEnd();
  116.  
  117.  
  118. glColor3f(1.0, 1.0, 0.0);
  119.  
  120. glPushMatrix();
  121. glTranslatef(50, 0.0, 0.0);
  122.  
  123. // Przygotowanie stosu macierzy modelowania
  124. glPushMatrix();
  125.  
  126. // Rysowanie podstawy ramienia (cylinder bez dolnej podstawy)
  127. glPushMatrix();
  128. // - sciany boczne
  129. glRotatef(-90.0, 1, 0, 0);
  130. gluCylinder(podstawaSciany, 3.0, 3.0, 1.0, 20, 4);
  131.  
  132. // - gorna podstawa
  133. glTranslatef(0.0, 0.0, 1.0);
  134. gluDisk(podstawaDyskG, 0.0, 3.0, 20, 4);
  135. glPopMatrix();
  136.  
  137.  
  138. // Rysowanie dwoch wspornikow ramienia (prostopadlosciany)
  139. glPushMatrix();
  140. glScalef(3.0, 4.0, 1.0);
  141. glTranslatef(0.0, 3.0 / 4.0, 1.0);
  142. glutWireCube(1);
  143. glTranslatef(0.0, 0.0, -2.0);
  144. glutWireCube(1);
  145. glPopMatrix();
  146.  
  147. // Wyznaczenie osi obrotu ramienia w plaszczyznie pionowej
  148. glTranslatef(0.0, 4.0, 0.0);
  149.  
  150. // Obrot ramienia w plaszczyznie pionowej
  151. glRotatef(obrotRamienia1, 0, 0, 1);
  152.  
  153. // Modelowanie ramienia nr 1
  154. glPushMatrix();
  155. glScalef(8.0, 1.0, 1.0);
  156. glTranslatef(3.5 / 8.0, 0.0, 0.0);
  157. glutWireCube(1);
  158. glPopMatrix();
  159.  
  160. // Wyznaczenie osi obrotu ramienia 2 w plaszczyznie pionowej
  161. glTranslatef(7.5, 0.0, 0.0);
  162.  
  163. // Obrot ramienia 2 wzgledem ramienia 1
  164. glRotatef(obrotRamienia2, 0, 0, 1);
  165.  
  166. // Modelowanie przegubu (walca z obiema podstawami)
  167. glPushMatrix();
  168. // - sciany boczne
  169. glTranslatef(0.0, 0.0, -0.5);
  170. gluCylinder(podstawaSciany, 1.0, 1.0, 1.0, 20, 4);
  171.  
  172. // - gorna podstawa
  173. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  174.  
  175. // - dolna podstawa
  176. glTranslatef(0.0, 0.0, 1.0);
  177. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  178. glPopMatrix();
  179.  
  180. // Modelowanie ramienia nr 2
  181. glPushMatrix();
  182. glScalef(4.0, 1.0, 1.0);
  183. glTranslatef(2.0 / 4.0, 0.0, 0.0);
  184. glutWireCube(1);
  185. glPopMatrix();
  186.  
  187. // Wyznaczenie osi obrotu glowicy
  188. glTranslatef(4.0, 0.0, 0.0);
  189. glRotatef(90, 0, 1, 0);
  190. glRotatef(obrotGlowicy, 0, 0, 1);
  191.  
  192. // Modelowanie glowicy (walca z oboma podstawami)
  193. glPushMatrix();
  194. // - sciany boczne
  195. gluCylinder(podstawaSciany, 1.0, 1.0, 1.0, 20, 4);
  196.  
  197. // - gorna podstawa
  198. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  199.  
  200. // - dolna podstawa
  201. glTranslatef(0.0, 0.0, 1.0);
  202. gluDisk(podstawaDyskG, 0.0, 1.0, 20, 4);
  203. glPopMatrix();
  204.  
  205. // Modelowanie uchwytu (dwoch prostopadloscianow, ktore sie rozsuwaja i zsuwaja)
  206. glTranslatef(0.0, 0.0, 1.5);
  207. glScalef(0.5, 0.5, 2.0);
  208. glTranslatef(-rozstawUchwytow, 0.0, 0.25);
  209. glutWireCube(1);
  210. glTranslatef(rozstawUchwytow * 2.0, 0.0, 0.0);
  211. glutWireCube(1);
  212.  
  213.  
  214.  
  215. // Posprzatanie na stosie macierzy modelowania
  216. glPopMatrix();
  217. glPopMatrix();
  218. }
  219.  
  220. void RysujZadanie1()
  221. {
  222. glPushMatrix();
  223. glTranslatef(80, 0, 0);
  224.  
  225. //podstawa wiezy
  226. glPushMatrix();
  227. glTranslatef(0.0, 5.0, 0.0);
  228. glScalef(4.23, 10.0, 4.23);
  229. glRotatef(45.0, 0.0, 1.0, 0.0);
  230. glColor3f(1.0, 0.0, 0.0);
  231. glutSolidCube(1.0);
  232. glPopMatrix();
  233.  
  234. //szczyt wiezy
  235. glPushMatrix();
  236. glTranslatef(0.0, 11.5, 0.0);
  237. glScalef(8.0, 3.0, 8.0);
  238. glColor3f(0.0, 1.0, 0.0);
  239. glutSolidCube(1.0);
  240. glPopMatrix();
  241.  
  242. //maly szescian 1
  243. glPushMatrix();
  244. glTranslatef(3.0, 14.0, 3.0);
  245. glScalef(2.0, 2.0, 2.0);
  246. glColor3f(0.0, 0.0, 1.0);
  247. glutSolidCube(1.0);
  248. glPopMatrix();
  249.  
  250. //maly szescian 2
  251. glPushMatrix();
  252. glTranslatef(-3.0, 14.0, -3.0);
  253. glScalef(2.0, 2.0, 2.0);
  254. glColor3f(0.0, 0.0, 1.0);
  255. glutSolidCube(1.0);
  256. glPopMatrix();
  257.  
  258. //maly szescian 3
  259. glPushMatrix();
  260. glTranslatef(3.0, 14.0, -3.0);
  261. glScalef(2.0, 2.0, 2.0);
  262. glColor3f(0.0, 0.0, 1.0);
  263. glutSolidCube(1.0);
  264. glPopMatrix();
  265.  
  266. //maly szescian 4
  267. glPushMatrix();
  268. glTranslatef(-3.0, 14.0, 3.0);
  269. glScalef(2.0, 2.0, 2.0);
  270. glColor3f(0.0, 0.0, 1.0);
  271. glutSolidCube(1.0);
  272. glPopMatrix();
  273.  
  274. glPopMatrix();
  275. }
  276.  
  277.  
  278. void RysujZadanie2()
  279. {
  280.  
  281. glPushMatrix();
  282. glTranslatef(0, 50, 0);
  283. orb = gluNewQuadric();
  284. gluQuadricDrawStyle(orb, GLU_LINE);
  285.  
  286. // slonce i orbity
  287. glColor3f(1.0, 1.0, 0.0);
  288. glPushMatrix();
  289.  
  290. glRotatef(90.0, 1, 0, 0);
  291. glRotatef(-90.0, 1.0, 0.0, 0.0);
  292. glPopMatrix();
  293.  
  294. glColor3f(1.0, 1.0, 0.0);
  295. glPushMatrix();
  296.  
  297. glRotatef(90.0, 1, 0, 0);
  298. gluDisk(orb, 20, 20, 100.0, 100); // orbita planet 1
  299. gluDisk(orb, 12, 12, 100.0, 100); // orbita planet 2
  300. gluDisk(orb, 40, 40, 100.0, 100); // orbita planet 3
  301. glScalef(5.0, 5.0, 5.0);
  302. glutWireSphere(1.0, 20.0, 20.0);
  303. glRotatef(-90, 1, 0, 0);
  304. glPopMatrix();
  305.  
  306.  
  307. //pierwsza planeta i ksiezyc
  308. glPushMatrix();
  309.  
  310. glColor3f(1.0, 0.0, 0.0);
  311. glRotatef(rotPlanety1, 0.0, 1.0, 0.0);
  312. glTranslatef(0.0, 0.0, 20.0);
  313. glPushMatrix();
  314.  
  315. glRotatef(spinPlanety1, 0.0, 1.0, 0.0);
  316. glRotatef(-90, 1, 0, 0);
  317. gluDisk(orb, 5.0, 5.0, 100, 100);
  318. glRotatef(-90, 1, 0, 0);
  319. glutWireSphere(2.0, 20.0, 20.0);
  320. glPopMatrix();
  321.  
  322. glColor3f(0.0, 0.0, 1.0);
  323. glRotatef(rotKsiezyca, 0.0, 1.0, 0.0);
  324. glTranslatef(5.0, 0.0, 0.0);
  325. glScalef(0.5, 0.5, 0.5);
  326. glutWireSphere(1.0, 20.0, 20.0);
  327.  
  328. glPopMatrix();
  329.  
  330. // druga planeta bez ksiezyca
  331. glPushMatrix();
  332.  
  333. glColor3f(1.0, 0.0, 0.0);
  334. glRotatef(rotPlanety2, 0.0, 1.0, 0.0);
  335. glTranslatef(0.0, 0.0, 12.0); // promien orbity 12
  336. glutWireSphere(3.0, 20.0, 20.0); // promien planety 3
  337.  
  338. glPopMatrix();
  339.  
  340.  
  341. // trzecia planeta bez ksiezyca
  342. glPushMatrix();
  343.  
  344. glColor3f(1.0, 0.0, 0.0);
  345. glRotatef(rotPlanety3, 0.0, 1.0, 0.0);
  346. glTranslatef(0.0, 0.0, 40.0); // promien orbity 12
  347. glutWireSphere(4.0, 20.0, 20.0); // promien planety 4
  348.  
  349. glPopMatrix();
  350.  
  351. glPopMatrix();
  352.  
  353.  
  354. rotPlanety1 -= 0.25; // CW
  355. spinPlanety1 += 1.0; // CCW
  356. rotKsiezyca += 0.5; // CCW
  357.  
  358. rotPlanety2 += 0.15; // CCW
  359. rotPlanety3 -= 0.5; // CW
  360. }
  361.  
  362. void RysujZadanie3()
  363. {
  364. glPushMatrix();
  365.  
  366. glPushMatrix();
  367. glRotatef(rotPlanety1, 0, 1, 0);
  368. glTranslatef(30, 0, 0);
  369. orb = gluNewQuadric();
  370. gluQuadricDrawStyle(orb, GLU_LINE);
  371.  
  372. // slonce i orbity
  373. glColor3f(1.0, 1.0, 0.0);
  374. glPushMatrix();
  375.  
  376. glRotatef(90.0, 1, 0, 0);
  377. glRotatef(-90.0, 1.0, 0.0, 0.0);
  378. glPopMatrix();
  379.  
  380. glColor3f(1.0, 1.0, 0.0);
  381. glPushMatrix();
  382.  
  383. glRotatef(90.0, 1, 0, 0);
  384. gluDisk(orb, 20, 20, 100.0, 100); // orbita planet 1
  385. // gluDisk(orb, 12, 12, 100.0, 100); // orbita planet 2
  386. // gluDisk(orb, 40, 40, 100.0, 100); // orbita planet 3
  387. glScalef(5.0, 5.0, 5.0);
  388. glutWireSphere(1.0, 20.0, 20.0);
  389. glRotatef(-90, 1, 0, 0);
  390. glPopMatrix();
  391.  
  392.  
  393. //pierwsza planeta i ksiezyc
  394. glPushMatrix();
  395.  
  396. glColor3f(1.0, 0.0, 0.0);
  397. glRotatef(rotPlanety1, 0.0, 1.0, 0.0);
  398. glTranslatef(0.0, 0.0, 20.0);
  399. glPushMatrix();
  400.  
  401. glRotatef(spinPlanety1, 0.0, 1.0, 0.0);
  402. glRotatef(-90, 1, 0, 0);
  403. gluDisk(orb, 5.0, 5.0, 100, 100);
  404. glRotatef(-90, 1, 0, 0);
  405. glutWireSphere(2.0, 20.0, 20.0);
  406. glPopMatrix();
  407.  
  408.  
  409. glColor3f(0.0, 0.0, 1.0);
  410. glRotatef(rotKsiezyca, 0.0, 1.0, 0.0);
  411. glTranslatef(5.0, 0.0, 0.0);
  412. glScalef(0.5, 0.5, 0.5);
  413. glutWireSphere(1.0, 20.0, 20.0);
  414. glPopMatrix();
  415. glPopMatrix();
  416.  
  417. // druga planeta bez ksiezyca
  418. //glPushMatrix();
  419.  
  420. //glColor3f(1.0, 0.0, 0.0);
  421. //glRotatef(rotPlanety2, 0.0, 1.0, 0.0);
  422. //glTranslatef(0.0, 0.0, 12.0); // promien orbity 12
  423. //glutWireSphere(3.0, 20.0, 20.0); // promien planety 3
  424.  
  425. //glPopMatrix();
  426.  
  427.  
  428. // trzecia planeta bez ksiezyca
  429. //glPushMatrix();
  430.  
  431. //glColor3f(1.0, 0.0, 0.0);
  432. //glRotatef(rotPlanety3, 0.0, 1.0, 0.0);
  433. //glTranslatef(0.0, 0.0, 40.0); // promien orbity 12
  434. //glutWireSphere(4.0, 20.0, 20.0); // promien planety 4
  435.  
  436. //glPopMatrix();
  437.  
  438. //glPopMatrix();
  439.  
  440.  
  441. rotPlanety1 -= 0.25; // CW
  442. spinPlanety1 += 1.0; // CCW
  443. rotKsiezyca += 0.5; // CCW
  444.  
  445. rotPlanety2 -= 0.15; // CCW
  446. rotPlanety3 -= 0.5; // CW
  447.  
  448.  
  449. glPushMatrix();
  450. glPushMatrix();
  451. glColor3f(0.5, 0.5, 0.5);
  452. glRotatef(90.0, 1, 0, 0);
  453. gluDisk(orb, 30, 30, 100.0, 100);
  454. glPopMatrix();
  455. glTranslatef(0, 0, 0);
  456.  
  457. //podstawa wiezy
  458. glPushMatrix();
  459. glTranslatef(0.0, 5.0, 0.0);
  460. glScalef(4.23, 10.0, 4.23);
  461. glRotatef(45.0, 0.0, 1.0, 0.0);
  462. glColor3f(1.0, 0.0, 0.0);
  463. glutSolidCube(1.0);
  464. glPopMatrix();
  465.  
  466. //szczyt wiezy
  467. glPushMatrix();
  468. glTranslatef(0.0, 11.5, 0.0);
  469. glScalef(8.0, 3.0, 8.0);
  470. glColor3f(0.0, 1.0, 0.0);
  471. glutSolidCube(1.0);
  472. glPopMatrix();
  473.  
  474. //maly szescian 1
  475. glPushMatrix();
  476. glTranslatef(3.0, 14.0, 3.0);
  477. glScalef(2.0, 2.0, 2.0);
  478. glColor3f(0.0, 0.0, 1.0);
  479. glutSolidCube(1.0);
  480. glPopMatrix();
  481.  
  482. //maly szescian 2
  483. glPushMatrix();
  484. glTranslatef(-3.0, 14.0, -3.0);
  485. glScalef(2.0, 2.0, 2.0);
  486. glColor3f(0.0, 0.0, 1.0);
  487. glutSolidCube(1.0);
  488. glPopMatrix();
  489.  
  490. //maly szescian 3
  491. glPushMatrix();
  492. glTranslatef(3.0, 14.0, -3.0);
  493. glScalef(2.0, 2.0, 2.0);
  494. glColor3f(0.0, 0.0, 1.0);
  495. glutSolidCube(1.0);
  496. glPopMatrix();
  497.  
  498. //maly szescian 4
  499. glPushMatrix();
  500. glTranslatef(-3.0, 14.0, 3.0);
  501. glScalef(2.0, 2.0, 2.0);
  502. glColor3f(0.0, 0.0, 1.0);
  503. glutSolidCube(1.0);
  504. glPopMatrix();
  505.  
  506. glPopMatrix();
  507.  
  508. glPopMatrix();
  509. }
  510.  
  511.  
  512. void RysujZadanie4()
  513. {
  514. glBegin(GL_LINES);
  515.  
  516. // Os X
  517. glColor3f(1.0, 0.0, 0.0);
  518. glVertex3f(-140.0, 0.0, 0.0);
  519. glVertex3f(140.0, 0.0, 0.0);
  520.  
  521. // Os Y
  522. glColor3f(0.0, 1.0, 0.0);
  523. glVertex3f(0.0, -120.0, 0.0);
  524. glVertex3f(0.0, 120.0, 0.0);
  525.  
  526. // Os Z
  527. glColor3f(0.0, 0.0, 1.0);
  528. glVertex3f(0.0, 0.0, -120.0);
  529. glVertex3f(0.0, 0.0, 120.0);
  530.  
  531. // Koniec tworzenia ukladu wspolrzednych
  532. glEnd();
  533.  
  534.  
  535.  
  536. rotPlanety1 -= 0.1; // CW
  537.  
  538.  
  539. orb = gluNewQuadric();
  540. // gluQuadricNormals(orb, GLU_SMOOTH);
  541. gluQuadricDrawStyle(orb, GLU_LINE);
  542.  
  543.  
  544. glPushMatrix();
  545.  
  546. glPushMatrix();
  547.  
  548. glRotatef(rotPlanety1, 0.0, 1.0, 0.0); // do wpisania obrotu
  549.  
  550. // trzecie ramie
  551. glPushMatrix();
  552. glRotatef(240, 0.0, 1.0, 0.0);
  553.  
  554. glPushMatrix();
  555.  
  556. glTranslatef(0.0, 15.5, 45.0);
  557. glColor3f(1.0, 0.5, 0.5);
  558. glRotatef(90.0, 0.0, 1.0, 0.0);
  559. glScalef(50, 1, 12);
  560. glutSolidCube(1);
  561.  
  562. glPopMatrix();
  563.  
  564.  
  565.  
  566. glPushMatrix();
  567.  
  568. glTranslatef(0.0, 15.0, 0.0);
  569. glColor3f(1.0, 0.5, 0.5);
  570. // glRotatef(90.0, 1.0, 0.0, 0.0);
  571. glScalef(2, 1, 1);
  572. gluCylinder(orb, 0.5, 0.5, 20, 100, 10);
  573.  
  574. glPopMatrix();
  575.  
  576. glPopMatrix();
  577.  
  578. // drugie ramie
  579. glPushMatrix();
  580. glRotatef(120, 0.0, 1.0, 0.0);
  581.  
  582. glPushMatrix();
  583.  
  584. glTranslatef(0.0, 15.5, 45.0);
  585. glColor3f(1.0, 0.5, 0.5);
  586. glRotatef(90.0, 0.0, 1.0, 0.0);
  587. glScalef(50, 1, 12);
  588. glutSolidCube(1);
  589.  
  590. glPopMatrix();
  591.  
  592.  
  593.  
  594. glPushMatrix();
  595.  
  596. glTranslatef(0.0, 15.0, 0.0);
  597. glColor3f(1.0, 0.5, 0.5);
  598. // glRotatef(90.0, 1.0, 0.0, 0.0);
  599. glScalef(2, 1, 1);
  600. gluCylinder(orb, 0.5, 0.5, 20, 100, 10);
  601.  
  602. glPopMatrix();
  603.  
  604. glPopMatrix();
  605.  
  606.  
  607.  
  608. // pierwsze ramie
  609. glPushMatrix();
  610.  
  611.  
  612. glPushMatrix();
  613.  
  614. glTranslatef(0.0, 15.5, 45.0);
  615. glColor3f(1.0, 0.5, 0.5);
  616. glRotatef(90.0, 0.0, 1.0, 0.0);
  617. glScalef(50, 1, 12);
  618. glutSolidCube(1);
  619.  
  620. glPopMatrix();
  621.  
  622.  
  623.  
  624. glPushMatrix();
  625.  
  626. glTranslatef(0.0, 15.0, 0.0);
  627. glColor3f(1.0, 0.5, 0.5);
  628. // glRotatef(90.0, 1.0, 0.0, 0.0);
  629. glScalef(2, 1, 1);
  630. gluCylinder(orb, 0.5, 0.5, 20, 100, 10);
  631.  
  632. glPopMatrix();
  633.  
  634. glPopMatrix();
  635.  
  636. // dolne wieczko dolnego cylindra
  637. glPushMatrix();
  638.  
  639. glTranslatef(0.0, 10.0, 0.0);
  640. glColor3f(1.0, 0.5, 0.5);
  641. glRotatef(90.0, 1.0, 0.0, 0.0);
  642. gluDisk(orb, 0, 10, 100, 10);
  643.  
  644. glPopMatrix();
  645.  
  646. // dolny cylinder
  647. glPushMatrix();
  648.  
  649. glTranslatef(0.0, 20.0, 0.0);
  650. glColor3f(1.0, 0.5, 0.5);
  651. glRotatef(90.0, 1.0, 0.0, 0.0);
  652. gluCylinder(orb, 10, 10, 10, 100, 10);
  653.  
  654. glPopMatrix();
  655.  
  656. glPopMatrix();
  657.  
  658. glPushMatrix();
  659.  
  660. // dolne wieczko srodkowego stozka
  661. glPushMatrix();
  662.  
  663. glTranslatef(0.0, 20.0, 0.0);
  664. glColor3f(1.0, 0.5, 0.5);
  665. glRotatef(90.0, 1.0, 0.0, 0.0);
  666. gluDisk(orb, 0, 20, 100, 10);
  667.  
  668. glPopMatrix();
  669.  
  670. // gorne wieczko srodkowego cylindra
  671. glPushMatrix();
  672.  
  673. glTranslatef(0.0, 30.0, 0.0);
  674. glColor3f(1.0, 0.5, 0.5);
  675. glRotatef(90.0, 1.0, 0.0, 0.0);
  676. gluDisk(orb, 0, 20, 100, 10);
  677.  
  678. glPopMatrix();
  679.  
  680. // srodkowy cylinder
  681. glPushMatrix();
  682.  
  683. glTranslatef(0.0, 30.0, 0.0);
  684. glColor3f(1.0, 0.5, 0.5);
  685. glRotatef(90.0, 1.0, 0.0, 0.0);
  686. gluCylinder(orb, 20, 20, 10, 100, 10);
  687.  
  688. glPopMatrix();
  689.  
  690. // drazek z gornego stozka
  691. glPushMatrix();
  692.  
  693. glTranslatef(0.0, 40.0, 0.0);
  694. glColor3f(1.0, 0.5, 0.5);
  695. glRotatef(90.0, 1.0, 0.0, 0.0);
  696. gluCylinder(orb, 2, 2, 10, 100, 10);
  697.  
  698. glPopMatrix();
  699.  
  700. //gorne wieczko gornego stozka
  701. glPushMatrix();
  702.  
  703. glTranslatef(0.0, 40.0, 0.0);
  704. glColor3f(1.0, 0.5, 0.5);
  705. glRotatef(90.0, 1.0, 0.0, 0.0);
  706. gluDisk(orb, 0, 5, 100, 10);
  707.  
  708. glPopMatrix();
  709.  
  710. // dolne wieczko gornego stozka
  711. glPushMatrix();
  712.  
  713. glTranslatef(0.0, 50.0, 0.0);
  714. glColor3f(1.0, 0.5, 0.5);
  715. glRotatef(90.0, 1.0, 0.0, 0.0);
  716. gluDisk(orb, 0, 10, 100, 10);
  717.  
  718. glPopMatrix();
  719.  
  720. // gorny stozek
  721. glPushMatrix();
  722.  
  723. glTranslatef(0.0, 50.0, 0.0);
  724. glColor3f(1.0, 0.5, 0.5);
  725. glRotatef(90.0, 1.0, 0.0, 0.0);
  726. gluCylinder(orb, 10, 5, 10, 100, 10);
  727.  
  728. glPopMatrix();
  729.  
  730. glPopMatrix();
  731.  
  732. glPopMatrix();
  733. }
  734.  
  735.  
  736. //////////////////////////////////////////////////////////////////////////////////////////
  737. // Funkcja generujaca pojedyncza klatke animacji
  738. void WyswietlObraz(void)
  739. {
  740. // Wyczyszczenie bufora ramki i bufora glebokosci
  741. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  742.  
  743. // Powielenie macierzy na wierzcholku stosu
  744. glPushMatrix();
  745.  
  746. // Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
  747. // sceny do ukladu wspolrzednych obserwatora).
  748. glTranslatef(0, 0, odlobs);
  749. glRotatef(rotObsX, 1, 0, 0);
  750. glRotatef(rotObsY, 0, 1, 0);
  751. glRotatef(rotObsZ, 0, 0, 1);
  752.  
  753.  
  754. // Generacja obrazu sceny w niewidocznym buforze ramki
  755.  
  756. //RysujRamieRobota(rotPodstawy, rotRamienia1, rotRamienia2, rotGlowicy, rozUchwytow);
  757. //RysujZadanie3();
  758.  
  759. RysujZadanie4();
  760.  
  761. // Usuniecie macierzy lezacej na wierzcholku stosu (powrot do stanu
  762. // sprzed wywolania funkcji)
  763. glPopMatrix();
  764.  
  765. // Przelaczenie buforow ramki
  766. glutSwapBuffers();
  767.  
  768.  
  769.  
  770. glutPostRedisplay();
  771.  
  772.  
  773. }
  774.  
  775. //////////////////////////////////////////////////////////////////////////////////////////
  776. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu
  777. void UstawParametryWidoku(int szerokosc, int wysokosc)
  778. {
  779. // Ustawienie parametrow viewportu
  780. glViewport(0, 0, szerokosc, wysokosc);
  781.  
  782. // Przejscie w tryb modyfikacji macierzy rzutowania
  783. glMatrixMode(GL_PROJECTION);
  784. glLoadIdentity();
  785. gluPerspective(40.0, (float)szerokosc / (float)wysokosc, 1.0, 1000.0);
  786.  
  787. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  788. glMatrixMode(GL_MODELVIEW);
  789.  
  790. // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa
  791. glLoadIdentity();
  792. }
  793.  
  794. //////////////////////////////////////////////////////////////////////////////////////////
  795. // Funkcja klawiszy specjalnych
  796. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  797. {
  798. switch (klawisz)
  799. {
  800.  
  801. case GLUT_KEY_UP:
  802. rotObsX++;
  803. break;
  804.  
  805. case GLUT_KEY_DOWN:
  806. rotObsX--;
  807. break;
  808.  
  809. case GLUT_KEY_LEFT:
  810. rotObsY--;
  811. break;
  812.  
  813. case GLUT_KEY_RIGHT:
  814. rotObsY++;
  815. break;
  816.  
  817.  
  818. // oblsuga klawiatury osi Z
  819. case GLUT_KEY_PAGE_DOWN:
  820. rotObsZ--;
  821. break;
  822.  
  823. case GLUT_KEY_PAGE_UP:
  824. rotObsZ++;
  825. break;
  826. }
  827. }
  828. //////////////////////////////////////////////////////////////////////////////////////////
  829. // Funkcja obslugi klawiatury
  830. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  831. {
  832.  
  833. switch (klawisz)
  834. {
  835. case '2':
  836. rotRamienia1 = (rotRamienia1 < 90.0) ? rotRamienia1 + 1.0 : rotRamienia1;
  837. break;
  838.  
  839. case '@':
  840. rotRamienia1 = (rotRamienia1 > 0.0) ? rotRamienia1 - 1.0 : rotRamienia1;
  841. break;
  842.  
  843. case '3':
  844. rotRamienia2 = (rotRamienia2 < 0.0) ? rotRamienia2 + 1.0 : rotRamienia2;
  845. break;
  846.  
  847. case '#':
  848. rotRamienia2 = (rotRamienia2 > -90.0) ? rotRamienia2 - 1.0 : rotRamienia2;
  849. break;
  850.  
  851. case '4':
  852. rotGlowicy = (rotGlowicy < 360.0) ? rotGlowicy + 1.0 : rotGlowicy;
  853. break;
  854.  
  855. case '$':
  856. rotGlowicy = (rotGlowicy > 0.0) ? rotGlowicy - 1.0 : rotGlowicy;
  857. break;
  858.  
  859. case '5':
  860. rozUchwytow = (rozUchwytow < 1.5) ? rozUchwytow + 0.1 : rozUchwytow;
  861. break;
  862.  
  863. case '%':
  864. rozUchwytow = (rozUchwytow > 0.5) ? rozUchwytow - 0.1 : rozUchwytow;
  865. break;
  866.  
  867.  
  868. // obsluga klawiatury odleglosci uzytkownika od obiektow
  869. case '+':
  870. odlobs = (odlobs < odlmin) ? odlobs + 1.0 : odlobs;
  871. break;
  872.  
  873. case '-':
  874. odlobs = (odlobs > odlmax) ? odlobs - 1.0 : odlobs;
  875. break;
  876.  
  877.  
  878. // rakieta
  879. case 'z':
  880. if (rotRakiety < 90) rotRakiety++;
  881. break;
  882.  
  883. case 'x':
  884. if (rotRakiety > -90) rotRakiety--;
  885. break;
  886.  
  887. case ',':
  888. if (rotRakiety2 < 5) rotRakiety2++;
  889. break;
  890.  
  891. case '.':
  892. if (rotRakiety2 > 0) rotRakiety2--;
  893. break;
  894.  
  895. }
  896.  
  897. if (klawisz == 27)
  898. exit(0);
  899. }
  900.  
  901. //////////////////////////////////////////////////////////////////////////////////////////
  902. // Glowna funkcja programu
  903. int main(int argc, char** argv)
  904. {
  905. // Zainicjowanie biblioteki GLUT
  906. glutInit(&argc, argv);
  907.  
  908. // Ustawienie trybu wyswietlania
  909. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  910.  
  911. // Ustawienie polozenia dolenego lewego rogu okna
  912. glutInitWindowPosition(100, 100);
  913.  
  914. // Ustawienie rozmiarow okna
  915. glutInitWindowSize(400, 400);
  916.  
  917. // Utworzenie okna
  918. glutCreateWindow("Robot");
  919.  
  920. // Odblokowanie bufora glebokosci
  921. glEnable(GL_DEPTH_TEST);
  922.  
  923. // Ustawienie funkcji wykonywanej na danych w buforze glebokosci
  924. glDepthFunc(GL_LEQUAL);
  925.  
  926. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  927. glClearDepth(1000.0);
  928.  
  929. // Ustawienie koloru czyszczenia bufora ramki
  930. glClearColor(0.3, 0.3, 0.3, 0.0);
  931.  
  932. // Zarejestrowanie funkcji (callback) wyswietlajacej
  933. glutDisplayFunc(WyswietlObraz);
  934.  
  935. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  936. // zmieniane sa rozmiary okna
  937. glutReshapeFunc(UstawParametryWidoku);
  938.  
  939. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  940. // zadnych zadan
  941. glutIdleFunc(WyswietlObraz);
  942.  
  943. // Zarejestrowanie funkcji obslugi klawiatury
  944. glutKeyboardFunc(ObslugaKlawiatury);
  945.  
  946. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  947. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  948.  
  949.  
  950. // Zainicjowanie kwadryk tworzacych ramie robota
  951. InicjujRamieRobota();
  952.  
  953. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  954. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  955. glutMainLoop();
  956.  
  957. return 0;
  958. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement