Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.27 KB | None | 0 0
  1. /*************************************************************************************/
  2. // Jajko 3-D
  3. /*************************************************************************************/
  4.  
  5. #include "stdafx.h"
  6. #include <windows.h>
  7. #include <math.h>
  8. #include <gl/gl.h>
  9. #include <gl/glut.h>
  10.  
  11. #define PI 3.1415926
  12.  
  13. typedef float point3[3];
  14.  
  15. bool fullscreenMode = false;
  16.  
  17. typedef float point3[3];
  18.  
  19. static GLfloat viewer[]= {0.0, 0.0, 10.0};
  20. // inicjalizacja położenia obserwatora
  21.  
  22. static GLfloat thetaX = 0.0; // kąt obrotu obiektu wokol osi X
  23. static GLfloat thetaY = 0.0; // kąt obrotu obiektu wokol osi X
  24. static GLfloat pix2angle; // przelicznik pikseli na stopnie
  25.  
  26. static GLint status = 0; // stan klawiszy myszy
  27. // 0 - nie naciśnięto żadnego klawisza
  28. // 1 - naciśnięty został lewy klawisz
  29.  
  30. static GLint x_pos_old=0; // poprzednia pozycja X kursora myszy
  31. static GLint y_pos_old=0; // poprzednia pozycja Y kursora myszy
  32.  
  33. static GLint delta_x = 0; // różnica pomiędzy pozycją bieżącą
  34. // i poprzednią kursora myszy dla osi X
  35. static GLint delta_y = 0; // różnica pomiędzy pozycją bieżącą
  36. // i poprzednią kursora myszy dla osi Y
  37. static GLfloat scale = 0.1;
  38.  
  39. int N = 50;
  40. int model = 1;
  41.  
  42. /*************************************************************************************/
  43.  
  44. // Funkcja rysująca osie układu współrzędnych
  45.  
  46. void Axes(void)
  47. {
  48. point3 x_min = {-5.0, 0.0, 0.0};
  49. point3 x_max = { 5.0, 0.0, 0.0};
  50. // początek i koniec obrazu osi x
  51.  
  52. point3 y_min = {0.0, -5.0, 0.0};
  53. point3 y_max = {0.0, 5.0, 0.0};
  54. // początek i koniec obrazu osi y
  55.  
  56. point3 z_min = {0.0, 0.0, -5.0};
  57. point3 z_max = {0.0, 0.0, 5.0};
  58. // początek i koniec obrazu osi y
  59.  
  60. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  61. glBegin(GL_LINES); // rysowanie osi x
  62. glVertex3fv(x_min);
  63. glVertex3fv(x_max);
  64. glEnd();
  65.  
  66. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  67. glBegin(GL_LINES); // rysowanie osi y
  68. glVertex3fv(y_min);
  69. glVertex3fv(y_max);
  70. glEnd();
  71.  
  72. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  73. glBegin(GL_LINES); // rysowanie osi z
  74. glVertex3fv(z_min);
  75. glVertex3fv(z_max);
  76. glEnd();
  77. }
  78.  
  79. /*************************************************************************************/
  80.  
  81. // Funkcja "bada" stan myszy i ustawia wartości odpowiednich zmiennych globalnych
  82.  
  83. void Mouse(int btn, int state, int x, int y)
  84. {
  85. if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  86. {
  87. x_pos_old = x; // przypisanie aktualnie odczytanej pozycji kursora
  88. // jako pozycji poprzedniej
  89. y_pos_old = y;
  90. status = 1; // wciśnięty został lewy klawisz myszy
  91. }
  92. else if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  93. {
  94. y_pos_old = y;
  95. status = 2;
  96. }
  97. else
  98. status = 0; // nie został wciśnięty żaden klawisz
  99. }
  100.  
  101. /*************************************************************************************/
  102.  
  103. // Funkcja "monitoruje" położenie kursora myszy i ustawia wartości odpowiednich
  104. // zmiennych globalnych
  105.  
  106. void Motion( GLsizei x, GLsizei y ) {
  107. delta_x=x-x_pos_old; // obliczenie różnicy położenia kursora myszy
  108. x_pos_old=x; // podstawienie bieżacego położenia jako poprzednie
  109. delta_y=y-y_pos_old; // obliczenie różnicy położenia kursora myszy
  110. y_pos_old=y; // podstawienie bieżacego położenia jako popr
  111. glutPostRedisplay(); // przerysowanie obrazu sceny
  112. }
  113.  
  114. /*************************************************************************************/
  115.  
  116. //
  117.  
  118. float*** fillColor(int N)
  119. {
  120. const int D = 3;
  121. float ***color;
  122.  
  123. // alokacja pamieci
  124. color = new float** [N];
  125. for (int i=0; i<N; i++)
  126. {
  127. color[i] = new float* [N];
  128. for (int j=0; j<N; j++)
  129. {
  130. color[i][j] = new float [N];
  131. for (int k=0; k<D; k++)
  132. color[i][j][k] = ((float)(rand() % 100)) * 0.01; // wylosowanie koloru
  133. }
  134. }
  135.  
  136. for(int i=N/2; i<N; i++)
  137. {
  138. for (int k=0; k<D; k++)
  139. {
  140. color[i][0][k] = color[N-i-1][N-1][k];
  141. color[i][N-1][k] = color[N-i-1][0][k];
  142. }
  143. }
  144.  
  145. return color;
  146. }
  147.  
  148. void drawEgg(int N)
  149. {
  150. // alokacja pamieci
  151. const int D = 3;
  152.  
  153. float ***color;
  154.  
  155. if (model == 3)
  156. color = fillColor(N);
  157.  
  158. float ***tab = new float** [N];
  159. for (int i=0; i<N; i++)
  160. {
  161. tab[i] = new float* [N];
  162. for (int j=0; j<N; j++)
  163. tab[i][j] = new float [N];
  164. }
  165.  
  166. glColor3f(1.0f, 1.0f, 0.0f);
  167.  
  168. for (int i=0; i<N; i++)
  169. {
  170. for (int j=0; j<N; j++)
  171. {
  172. float u = (float) i/(N-1);
  173. float v = (float) j/(N-1);
  174. float temp = (-90.0 * pow(u,5) + 225.0 * pow(u,4) - 270.0 * pow(u,3)
  175. + 180.0 * pow(u,2) - 45.0 * u);
  176. tab[i][j][0] = temp * cos(PI * v);
  177. tab[i][j][1] = (160.0 * pow(u,4) - 320.0 * pow(u,3) + 160.0 * pow(u,2) - 5.0);
  178. tab[i][j][2] = temp * sin(PI * v);
  179.  
  180. switch (model)
  181. {
  182. case 1: // chmura punktow
  183. glBegin(GL_POINTS);
  184. glVertex3fv(tab[i][j]);
  185. glEnd();
  186. break;
  187.  
  188. case 2: // siatka
  189. if (i>0 && j>0)
  190. {
  191. glBegin(GL_LINES);
  192. // odcinki pionowe
  193. glVertex3fv(tab[i-1][j]);
  194. glVertex3fv(tab[i][j]);
  195.  
  196. // odcinki poziome
  197. glVertex3fv(tab[i][j-1]);
  198. glVertex3fv(tab[i][j]);
  199.  
  200. // odcinki ukosne
  201. if (i<N/2)
  202. {
  203. glVertex3fv(tab[i-1][j]);
  204. glVertex3fv(tab[i][j-1]);
  205. }
  206. else
  207. {
  208. glVertex3fv(tab[i-1][j-1]);
  209. glVertex3fv(tab[i][j]);
  210. }
  211. glEnd();
  212. }
  213. break;
  214.  
  215. case 3: // trojkaty
  216. if (i>0 && j>0)
  217. {
  218. if (i < N/2)
  219. {
  220. glBegin(GL_TRIANGLES);
  221. glColor3fv(color[i-1][j-1]);
  222. glVertex3fv(tab[i-1][j-1]);
  223.  
  224. glColor3fv(color[i][j-1]);
  225. glVertex3fv(tab[i][j-1]);
  226.  
  227. glColor3fv(color[i-1][j]);
  228. glVertex3fv(tab[i-1][j]);
  229.  
  230.  
  231. glColor3fv(color[i][j]);
  232. glVertex3fv(tab[i][j]);
  233.  
  234. glColor3fv(color[i][j-1]);
  235. glVertex3fv(tab[i][j-1]);
  236.  
  237. glColor3fv(color[i-1][j]);
  238. glVertex3fv(tab[i-1][j]);
  239. glEnd();
  240. }
  241. else
  242. {
  243. glBegin(GL_TRIANGLES);
  244. glColor3fv(color[i-1][j-1]);
  245. glVertex3fv(tab[i-1][j-1]);
  246.  
  247. glColor3fv(color[i][j-1]);
  248. glVertex3fv(tab[i][j-1]);
  249.  
  250. glColor3fv(color[i][j]);
  251. glVertex3fv(tab[i][j]);
  252.  
  253.  
  254. glColor3fv(color[i-1][j-1]);
  255. glVertex3fv(tab[i-1][j-1]);
  256.  
  257. glColor3fv(color[i-1][j]);
  258. glVertex3fv(tab[i-1][j]);
  259.  
  260. glColor3fv(color[i][j]);
  261. glVertex3fv(tab[i][j]);
  262. glEnd();
  263. }
  264. }
  265. break;
  266. }
  267. }
  268. }
  269.  
  270. //dealokacja pamieci
  271. for (int i=0; i<N; i++)
  272. {
  273. for (int j=0; j<N; j++)
  274. {
  275. delete [] tab[i][j];
  276. }
  277. delete [] tab[i];
  278. }
  279. delete [] tab;
  280.  
  281. if (model == 3)
  282. {
  283. for (int i=0; i<N; i++)
  284. {
  285. for (int j=0; j<N; j++)
  286. delete [] color[i][j];
  287. delete [] color[i];
  288. }
  289. delete [] color;
  290. }
  291. }
  292.  
  293.  
  294. int getLength(void *font, char *txt)
  295. /* Funkcja zwraca rzeczywista dlugosc tekstu odrysowywanego na ekranie. Potrzebna
  296. do wyrownywania tekstu (do lewej, srodek, do prawej).
  297. Parametry:
  298. - void *font = czcionka, mozliwe typy: GLUT_STROKE_ROMAN, GLUT_STROKE_MONO_ROMAN
  299. - char *txt = tekst, ktorego dlugosc jest zwracana */
  300. {
  301. int length = 0;
  302. int i;
  303. int len=strlen(txt);
  304. for (i=0; i<len; i++)
  305. {
  306. length += glutStrokeWidth(font, txt[i]);
  307. // glutStrokeWidth zwraca dlugosc pojedynczego znaku
  308. }
  309. return length;
  310. }
  311.  
  312. enum TAlign {LEFT, CENTER, RIGHT};
  313. // wyrownanie tekstu: LEFT (do lewej), CENTER (wysrodkowane), RIGHT (do prawej)
  314.  
  315. void printText(GLfloat x, GLfloat y, void *font, char *txt, TAlign align = LEFT, GLfloat scale = 1, GLfloat lineWidth = 1)
  316. {
  317. int length = getLength(font, txt) * scale;
  318. if (align == CENTER)
  319. x -= length/2;
  320. else if (align == RIGHT)
  321. x -= length;
  322. glLineWidth(lineWidth); // ustawienie grubosci linii
  323. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  324. glEnable(GL_BLEND);
  325. glEnable(GL_LINE_SMOOTH);
  326. glPushMatrix();
  327. glTranslatef(x, y, 0); // przesuniecie o wektor
  328. glScalef(scale, scale, scale); // skalowanie
  329. int i;
  330. int len=strlen(txt);
  331. for (i=0; i<len; i++)
  332. {
  333. glutStrokeCharacter(font, txt[i]); // rysowanie pojedynczego znaku
  334. }
  335. glPopMatrix();
  336. }
  337.  
  338. // Funkcja określająca co ma być rysowane (zawsze wywoływana gdy trzeba
  339. // przerysować scenę)
  340.  
  341. void RenderScene(void)
  342. {
  343. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  344. // Czyszczenie okna aktualnym kolorem czyszczącym
  345.  
  346. glLoadIdentity();
  347. // Czyszczenie macierzy bieżącej
  348.  
  349. gluLookAt(viewer[0],viewer[1],viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  350. // Zdefiniowanie położenia obserwatora
  351.  
  352. Axes();
  353. // Narysowanie osi przy pomocy funkcji zdefiniowanej wyżej
  354.  
  355. char txt[10] = "N = ";
  356. char tmp[5];
  357. itoa(N, tmp, 10);
  358. strcat(txt, tmp);
  359.  
  360. glColor3f(1.0f, 1.0f, 1.0f);
  361. // Ustawienie koloru rysowania na biały
  362.  
  363. printText(0.0, 6.1, GLUT_STROKE_ROMAN, txt, CENTER, 0.007, 3.0);
  364.  
  365. if(status == 1) // jeśli lewy klawisz myszy wciśnięty
  366. {
  367. thetaX += delta_x*pix2angle; // modyfikacja kąta obrotu o kąt proporcjonalny
  368. thetaY += delta_y*pix2angle; // do różnicy położeń kursora myszy
  369. }
  370.  
  371. if (status == 2)
  372. {
  373. viewer[2] += delta_y * scale;
  374. }
  375.  
  376. glRotatef(thetaX, 0.0, 1.0, 0.0); //obrót obiektu o nowy kąt X
  377. glRotatef(thetaY, 1.0, 0.0, 0.0); //obrót obiektu o nowy kąt Y
  378.  
  379. glColor3f(1.0f, 1.0f, 1.0f);
  380. // Ustawienie koloru rysowania na biały
  381.  
  382. drawEgg(N);
  383.  
  384. glFlush();
  385. // Przekazanie poleceń rysujących do wykonania
  386.  
  387. glutSwapBuffers();
  388. }
  389.  
  390. void keyboard(unsigned char key, int x, int y)
  391. {
  392. if (key == '1')
  393. model = 1;
  394. if (key == '2')
  395. model = 2;
  396. if (key == '3')
  397. model = 3;
  398. if (key == '+')
  399. N++;
  400. if (key == '-' && N>3)
  401. N--;
  402. if(key==27 && fullscreenMode)
  403. {
  404. glutLeaveGameMode();
  405. exit(0);
  406. }
  407.  
  408. RenderScene(); // przerysowanie obrazu sceny
  409. }
  410.  
  411. /*************************************************************************************/
  412.  
  413. // Funkcja ustalająca stan renderowania
  414.  
  415. void MyInit(void)
  416. {
  417. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  418. // Kolor czyszcący (wypełnienia okna) ustawiono na czarny
  419. }
  420.  
  421.  
  422. /*************************************************************************************/
  423.  
  424. // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
  425. // w przypadku zmiany rozmiarów okna.
  426. // Parametry vertical i horizontal (wysokość i szerokość okna) są
  427. // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
  428.  
  429. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  430. {
  431. pix2angle = 360.0/(float)horizontal;
  432. // przeliczenie pikseli na stopnie
  433.  
  434. glMatrixMode(GL_PROJECTION);
  435. // Przełączenie macierzy bieżącej na macierz projekcji
  436.  
  437. glLoadIdentity();
  438. // Czyszcznie macierzy bieżącej
  439.  
  440. gluPerspective(70, 1.0, 1.0, 30.0);
  441. // Ustawienie parametrów dla rzutu perspektywicznego
  442.  
  443. if(horizontal <= vertical)
  444. glViewport(0, (vertical-horizontal)/2, horizontal, horizontal);
  445. else
  446. glViewport((horizontal-vertical)/2, 0, vertical, vertical);
  447. // Ustawienie wielkości okna okna widoku (viewport) w zależności
  448. // relacji pomiędzy wysokością i szerokością okna
  449.  
  450. glMatrixMode(GL_MODELVIEW);
  451. // Przełączenie macierzy bieżącej na macierz widoku modelu
  452.  
  453. glLoadIdentity();
  454. // Czyszczenie macierzy bieżącej
  455. }
  456.  
  457. /*************************************************************************************/
  458.  
  459. // Główny punkt wejścia programu. Program działa w trybie konsoli
  460.  
  461. int _tmain(int argc, _TCHAR* argv[])
  462. {
  463. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |GLUT_DEPTH);
  464.  
  465. if (!fullscreenMode)
  466. {
  467. glutInitWindowSize(300, 300);
  468. glutCreateWindow("Jajko 3D");
  469. //Utworzenie okna i określenie treści napisu w nagłówku okna
  470. }
  471.  
  472. if (fullscreenMode)
  473. {
  474. glutGameModeString( "1280x1024:32@75" );
  475. glutEnterGameMode();
  476. }
  477.  
  478. glutDisplayFunc(RenderScene);
  479. // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  480. // (callback function). Bedzie ona wywoływana za każdym razem
  481. // gdy zajdzie potrzba przeryswania okna
  482.  
  483. glutReshapeFunc(ChangeSize);
  484. // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  485. // zazmiany rozmiaru okna
  486.  
  487. MyInit();
  488. // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  489. // inicjalizacje konieczne przed przystąpieniem do renderowania
  490.  
  491. glutKeyboardFunc(keyboard);
  492. // Ustala funkcję zwrotną odpowiedzialną za badanie stanu klawiatury
  493.  
  494. glutMouseFunc(Mouse);
  495. // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
  496.  
  497. glutMotionFunc(Motion);
  498. // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
  499.  
  500. glEnable(GL_DEPTH_TEST);
  501. // Włączenie mechanizmu usuwania niewidocznych elementów sceny
  502.  
  503. glutMainLoop();
  504. // Funkcja uruchamia szkielet biblioteki GLUT
  505.  
  506. return 0;
  507. }
  508.  
  509. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement