Guest User

Untitled

a guest
Apr 26th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.61 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <gl\glut.h>
  5. #include <gl\gl.h>
  6. #include <math.h>
  7. #include <time.h>
  8. #include <windows.h>
  9.  
  10. const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
  11. const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  12. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  13. const GLfloat light_position[] = { -5.0f, 0.0f, 0.0f, 0.0f };
  14.  
  15. const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
  16. const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
  17. const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  18. const GLfloat high_shininess[] = { 100.0f };
  19.  
  20. DWORD ostKolizja;
  21.  
  22. struct czasteczka {
  23. float x;
  24. float y;
  25. float z;
  26. float dx;
  27. float dy;
  28. float dz;
  29. float r;
  30. float rot;
  31. float drot;
  32. float kolorR;
  33. float kolorG;
  34. float kolorB;
  35. };
  36. #define ANIM_FPS 40
  37. #define N 50
  38. #define w_left -12.0
  39. #define w_right 12.0
  40. #define w_top 12.0
  41. #define w_bottom -12.0
  42. #define w_far -12.0
  43. #define w_near 12.0
  44. #define PIOVER180 0.01745329252
  45.  
  46. struct czasteczka c[N];
  47. GLdouble obsX=0.0, obsY=0.0, obsZ=-30.0;
  48. GLdouble katX = 0.0, katY = 0.0;
  49. GLdouble odleglosc = 30.0;
  50.  
  51. void kamera(GLdouble x, GLdouble y) {
  52. katX += x*M_PI/2.0;
  53. katY += y*M_PI/2.0;
  54. obsX = -(float)sin(katY*PIOVER180)*odleglosc;
  55. obsY = -(float)sin(katX*PIOVER180)*odleglosc;
  56. obsZ = (float)cos(katY*PIOVER180)*odleglosc;
  57.  
  58. }
  59.  
  60.  
  61. void wypelnijTab(struct czasteczka c[]) {
  62. int i;
  63. for(i=0; i<N; i++) {
  64. c[i].x = ((float)(rand()%200)/10.0)-10.0;
  65. c[i].y = ((float)(rand()%200)/10.0)-10.0;
  66. c[i].z = ((float)(rand()%200)/10.0)-10.0;
  67. c[i].dx = ((float)(rand()%20)/50.0)-0.2;
  68. c[i].dy = ((float)(rand()%20)/50.0)-0.2;
  69. c[i].dz = ((float)(rand()%20)/50.0)-0.2;
  70. c[i].r = ((float)(rand()%2)/10.0)+0.5;
  71. c[i].rot = 0.0;
  72. c[i].drot = (float)(rand()%20)-10.0;
  73. c[i].kolorR = (rand()%100)/100.0;
  74. c[i].kolorG = (rand()%100)/100.0;
  75. c[i].kolorB = (rand()%100)/100.0;
  76. }
  77. }
  78.  
  79. float iloczynSkalarny(float *v1, float *v2) {
  80. return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
  81. }
  82.  
  83. void liczNoweWsp(struct czasteczka c[]) {
  84. int i;
  85. int k2;
  86. int kolizja = 0;
  87. for(i=0; i<N; i++) {
  88. if(GetTickCount() - ostKolizja > 100) {
  89. for(k2=0; k2<N; k2++) {
  90. if(i==k2) continue;
  91. float xr = (c[k2].x-c[i].x);
  92. float yr = (c[k2].y-c[i].y);
  93. float zr = (c[k2].z-c[i].z);
  94. if(sqrt(xr*xr+yr*yr+zr*zr)<=(c[k2].r+c[i].r)) {
  95. kolizja = 1;
  96. FILE *plik = fopen("dane.txt", "a");
  97. fprintf(plik, "Kolizja(%i:%i)! [%.4f] ",i,k2,sqrt(xr*xr+yr*yr+zr*zr));
  98. fprintf(plik, "(%.3f,%.3f,%.3f) = (%.3f,%.3f,%.3f)\n", c[i].x,c[i].y,c[i].z,c[k2].x,c[k2].y,c[k2].z);
  99. struct czasteczka norm = {c[i].x-c[k2].x,
  100. c[i].y-c[k2].y,
  101. c[i].z-c[k2].z};
  102. float d = sqrt(norm.x*norm.x + norm.y*norm.y + norm.z*norm.z);
  103. norm.x /= d;
  104. norm.y /= d;
  105. norm.z /= d;
  106. //fprintf(plik, "Norm: %.3f:%.3f:%.3f ", norm.x, norm.y, norm.z);
  107. float ilSk1 = c[i].dx*norm.x + c[i].dy*norm.y + c[i].dz*norm.z;
  108. float ilSk2 = c[k2].dx*norm.x + c[k2].dy*norm.y + c[k2].dz*norm.z;
  109. //fprintf(plik, "IlSk: %.4f ", ilSk1);
  110. c[i].dx -= 2 * norm.x * ilSk1;
  111. c[i].dy -= 2 * norm.y * ilSk1;
  112. c[i].dz -= 2 * norm.z * ilSk1;
  113. c[k2].dx -= 2 * norm.x * ilSk2;
  114. c[k2].dy -= 2 * norm.y * ilSk2;
  115. c[k2].dz -= 2 * norm.z * ilSk2;
  116.  
  117. c[i].x+=c[i].dx;
  118. c[i].y+=c[i].dy;
  119. c[i].z+=c[i].dz;
  120.  
  121. c[k2].x+=c[k2].dx;
  122. c[k2].y+=c[k2].dy;
  123. c[k2].z+=c[k2].dz;
  124. //fprintf(plik, "Nowe: (%.3f:%.3f:%.3f) i (%.3f:%.3f:%.3f)\n", c[i].dx, c[i].dy, c[i].dz, c[k2].dx, c[k2].dy, c[k2].dz);
  125.  
  126. fclose(plik);
  127. }
  128. }
  129. }
  130. if(c[i].x+c[i].r >= w_right && c[i].dx > 0.0) c[i].dx *= -1.0;
  131. else if(c[i].x-c[i].r <= w_left && c[i].dx < 0.0) c[i].dx *= -1.0;
  132. c[i].x += c[i].dx;
  133.  
  134. if(c[i].y+c[i].r >= w_top && c[i].dy > 0.0) c[i].dy *= -1.0;
  135. else if(c[i].y-c[i].r <= w_bottom && c[i].dy < 0.0) c[i].dy *= -1.0;
  136. c[i].y += c[i].dy;
  137.  
  138. if(c[i].z-c[i].r <= w_far && c[i].dz < 0.0) c[i].dz *= -1.0;
  139. else if(c[i].z+c[i].r >= w_near && c[i].dz > 0.0) c[i].dz *= -1.0;
  140. c[i].z += c[i].dz;
  141.  
  142. c[i].rot += c[i].drot;
  143. }
  144. if(kolizja) ostKolizja = GetTickCount();
  145. }
  146. void wyswietlanie(void)
  147. {
  148.  
  149. liczNoweWsp(c);
  150. glClear(GL_COLOR_BUFFER_BIT);
  151. glClear(GL_DEPTH_BUFFER_BIT);
  152. int i;
  153. for(i=0; i<N; i++) {
  154. glLoadIdentity();
  155. gluLookAt(obsX, obsY, obsZ,
  156. 0.0, 0.0, 0.0,
  157. 0.0, 1.0, 0.0);
  158. glTranslatef(c[i].x, c[i].y, c[i].z);
  159. glRotatef(0.0, c[i].rot, 0.0, 0.0);
  160. glColor3f(c[i].kolorR, c[i].kolorG, c[i].kolorB);
  161. glutSolidSphere(c[i].r*2, 30, 30);
  162. }
  163. glLoadIdentity();
  164. gluLookAt(obsX, obsY, obsZ,
  165. 0.0, 0.0, 0.0,
  166. 0.0, 1.0, 0.0);
  167. glColor3f(1.0, 1.0, 1.0);
  168. glLineWidth(4);
  169. glBegin(GL_LINES);
  170. glVertex3f(w_left, w_top, w_near);
  171. glVertex3f(w_left, w_top, w_far);
  172.  
  173. glVertex3f(w_right, w_top, w_near);
  174. glVertex3f(w_right, w_top, w_far);
  175.  
  176. glVertex3f(w_left, w_top, w_near);
  177. glVertex3f(w_right, w_top, w_near);
  178.  
  179. glVertex3f(w_left, w_bottom, w_near);
  180. glVertex3f(w_left, w_bottom, w_far);
  181.  
  182. glVertex3f(w_right, w_bottom, w_near);
  183. glVertex3f(w_right, w_bottom, w_far);
  184.  
  185. glVertex3f(w_left, w_top, w_near);
  186. glVertex3f(w_left, w_bottom, w_near);
  187.  
  188. glVertex3f(w_right, w_top, w_near);
  189. glVertex3f(w_right, w_bottom, w_near);
  190.  
  191. glVertex3f(w_right, w_bottom, w_near);
  192. glVertex3f(w_left, w_bottom, w_near);
  193.  
  194. glVertex3f(w_left, w_top, w_far);
  195. glVertex3f(w_right, w_top, w_far);
  196.  
  197. glVertex3f(w_left, w_top, w_far);
  198. glVertex3f(w_left, w_bottom, w_far);
  199.  
  200. glVertex3f(w_right, w_top, w_far);
  201. glVertex3f(w_right, w_bottom, w_far);
  202.  
  203. glVertex3f(w_right, w_bottom, w_far);
  204. glVertex3f(w_left, w_bottom, w_far);
  205.  
  206. glEnd();
  207. glutSwapBuffers();
  208.  
  209. }
  210.  
  211.  
  212. void skalowanie(int w, int h)
  213. {
  214. glViewport(0,0,w,h);
  215. glMatrixMode(GL_PROJECTION);
  216. glLoadIdentity();
  217. gluPerspective(90.0, w/(GLdouble)h, 0.1, 66.0);
  218. //glOrtho(-15.0, 15.0, 15.0, -15.0, -15.0, 15.0);
  219. //glFrustum(-15.0, 15.0, -15.0, 15.0, 1.1, 5.0);
  220. glMatrixMode(GL_MODELVIEW);
  221. glLoadIdentity();
  222. }
  223.  
  224. void klawiatura(unsigned char klawisz, int x, int y)
  225. {
  226. glutPostRedisplay();
  227. if(klawisz == 'a') kamera(0.0, 1.0);
  228. if(klawisz == 'd') kamera(0.0, -1.0);
  229. if(klawisz == 'w') kamera(-1.0, 0.0);
  230. if(klawisz == 's') kamera(1.0, 0.0);
  231. if(klawisz == '+') odleglosc++; kamera(0.0, 0.0);
  232. if(klawisz == '-') odleglosc--; kamera(0.0, 0.0);
  233.  
  234. skalowanie( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
  235. }
  236.  
  237. void ZegarFun(int val) {
  238. /* Odrysowanie sceny: */
  239. glutPostRedisplay();
  240. /* Ponowne wystartowanie zegara: */
  241. glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  242. }
  243.  
  244.  
  245. int main(int argil, char *argtab[])
  246. {
  247. srand(time(NULL));
  248. wypelnijTab(c);
  249. glutInit(&argil,argtab);
  250. glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
  251. glutInitWindowSize(800,600);
  252. glutInitWindowPosition(50,50);
  253. glutCreateWindow("Cząsteczki");
  254.  
  255. glClearColor(0,0,0,0);
  256. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  257. //swiatlo
  258. glEnable(GL_CULL_FACE);
  259. glCullFace(GL_BACK);
  260. glShadeModel(GL_SMOOTH);
  261. glEnable(GL_DEPTH_TEST);
  262. glDepthFunc(GL_LESS);
  263.  
  264. glEnable(GL_LIGHT0);
  265. glEnable(GL_NORMALIZE);
  266. glEnable(GL_COLOR_MATERIAL);
  267. glEnable(GL_LIGHTING);
  268.  
  269. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  270. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  271. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  272. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  273.  
  274. glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  275. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  276. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  277. glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
  278. glutDisplayFunc(wyswietlanie);
  279. glutReshapeFunc(skalowanie);
  280. glutKeyboardFunc(klawiatura);
  281.  
  282. glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0); //predkosc animacji
  283.  
  284.  
  285.  
  286. glutMainLoop();
  287. return 0;
  288. }
Add Comment
Please, Sign In to add comment