Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <gl\glut.h>
- #include <gl\gl.h>
- #include <math.h>
- #include <time.h>
- #include <windows.h>
- const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
- const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- const GLfloat light_position[] = { -5.0f, 0.0f, 0.0f, 0.0f };
- const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
- const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
- const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
- const GLfloat high_shininess[] = { 100.0f };
- DWORD ostKolizja;
- struct czasteczka {
- float x;
- float y;
- float z;
- float dx;
- float dy;
- float dz;
- float r;
- float rot;
- float drot;
- float kolorR;
- float kolorG;
- float kolorB;
- };
- #define ANIM_FPS 40
- #define N 50
- #define w_left -12.0
- #define w_right 12.0
- #define w_top 12.0
- #define w_bottom -12.0
- #define w_far -12.0
- #define w_near 12.0
- #define PIOVER180 0.01745329252
- struct czasteczka c[N];
- GLdouble obsX=0.0, obsY=0.0, obsZ=-30.0;
- GLdouble katX = 0.0, katY = 0.0;
- GLdouble odleglosc = 30.0;
- void kamera(GLdouble x, GLdouble y) {
- katX += x*M_PI/2.0;
- katY += y*M_PI/2.0;
- obsX = -(float)sin(katY*PIOVER180)*odleglosc;
- obsY = -(float)sin(katX*PIOVER180)*odleglosc;
- obsZ = (float)cos(katY*PIOVER180)*odleglosc;
- }
- void wypelnijTab(struct czasteczka c[]) {
- int i;
- for(i=0; i<N; i++) {
- c[i].x = ((float)(rand()%200)/10.0)-10.0;
- c[i].y = ((float)(rand()%200)/10.0)-10.0;
- c[i].z = ((float)(rand()%200)/10.0)-10.0;
- c[i].dx = ((float)(rand()%20)/50.0)-0.2;
- c[i].dy = ((float)(rand()%20)/50.0)-0.2;
- c[i].dz = ((float)(rand()%20)/50.0)-0.2;
- c[i].r = ((float)(rand()%2)/10.0)+0.5;
- c[i].rot = 0.0;
- c[i].drot = (float)(rand()%20)-10.0;
- c[i].kolorR = (rand()%100)/100.0;
- c[i].kolorG = (rand()%100)/100.0;
- c[i].kolorB = (rand()%100)/100.0;
- }
- }
- float iloczynSkalarny(float *v1, float *v2) {
- return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
- }
- void liczNoweWsp(struct czasteczka c[]) {
- int i;
- int k2;
- int kolizja = 0;
- for(i=0; i<N; i++) {
- if(GetTickCount() - ostKolizja > 100) {
- for(k2=0; k2<N; k2++) {
- if(i==k2) continue;
- float xr = (c[k2].x-c[i].x);
- float yr = (c[k2].y-c[i].y);
- float zr = (c[k2].z-c[i].z);
- if(sqrt(xr*xr+yr*yr+zr*zr)<=(c[k2].r+c[i].r)) {
- kolizja = 1;
- FILE *plik = fopen("dane.txt", "a");
- fprintf(plik, "Kolizja(%i:%i)! [%.4f] ",i,k2,sqrt(xr*xr+yr*yr+zr*zr));
- 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);
- struct czasteczka norm = {c[i].x-c[k2].x,
- c[i].y-c[k2].y,
- c[i].z-c[k2].z};
- float d = sqrt(norm.x*norm.x + norm.y*norm.y + norm.z*norm.z);
- norm.x /= d;
- norm.y /= d;
- norm.z /= d;
- //fprintf(plik, "Norm: %.3f:%.3f:%.3f ", norm.x, norm.y, norm.z);
- float ilSk1 = c[i].dx*norm.x + c[i].dy*norm.y + c[i].dz*norm.z;
- float ilSk2 = c[k2].dx*norm.x + c[k2].dy*norm.y + c[k2].dz*norm.z;
- //fprintf(plik, "IlSk: %.4f ", ilSk1);
- c[i].dx -= 2 * norm.x * ilSk1;
- c[i].dy -= 2 * norm.y * ilSk1;
- c[i].dz -= 2 * norm.z * ilSk1;
- c[k2].dx -= 2 * norm.x * ilSk2;
- c[k2].dy -= 2 * norm.y * ilSk2;
- c[k2].dz -= 2 * norm.z * ilSk2;
- c[i].x+=c[i].dx;
- c[i].y+=c[i].dy;
- c[i].z+=c[i].dz;
- c[k2].x+=c[k2].dx;
- c[k2].y+=c[k2].dy;
- c[k2].z+=c[k2].dz;
- //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);
- fclose(plik);
- }
- }
- }
- if(c[i].x+c[i].r >= w_right && c[i].dx > 0.0) c[i].dx *= -1.0;
- else if(c[i].x-c[i].r <= w_left && c[i].dx < 0.0) c[i].dx *= -1.0;
- c[i].x += c[i].dx;
- if(c[i].y+c[i].r >= w_top && c[i].dy > 0.0) c[i].dy *= -1.0;
- else if(c[i].y-c[i].r <= w_bottom && c[i].dy < 0.0) c[i].dy *= -1.0;
- c[i].y += c[i].dy;
- if(c[i].z-c[i].r <= w_far && c[i].dz < 0.0) c[i].dz *= -1.0;
- else if(c[i].z+c[i].r >= w_near && c[i].dz > 0.0) c[i].dz *= -1.0;
- c[i].z += c[i].dz;
- c[i].rot += c[i].drot;
- }
- if(kolizja) ostKolizja = GetTickCount();
- }
- void wyswietlanie(void)
- {
- liczNoweWsp(c);
- glClear(GL_COLOR_BUFFER_BIT);
- glClear(GL_DEPTH_BUFFER_BIT);
- int i;
- for(i=0; i<N; i++) {
- glLoadIdentity();
- gluLookAt(obsX, obsY, obsZ,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
- glTranslatef(c[i].x, c[i].y, c[i].z);
- glRotatef(0.0, c[i].rot, 0.0, 0.0);
- glColor3f(c[i].kolorR, c[i].kolorG, c[i].kolorB);
- glutSolidSphere(c[i].r*2, 30, 30);
- }
- glLoadIdentity();
- gluLookAt(obsX, obsY, obsZ,
- 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0);
- glColor3f(1.0, 1.0, 1.0);
- glLineWidth(4);
- glBegin(GL_LINES);
- glVertex3f(w_left, w_top, w_near);
- glVertex3f(w_left, w_top, w_far);
- glVertex3f(w_right, w_top, w_near);
- glVertex3f(w_right, w_top, w_far);
- glVertex3f(w_left, w_top, w_near);
- glVertex3f(w_right, w_top, w_near);
- glVertex3f(w_left, w_bottom, w_near);
- glVertex3f(w_left, w_bottom, w_far);
- glVertex3f(w_right, w_bottom, w_near);
- glVertex3f(w_right, w_bottom, w_far);
- glVertex3f(w_left, w_top, w_near);
- glVertex3f(w_left, w_bottom, w_near);
- glVertex3f(w_right, w_top, w_near);
- glVertex3f(w_right, w_bottom, w_near);
- glVertex3f(w_right, w_bottom, w_near);
- glVertex3f(w_left, w_bottom, w_near);
- glVertex3f(w_left, w_top, w_far);
- glVertex3f(w_right, w_top, w_far);
- glVertex3f(w_left, w_top, w_far);
- glVertex3f(w_left, w_bottom, w_far);
- glVertex3f(w_right, w_top, w_far);
- glVertex3f(w_right, w_bottom, w_far);
- glVertex3f(w_right, w_bottom, w_far);
- glVertex3f(w_left, w_bottom, w_far);
- glEnd();
- glutSwapBuffers();
- }
- void skalowanie(int w, int h)
- {
- glViewport(0,0,w,h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(90.0, w/(GLdouble)h, 0.1, 66.0);
- //glOrtho(-15.0, 15.0, 15.0, -15.0, -15.0, 15.0);
- //glFrustum(-15.0, 15.0, -15.0, 15.0, 1.1, 5.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void klawiatura(unsigned char klawisz, int x, int y)
- {
- glutPostRedisplay();
- if(klawisz == 'a') kamera(0.0, 1.0);
- if(klawisz == 'd') kamera(0.0, -1.0);
- if(klawisz == 'w') kamera(-1.0, 0.0);
- if(klawisz == 's') kamera(1.0, 0.0);
- if(klawisz == '+') odleglosc++; kamera(0.0, 0.0);
- if(klawisz == '-') odleglosc--; kamera(0.0, 0.0);
- skalowanie( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
- }
- void ZegarFun(int val) {
- /* Odrysowanie sceny: */
- glutPostRedisplay();
- /* Ponowne wystartowanie zegara: */
- glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
- }
- int main(int argil, char *argtab[])
- {
- srand(time(NULL));
- wypelnijTab(c);
- glutInit(&argil,argtab);
- glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
- glutInitWindowSize(800,600);
- glutInitWindowPosition(50,50);
- glutCreateWindow("Cząsteczki");
- glClearColor(0,0,0,0);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- //swiatlo
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glEnable(GL_LIGHT0);
- glEnable(GL_NORMALIZE);
- glEnable(GL_COLOR_MATERIAL);
- glEnable(GL_LIGHTING);
- glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
- glLightfv(GL_LIGHT0, GL_POSITION, light_position);
- glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
- glutDisplayFunc(wyswietlanie);
- glutReshapeFunc(skalowanie);
- glutKeyboardFunc(klawiatura);
- glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0); //predkosc animacji
- glutMainLoop();
- return 0;
- }
Add Comment
Please, Sign In to add comment