Advertisement
Guest User

Untitled

a guest
Jun 2nd, 2015
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.50 KB | None | 0 0
  1. //Jeff Chastine
  2. #define _USE_MATH_DEFINES
  3. #include <cmath>
  4. #include <Windows.h>
  5. #include <GL\glew.h>
  6. #include <GL\freeglut.h>
  7. #include <iostream>
  8. #include <stdlib.h>
  9.  
  10. // stała do obsługi menu podręcznego
  11.  
  12. enum
  13.  
  14. {
  15.  
  16. EXIT // wyjście
  17.  
  18. };
  19.  
  20. double PredkoscKamery = 0;
  21.  
  22. // pionowy kąt pola widzenia
  23.  
  24. GLdouble fovy = 60;
  25.  
  26. float czajnikrot = 0;
  27.  
  28. // wpółrzędne położenia obserwatora
  29.  
  30. GLdouble eyex = 0;
  31.  
  32. GLdouble eyey = 0;
  33.  
  34. GLdouble eyez = 3;
  35.  
  36. GLdouble ObrotX = 3.14 / 2.0;
  37.  
  38. GLdouble ObrotY = 0;
  39.  
  40. bool KeyUP = false;
  41.  
  42. bool KeyDOWN = false;
  43.  
  44. bool KeyRIGHT = false;
  45.  
  46. bool KeyLEFT = false;
  47.  
  48. // współrzędne punktu w którego kierunku jest zwrócony obserwator,
  49.  
  50. GLdouble centerx = 0;
  51.  
  52. GLdouble centery = 0;
  53.  
  54. GLdouble centerz = -100;
  55.  
  56. int figure = 0;
  57.  
  58. float kat = 0;
  59.  
  60. GLuint idlisty;
  61.  
  62. // funkcja generująca scenę 3D
  63.  
  64. void rysujGwint()
  65. {
  66. glColor3f(0, 0, 0);
  67.  
  68. glBegin(GL_LINE_STRIP);
  69.  
  70. float r = 4, x, y, kat = 0, z = 0;
  71. for (int j = 0; j < 100; j++)
  72. for (int i = 0; i < 200; i++, kat += M_PI / 100)
  73. {
  74. z += 0.005;
  75. x = r*cos(kat);
  76. y = r*sin(kat);
  77. glVertex3f(x, z, y);
  78. }
  79. glEnd();
  80. }
  81.  
  82. void rysujGoreNakretke()
  83. {
  84. glBegin(GL_TRIANGLE_FAN);
  85.  
  86. float r = 10, x, y, kat = 0;
  87. for (int i = 0; i < 8; i++, kat += M_PI/4)
  88. {
  89. x = r*cos(kat);
  90. y = r*sin(kat);
  91. glVertex3f(x, 0, y);
  92. }
  93. glEnd();
  94. }
  95.  
  96. void rysujSciankeNakretke()
  97. {
  98. glBegin(GL_TRIANGLE_STRIP);
  99.  
  100. float r = 10, x, y, kat = 0;
  101. for (int i = 0; i < 8; i++, kat += M_PI / 4)
  102. {
  103. x = r*cos(kat);
  104. y = r*sin(kat);
  105. glVertex3f(x, 0, y);
  106. glVertex3f(x, 3, y);
  107. }
  108. glEnd();
  109. }
  110.  
  111. void rysujNakretke()
  112. {
  113.  
  114. glColor3f(0, 0, 0);
  115.  
  116. rysujGoreNakretke();
  117.  
  118. rysujSciankeNakretke();
  119.  
  120. glTranslatef(0, 3, 0);
  121.  
  122. rysujGoreNakretke();
  123.  
  124. }
  125.  
  126. void rysujTube()
  127. {
  128. glBegin(GL_TRIANGLE_STRIP);
  129.  
  130. glColor3f(1, 0, 0);
  131. float r = 3.5, x, y, kat = 0;
  132. for (int i = 0; i < 200; i++, kat += M_PI / 100)
  133. {
  134. x = r*cos(kat);
  135. y = r*sin(kat);
  136. glVertex3f(x, 0, y);
  137. glVertex3f(x, 100, y);
  138. }
  139. glEnd();
  140. }
  141.  
  142. void GenerujListyWyswietlania()
  143.  
  144. {
  145.  
  146. idlisty = glGenLists(4);
  147.  
  148. // utworzenie pierwszej listy
  149.  
  150. glNewList(idlisty + 0, GL_COMPILE);
  151.  
  152. glTranslatef(0, 0, 10);
  153.  
  154. glutWireCube(1);
  155.  
  156. glEndList();
  157.  
  158. // utworzenie drugiej listy
  159.  
  160. glNewList(idlisty + 1, GL_COMPILE);
  161.  
  162. glTranslatef(0, 0, 8);
  163.  
  164. glutWireTeapot(1);
  165.  
  166. glTranslatef(0, 0, 10);
  167.  
  168. glutWireTeapot(1);
  169.  
  170. glTranslatef(0, 0, 10);
  171.  
  172. glutWireTeapot(1);
  173.  
  174. glEndList();
  175.  
  176. // utworzenie trzeciej listy
  177.  
  178. glNewList(idlisty + 2, GL_COMPILE);
  179.  
  180. //glTranslatef(0, 0, 10);
  181.  
  182. //glutWireCone(1, 1, 10, 10);
  183.  
  184. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  185.  
  186. glTranslatef(0, 0, 70);
  187.  
  188. glTranslatef(0, -50, 0);
  189.  
  190. rysujGwint();
  191. rysujTube();
  192.  
  193. glTranslatef(0, 20, 0);
  194.  
  195. rysujNakretke();
  196.  
  197. glTranslatef(0, 40, 0);
  198.  
  199. rysujNakretke();
  200.  
  201. glEndList();
  202.  
  203. }
  204.  
  205. void UstawKamere(){
  206.  
  207. double cosx, siny, sinx;
  208.  
  209. double CelX, CelY, CelZ;
  210.  
  211. // wartości funkcji trygonometrycznych
  212.  
  213. // obliczamy tylko raz dla oszczędności
  214.  
  215. if (KeyDOWN) PredkoscKamery = -0.01;
  216.  
  217. if (KeyUP) PredkoscKamery = 0.01;
  218.  
  219. if (KeyLEFT) ObrotX -= 0.01;
  220.  
  221. if (KeyRIGHT) ObrotX += 0.01;
  222.  
  223. siny = sin(ObrotY);
  224.  
  225. cosx = cos(ObrotX);
  226.  
  227. sinx = sin(ObrotX);
  228.  
  229. // nowa pozycja kamery
  230.  
  231. eyex += cosx*PredkoscKamery;
  232.  
  233. eyey += siny*PredkoscKamery;
  234.  
  235. eyez += sinx*PredkoscKamery;
  236.  
  237. // punkt wycelowania kamery powinien
  238.  
  239. // znajdować się gdzieś "przed jej nosem"
  240.  
  241. CelX = eyex + cosx;
  242.  
  243. CelY = eyey + siny;
  244.  
  245. CelZ = eyez + sinx;
  246.  
  247. gluLookAt(eyex, eyey, eyez, CelX, CelY, CelZ, 0, 1, 0);
  248.  
  249. //gluLookAt( eyex, eyey, eyez, centerx, centery, centerz, 0, 1, 0 );
  250.  
  251. PredkoscKamery = 0;
  252.  
  253. }
  254.  
  255. void Display()
  256.  
  257. {
  258.  
  259. // kolor tła - zawartość bufora koloru
  260.  
  261. glClearColor(1.0, 1.0, 1.0, 1.0);
  262.  
  263. // czyszczenie bufora koloru
  264.  
  265. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  266.  
  267. glEnable(GL_DEPTH_TEST);
  268. // wybór macierzy modelowania
  269.  
  270. glMatrixMode(GL_MODELVIEW);
  271.  
  272. // macierz modelowania = macierz jednostkowa
  273.  
  274. glLoadIdentity();
  275.  
  276. UstawKamere();
  277.  
  278. // ustawienie obserwatora
  279.  
  280. //glRotatef(kat,1,0,0);
  281.  
  282. // przesunięcie obiektu o wektor [0,0,-3]
  283.  
  284. //glTranslatef( 0, 0, 2.0 );
  285.  
  286. // kolor krawędzi sześcianu
  287.  
  288. glColor3f(0.0, 0.0, 0.0);
  289.  
  290. // glutWireCube(1);
  291.  
  292. switch (figure)
  293.  
  294. {
  295.  
  296. case 1:
  297.  
  298. glCallList(idlisty + 0);
  299.  
  300. break;
  301.  
  302. case 2:
  303.  
  304. glCallList(idlisty + 1);
  305.  
  306. break;
  307.  
  308. case 3:
  309.  
  310. glCallList(idlisty + 2);
  311.  
  312. break;
  313.  
  314. }
  315.  
  316. // skierowanie poleceń do wykonania
  317.  
  318. glFlush();
  319.  
  320. // zamiana buforów koloru
  321.  
  322. glutSwapBuffers();
  323.  
  324. }
  325.  
  326. // zmiana wielkości okna
  327.  
  328. void Reshape(int width, int height)
  329.  
  330. {
  331.  
  332. // obszar renderingu - całe okno
  333.  
  334. glViewport(0, 0, width, height);
  335.  
  336. // wybór macierzy rzutowania
  337.  
  338. glMatrixMode(GL_PROJECTION);
  339.  
  340. // macierz rzutowania = macierz jednostkowa
  341.  
  342. glLoadIdentity();
  343.  
  344. // obliczenie aspektu obrazu z uwzględnieniem
  345.  
  346. // przypadku, gdy wysokość obrazu wynosi 0
  347.  
  348. GLdouble aspect = 1;
  349.  
  350. if (height > 0)
  351.  
  352. aspect = width / (GLdouble)height;
  353.  
  354. // rzutowanie perspektywiczne
  355.  
  356. gluPerspective(fovy, aspect, 0.01, 100.0);
  357.  
  358. // generowanie sceny 3D
  359.  
  360. Display();
  361.  
  362. }
  363.  
  364. // obsługa klawiatury
  365.  
  366. void Klawisze(unsigned char key, int x, int y)
  367.  
  368. {
  369.  
  370. // klawisz +
  371.  
  372. if (key == '+' && fovy < 180)
  373.  
  374. fovy++;
  375.  
  376. // klawisz -
  377.  
  378. if (key == '-' && fovy > 0)
  379.  
  380. fovy--;
  381.  
  382. if (key == 'a' && fovy > 0)
  383.  
  384. kat++;
  385.  
  386. if (key == 'w')
  387.  
  388. PredkoscKamery = 0.02;
  389.  
  390. if (key == 's')
  391.  
  392. PredkoscKamery = -0.02;
  393.  
  394. if (key == 'e')
  395.  
  396. ObrotX += 0.02;
  397.  
  398. if (key == 'q')
  399.  
  400. ObrotX -= 0.02;
  401.  
  402. if (key == 'r')
  403.  
  404. ObrotY += 0.02;
  405.  
  406. if (key == 'f')
  407.  
  408. ObrotY -= 0.02;
  409.  
  410. // odrysowanie okna
  411.  
  412. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  413.  
  414. }
  415.  
  416. void KlawiszeSpecjalne(int key, int x, int y)
  417.  
  418. {
  419.  
  420. switch (key)
  421.  
  422. {
  423.  
  424. // kursor w lewo
  425.  
  426. case GLUT_KEY_LEFT:
  427.  
  428. eyex += 0.1;
  429.  
  430. break;
  431.  
  432. // kursor w górę
  433.  
  434. case GLUT_KEY_UP:
  435.  
  436. eyey -= 0.1;
  437.  
  438. break;
  439.  
  440. // kursor w prawo
  441.  
  442. case GLUT_KEY_RIGHT:
  443.  
  444. eyex -= 0.1;
  445.  
  446. break;
  447.  
  448. // kursor w dół
  449.  
  450. case GLUT_KEY_DOWN:
  451.  
  452. eyey += 0.1;
  453.  
  454. break;
  455.  
  456. }
  457.  
  458. // odrysowanie okna
  459.  
  460. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  461.  
  462. }
  463.  
  464. // obsługa menu podręcznego
  465.  
  466. void Menu(int value)
  467.  
  468. {
  469.  
  470. switch (value)
  471.  
  472. {
  473.  
  474. // wyjście
  475.  
  476. case EXIT:
  477.  
  478. exit(0);
  479.  
  480. // wyjście
  481.  
  482. case 1:
  483.  
  484. figure = 1;
  485.  
  486. break;
  487.  
  488. case 2:
  489.  
  490. figure = 2;
  491.  
  492. break;
  493.  
  494. case 3:
  495.  
  496. figure = 3;
  497.  
  498. break;
  499.  
  500. }
  501.  
  502. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  503.  
  504. }
  505.  
  506. void KeyDown(int key, int x, int y){
  507.  
  508. switch (key){
  509.  
  510. case GLUT_KEY_UP:
  511.  
  512. KeyUP = true;
  513.  
  514. break;
  515.  
  516. case GLUT_KEY_DOWN:
  517.  
  518. KeyDOWN = true;
  519.  
  520. break;
  521.  
  522. case GLUT_KEY_LEFT:
  523.  
  524. KeyLEFT = true;
  525.  
  526. break;
  527.  
  528. case GLUT_KEY_RIGHT:
  529.  
  530. KeyRIGHT = true;
  531.  
  532. break;
  533.  
  534. }
  535.  
  536. }
  537.  
  538. void KeyUp(int key, int x, int y){
  539.  
  540. switch (key){
  541.  
  542. case GLUT_KEY_UP:
  543.  
  544. KeyUP = false;
  545.  
  546. break;
  547.  
  548. case GLUT_KEY_DOWN:
  549.  
  550. KeyDOWN = false;
  551.  
  552. break;
  553.  
  554. case GLUT_KEY_LEFT:
  555.  
  556. KeyLEFT = false;
  557.  
  558. break;
  559.  
  560. case GLUT_KEY_RIGHT:
  561.  
  562. KeyRIGHT = false;
  563.  
  564. break;
  565.  
  566. }
  567.  
  568. }
  569.  
  570. int main(int argc, char * argv[])
  571.  
  572. {
  573.  
  574. // inicjalizacja biblioteki GLUT
  575.  
  576. glutInit(&argc, argv);
  577.  
  578. // inicjalizacja bufora ramki
  579.  
  580. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  581.  
  582. // rozmiary głównego okna programu
  583.  
  584. glutInitWindowSize(400, 400);
  585.  
  586. // utworzenie głównego okna programu
  587.  
  588. #ifdef WIN32
  589.  
  590. glutCreateWindow("Sześcian 3");
  591.  
  592. #else
  593.  
  594. glutCreateWindow("Szescian 3");
  595.  
  596. #endif
  597.  
  598. // dołączenie funkcji generującej scenę 3D
  599.  
  600. glutDisplayFunc(Display);
  601.  
  602. // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
  603.  
  604. glutReshapeFunc(Reshape);
  605.  
  606. // dołączenie funkcji obsługi klawiatury
  607.  
  608. glutKeyboardFunc(Klawisze);
  609.  
  610. // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
  611.  
  612. // glutSpecialFunc( KlawiszeSpecjalne );
  613.  
  614. glutSpecialFunc(KeyDown);
  615.  
  616. glutSpecialUpFunc(KeyUp);
  617.  
  618. // utworzenie menu podręcznego
  619.  
  620. glutCreateMenu(Menu);
  621.  
  622. // dodanie pozycji do menu podręcznego
  623.  
  624. glutAddMenuEntry("Wyjście", EXIT);
  625.  
  626. glutAddMenuEntry("Rys1", 1);
  627.  
  628. glutAddMenuEntry("Rys2", 2);
  629.  
  630. glutAddMenuEntry("Rys3", 3);
  631.  
  632. // określenie przycisku myszki obsługującej menu podręczne
  633.  
  634. glutAttachMenu(GLUT_RIGHT_BUTTON);
  635.  
  636. GenerujListyWyswietlania();
  637.  
  638. glutIdleFunc(Display);
  639.  
  640. // wprowadzenie programu do obsługi pętli komunikatów
  641.  
  642. glutMainLoop();
  643.  
  644. return 0;
  645.  
  646. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement