Advertisement
Guest User

1swiatlo

a guest
Nov 20th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.95 KB | None | 0 0
  1. #include <windows.h>
  2. #include <gl/gl.h>
  3. #include <gl/glut.h>
  4. #include <math.h>
  5. #include <cmath>
  6. #include <time.h>
  7. #include <vector>
  8.  
  9. using namespace std;
  10.  
  11. typedef float point3[3];
  12. const int N = 100;
  13. //static int model = 2;
  14. static GLfloat angle[] = { 0.0, 0.0, 0.0 };
  15. static float colors_tab[N][N][3];
  16. static GLfloat viewer[] = { 0.0, 0.0, 0.0 };
  17. // inicjalizacja po?o?enia obserwatora
  18. static GLfloat theta = 0.0; // kąt obrotu obiektu
  19. static GLfloat theta2 = 0.0; // kat obrotu obiektu
  20. static GLfloat pix2angle; // przelicznik pikseli na stopnie
  21. static GLfloat pix2angle_x; // przelicznik pikseli na stopnie
  22. static GLfloat pix2angle_y; // przelicznik pikseli na stopnie
  23.  
  24. static GLint status = 0; // stan klawiszy myszy
  25. // 0 - nie nacisnieto zadnego klawisza
  26. // 1 - nacisniety zostal lewy klawisz
  27. // 2 - nacisniety prawy klawisz
  28.  
  29. static int x_pos_old = 0; // poprzednia pozycja kursora myszy
  30. static int y_pos_old = 0;
  31. static int z_pos_old = 0;
  32.  
  33. static int delta_x = 0; // ró?nica pomi?dzy pozycj? bie??c? i poprzedni? kursora myszy
  34. static int delta_y = 0;
  35. static int delta_z = 0;
  36.  
  37. double R = 13;
  38. float fi = 0.0;
  39. #define M_PI 3.14159265358979323846
  40. //funkcja obracaj¹ca model, pobrana ze strony zsk
  41. void spinEgg()
  42. {
  43.  
  44. angle[0] -= 0.5;
  45. if (angle[0] > 360.0) angle[0] -= 360.0;
  46.  
  47. angle[1] -= 0.5;
  48. if (angle[1] > 360.0) angle[1] -= 360.0;
  49.  
  50. angle[2] -= 0.5;
  51. if (angle[2] > 360.0) angle[2] -= 360.0;
  52.  
  53. glutPostRedisplay(); //odswiezenie zawartosci aktualnego okna
  54. }
  55.  
  56. // Funkcja rysujaca osie ukladu wspólrzednych
  57. void Axes(void)
  58. {
  59.  
  60. point3 x_min = { -50.0, 0.0, 0.0 };
  61. point3 x_max = { 50.0, 0.0, 0.0 };
  62. // poczatek i koniec obrazu osi x
  63.  
  64. point3 y_min = { 0.0, -100.0, 0.0 };
  65. point3 y_max = { 0.0, 50.0, 0.0 };
  66. // poczatek i koniec obrazu osi y
  67.  
  68. point3 z_min = { 0.0, 0.0, -50.0 };
  69. point3 z_max = { 0.0, 0.0, 50.0 };
  70. // poczatek i koniec obrazu osi z
  71.  
  72. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  73. glBegin(GL_LINES); // rysowanie osi x
  74.  
  75. glVertex3fv(x_min);
  76. glVertex3fv(x_max);
  77.  
  78. glEnd();
  79.  
  80. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  81. glBegin(GL_LINES); // rysowanie osi y
  82.  
  83. glVertex3fv(y_min);
  84. glVertex3fv(y_max);
  85.  
  86. glEnd();
  87.  
  88. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  89. glBegin(GL_LINES); // rysowanie osi z
  90.  
  91. glVertex3fv(z_min);
  92. glVertex3fv(z_max);
  93.  
  94. glEnd();
  95.  
  96. }
  97. void Mouse(int btn, int state, int x, int y)
  98. {
  99.  
  100.  
  101. if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  102. {
  103. x_pos_old = x; // przypisanie aktualnie odczytanej pozycji kursora jako pozycji poprzedniej
  104. y_pos_old = y;
  105. status = 1; // wci?ni?ty zosta? lewy klawisz myszy
  106. }
  107.  
  108. else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  109. {
  110.  
  111. z_pos_old = y;
  112. status = 2;
  113. }
  114.  
  115. else
  116.  
  117. status = 0; // nie zosta? wci?ni?ty ?aden klawisz
  118. }
  119.  
  120. /*************************************************************************************/
  121.  
  122. // Funkcja "monitoruje" po?o?enie kursora myszy i ustawia warto?ci odpowiednich
  123. // zmiennych globalnych
  124.  
  125. void Motion(GLsizei x, GLsizei y)
  126. {
  127. delta_x = x - x_pos_old;//Obliczenie różnocy położenia kursora myszy
  128. delta_y = y - y_pos_old;//Obliczenie różnocy położenia kursora myszy
  129.  
  130. if (status == 1) //Jeśli lewy klawisz wciśnięty
  131. {
  132. theta += delta_x * pix2angle_x; //modyfikacja kąta obrotu
  133. fi += delta_y * pix2angle_y; //do róznicy połozenia kursora myszy
  134. if (theta >= 360.0) //Jeśli kąt >= 360 stopni
  135. theta = 0.0; // to kąt = 0
  136. if (fi >= 360.0)
  137. fi = 0.0;
  138. }
  139. else if (status == 2) { //Jeśli lewy klawisz wciśnięty
  140. R += 0.01* delta_y; //Przyblizanie się obserwatora do obiektu
  141. if (R <= 8.0) //ustalone maksymalne przyblizenia i oddalenia
  142. R = 8.0; //aby nie wejść w środek jajka
  143. if (R >= 13.0)
  144. R = 13.0;
  145. }
  146. x_pos_old = x; //Ustawienie aktualnego położenia jako poprzednie
  147. y_pos_old = y;
  148. z_pos_old = y;
  149. glutPostRedisplay(); // przerysowanie obrazu sceny
  150. }
  151.  
  152. /*************************************************************************************/
  153.  
  154.  
  155.  
  156. void Egg() {
  157. float tab[100][100][3];
  158. float u = 0.0;
  159. float v = 0.0;
  160. point3 **vectors3d = new point3*[N];
  161. point3 **vectorNorm = new point3*[N];
  162. for (int i = 0; i < N; i++) {
  163. vectors3d[i] = new point3[N];
  164. vectorNorm[i] = new point3[N];
  165. }
  166. //zamiana dziedziny parametrycznej na postaæ 3-D wed³ug okreœlonego wzoru
  167. for (int i = 0; i < N; i++) {
  168. for (int j = 0; j < N; j++)
  169. {
  170. u = (float)i / (N - 1);
  171. v = (float)j / (N - 1);
  172.  
  173. tab[i][j][0] = (-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 * pow(u, 2) - 45 * u)*cos(M_PI * v); // X(u,v)
  174. tab[i][j][1] = 160 * pow(u, 4) - 320 * pow(u, 3) + 160 * pow(u, 2) - 5; //Y(u,v)
  175. tab[i][j][2] = (-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 * pow(u, 2) - 45 * u)*sin(M_PI * v); //Z(u,v)
  176.  
  177.  
  178. float ux, uz, uy, vz, vy, vx, length;
  179.  
  180. // obliczenie wartosci wektorow normalnych z instrukcji
  181. ux = (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * pow(u, 2) + 360 * u - 45)*cos(3.14*v);
  182. uy = (640 * pow(u, 3) - 960 * pow(u, 2) + 320 * u);
  183. uz = (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * pow(u, 2) + 360 * u - 45)*sin(3.14*v);
  184.  
  185. vx = 3.14*(90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * pow(u, 2) + 45 * u)*sin(3.14*v);
  186. vy = 0;
  187. vz = -3.14*(90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * pow(u, 2) + 45 * u)*cos(3.14*v);
  188.  
  189. vectorNorm[i][j][0] = uy * vz - uz * vy; //opisanie wektorow normalnych wedlug instrukcji
  190. vectorNorm[i][j][1] = uz * vx - ux * vz;
  191. vectorNorm[i][j][2] = ux * vy - uy * vx;
  192.  
  193. length = sqrt(vectorNorm[i][j][0] * vectorNorm[i][j][0] + vectorNorm[i][j][1] * vectorNorm[i][j][1] + vectorNorm[i][j][2] * vectorNorm[i][j][2]);
  194.  
  195. if (i < N / 2) //jesli jestesmt w pierwszej polowie jajka
  196. {
  197. vectorNorm[i][j][0] = (uy*vz - uz * vy) / length;
  198. vectorNorm[i][j][1] = (uz*vx - ux * vz) / length;
  199. vectorNorm[i][j][2] = (ux*vy - uy * vx) / length;
  200. }
  201. else if (i > N / 2) //jesli jestesmy w drugiej polowie jajka
  202. {
  203. vectorNorm[i][j][0] = -1 * (uy*vz - uz * vy) / length;
  204. vectorNorm[i][j][1] = -1 * (uz*vx - ux * vz) / length;
  205. vectorNorm[i][j][2] = -1 * (ux*vy - uy * vx) / length;
  206. }
  207. else if (i == 0 || i == N)
  208. {
  209. vectorNorm[i][j][0] = 0;
  210. vectorNorm[i][j][1] = -1;
  211. vectorNorm[i][j][2] = 0;
  212. }
  213. else
  214. {
  215. vectorNorm[i][j][0] = 0;
  216. vectorNorm[i][j][1] = 1;
  217. vectorNorm[i][j][2] = 0;
  218. }
  219.  
  220. }
  221. }
  222. int i = 0;
  223. for ( i = 0; i < N-1 ;)
  224. {
  225. for (int j = 0; j < N-1 ; j++)
  226. {
  227. glBegin(GL_TRIANGLES);
  228.  
  229. glNormal3fv(vectorNorm[i][j + 1]);
  230. glVertex3fv(tab[i][j + 1]);
  231.  
  232. glNormal3fv(vectorNorm[i + 1][j]);
  233. glVertex3fv(tab[i + 1][j]);
  234.  
  235. glNormal3fv(vectorNorm[i + 1][j + 1]);
  236. glVertex3fv(tab[i + 1][j + 1]);
  237.  
  238.  
  239.  
  240. glNormal3fv(vectorNorm[i + 1][j]);
  241. glVertex3fv(tab[i + 1][j]);
  242.  
  243.  
  244. glNormal3fv(vectorNorm[i][j + 1]);
  245. glVertex3fv(tab[i][j + 1]);
  246.  
  247.  
  248. glNormal3fv(vectorNorm[i][j]);
  249. glVertex3fv(tab[i][j]);
  250.  
  251. glEnd();
  252.  
  253. }
  254. i++;
  255.  
  256. }
  257.  
  258. }
  259. void RenderScene(void)
  260. {
  261. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  262. // Czyszczenie okna aktualnym kolorem czyszczacym
  263.  
  264. glLoadIdentity();
  265. // Czyszczenie macierzy biezacej
  266.  
  267.  
  268. // Narysowanie osi przy pomocy funkcji zdefiniowanej wyzej
  269.  
  270. viewer[0] = R * cos(theta) * cos(fi);
  271. viewer[1] = R * sin(fi);
  272. viewer[2] = R * sin(theta) * cos(fi);
  273.  
  274. gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, cos(fi), 0.0);
  275. //cout << R << endl;
  276.  
  277. // do ró?nicy po?o?e? kursora myszy
  278.  
  279. glRotatef(theta, 0.0, 1.0, 0.0); //obrót obiektu o nowy k?t
  280. glRotatef(theta2, 1.0, 0.0, 0.0);
  281.  
  282. //Axes();
  283. glColor3f(1.0f, 1.0f, 1.0f);
  284. // Ustawienie koloru rysowania na bia?y
  285. glRotatef(angle[0], 1.0, 0.0, 0.0);
  286.  
  287. glRotatef(angle[1], 0.0, 1.0, 0.0);
  288.  
  289. glRotatef(angle[2], 0.0, 0.0, 1.0);
  290.  
  291. glRotated(45.0, 1.0, 0.0, 0.0);
  292.  
  293. Egg();
  294.  
  295. glFlush();
  296. // Przekazanie polecen rysujacych do wykonania
  297. glutSwapBuffers();
  298.  
  299. }
  300. // Funkcja ustalajaca stan renderowania
  301. void MyInit(void)
  302. {
  303. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  304.  
  305. GLfloat mat_ambient[] = { 1.0,1.0, 1.0, 1 };
  306. GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1 };
  307. GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  308. GLfloat mat_shininess = { 100.0 };
  309. GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 };
  310. GLfloat light_ambient[] = {0.1, 0.1, 0.1, 1.0 };
  311. GLfloat light_diffuse[] = { 1.0, 1.0, 0.0, 1.0 };
  312. GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  313. GLfloat att_constant = { 1.0 };
  314. GLfloat att_linear = { (GLfloat) 0.05 };
  315. GLfloat att_quadratic = { (GLfloat) 0.001 };
  316.  
  317. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  318. glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  319. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  320. glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
  321.  
  322. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  323. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  324. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  325. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  326.  
  327. glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
  328. glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att_linear);
  329. glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att_quadratic);
  330.  
  331. glShadeModel(GL_SMOOTH); // właczenie łagodnego cieniowania
  332. glEnable(GL_LIGHTING); // właczenie systemu oświetlenia sceny
  333. glEnable(GL_LIGHT0); // włączenie źródła o numerze 0
  334. glEnable(GL_DEPTH_TEST); // włączenie mechanizmu z-bufora
  335. }
  336.  
  337. // Funkcja ma za zadanie utrzymanie stalych proporcji rysowanych
  338. // w przypadku zmiany rozmiarów okna.
  339. // Parametry vertical i horizontal (wysokosc i szerokosc okna) sa
  340. // przekazywane do funkcji za kazdym razem gdy zmieni sie rozmiar okna.
  341. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  342. {
  343. //pix2angle = 360.0 / (float)horizontal; // przeliczenie pikseli na stopnie
  344. pix2angle_x = 360.0*0.1 / (float)horizontal; // przeliczenie pikseli na stopnie
  345. pix2angle_y = 360.0*0.1 / (float)vertical;
  346. GLfloat AspectRatio;
  347. // Deklaracja zmiennej AspectRatio okreslajacej proporcje
  348. // wymiarów okna
  349.  
  350. if (vertical == 0) // Zabezpieczenie przed dzieleniem przez 0
  351.  
  352. vertical = 1;
  353.  
  354. glViewport(0, 0, horizontal, vertical);
  355. // Ustawienie wielkosciokna okna widoku (viewport)
  356. // W tym przypadku od (0,0) do (horizontal, vertical)
  357.  
  358. glMatrixMode(GL_PROJECTION);
  359. // Przelaczenie macierzy biezacej na macierz projekcji
  360.  
  361. glLoadIdentity();
  362. // Czyszcznie macierzy biezacej
  363.  
  364. AspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  365. // Wyznaczenie wspólczynnika proporcji okna
  366. // Gdy okno nie jest kwadratem wymagane jest okreslenie tak zwanej
  367. // przestrzeni ograniczajacej pozwalajacej zachowac wlasciwe
  368. // proporcje rysowanego obiektu.
  369. // Do okreslenia przestrzeni ograniczjacej sluzy funkcja
  370. // glOrtho(...)
  371.  
  372. gluPerspective(70, 1.0, 1.0, 30.0);
  373. // Ustawienie parametrów dla rzutu perspektywicznego
  374. glMatrixMode(GL_MODELVIEW);
  375. // Przelaczenie macierzy biezacej na macierz widoku modelu
  376.  
  377. glLoadIdentity();
  378. // Czyszcenie macierzy biezacej
  379.  
  380. }
  381. void main(void)
  382. {
  383. //glutIdleFunc(spinEgg);
  384.  
  385. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  386.  
  387. glutInitWindowSize(700, 700);
  388.  
  389. glutCreateWindow("JAJO");
  390.  
  391. glutDisplayFunc(RenderScene);
  392.  
  393. glutReshapeFunc(ChangeSize);
  394. // Dla aktualnego okna ustala funkcje zwrotna odpowiedzialna
  395. // zazmiany rozmiaru okna
  396.  
  397. MyInit();
  398. // Funkcja MyInit() (zdefiniowana powyzej) wykonuje wszelkie
  399. // inicjalizacje konieczne przed przystapieniem do renderowania
  400.  
  401. glEnable(GL_DEPTH_TEST);
  402. // Wlaczenie mechanizmu usuwania powierzchni niewidocznych
  403.  
  404. glutMouseFunc(Mouse);
  405. // Ustala funkcj? zwrotn? odpowiedzialn? za badanie stanu myszy
  406.  
  407. glutMotionFunc(Motion);
  408. // Ustala funkcj? zwrotn? odpowiedzialn? za badanie ruchu myszy
  409. glutMainLoop();
  410. // Funkcja uruchamia szkielet biblioteki GLUT
  411.  
  412.  
  413. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement