CzarnyBarszcz

zadanie_oswietlenie

Apr 30th, 2021 (edited)
965
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.72 KB | None | 0 0
  1.  
  2. #include <windows.h>
  3. #ifdef __APPLE__
  4. #include <GLUT/glut.h>
  5. #else
  6. #include <GL/glut.h>
  7. #endif
  8. #include <math.h>
  9. #include <stdlib.h>
  10. #include <iostream>
  11. #include <time.h>
  12.  
  13. using namespace std;
  14.  
  15. enum
  16. {
  17.     ORTO,
  18.     ASPECT_1_1,
  19.     FRUST,
  20.     PERSP,
  21.     EXIT,
  22.     FULL_WINDOW,
  23.     SWIATLO_OGOLNE,
  24.     REFLEKTOR,
  25. };
  26.  
  27. int rzut,skala;
  28.  
  29. int edytuj = 1;
  30.  
  31. GLdouble positionX =0.0;
  32. GLdouble positionY =0.0;
  33. GLdouble positionZ =-38.0;
  34. GLdouble angleA=0.0;
  35.  
  36. GLdouble PI = 3.14;
  37. GLdouble alfa = -PI / 2;
  38. GLdouble skok_point = 10.0;
  39. GLdouble skok_eye = 1.0;
  40.  
  41. GLfloat eyex=0.0;
  42. GLfloat eyey=0.0;
  43. GLfloat eyez=1.0;
  44.  
  45. GLfloat fskupienie =6.0f;
  46. GLfloat frozwarcie =60.0f;
  47.  
  48. GLfloat pointx = skok_point * cos (alfa);
  49. GLfloat pointy = 0.0;
  50. GLfloat pointz = skok_point * sin (alfa);
  51.  
  52. GLdouble fovy =45;
  53.  
  54. GLfloat fPozycja_swiatla[] = {100.0f, 100.0f, 50.0f, 1.0f};
  55. GLfloat fSlabe_swiatlo[] = {0.25f, 0.25f, 0.25f, 1.0f};
  56. GLfloat fMocne_swiatlo[] = {1.0f, 1.0f, 1.0f, 1.0f};
  57.  
  58. GLfloat fPozycja_reflektora[4] = {eyex, eyey, eyez, 10.0f};
  59. GLfloat fKierunek_reflektora[4] = {pointx, pointy, pointz, 1.0f}; // kierunek w którym ma œwieciæ reflektor
  60.  
  61. GLfloat ambient_materials[] = {0.329412, 0.223529, 0.027451, 1.0};
  62. GLfloat diffuse_materials[] = {0.780392, 0.568627, 0.113725, 1.0};
  63. GLfloat specular_materials[] = {0.992157, 0.941176, 0.807843, 1.0};
  64. GLfloat shininess_materials = 27.8974;
  65.  
  66. int width = 640;
  67. int height = 480;
  68.  
  69. static void Reshape(int width, int height)
  70. {
  71.     const float ar = (float) width / (float) height;
  72.  
  73.     GLdouble aspect = -1.0;
  74.     GLdouble zakres = 1.0;
  75.     GLdouble blisko = 2.0;
  76.     GLdouble daleko = 100.0;
  77.  
  78.     GLdouble zakresORTO = 15.0;
  79.  
  80.     glViewport(0, 0, width, height);
  81.     glMatrixMode(GL_PROJECTION);
  82.     glLoadIdentity();
  83.     //glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
  84.     //glOrtho(-ar, ar, -1.0, 1.0, 2.0, 100.0);
  85.     if (rzut==FRUST)
  86.     {
  87.         if (skala==ASPECT_1_1)
  88.         {
  89.             if (width < height && width > 0)
  90.                 glFrustum (-zakres,zakres,-zakres*height/width,zakres*height/width,blisko,daleko);
  91.             else if (width >= height && height > 0)
  92.                 glFrustum (-zakres*width/height,zakres*width/height,-zakres,zakres,blisko,daleko);
  93.         }
  94.         else
  95.             glFrustum (-zakres,zakres,-zakres,zakres,blisko,daleko);
  96.     }
  97.     if (rzut==ORTO)
  98.     {
  99.         if (skala==ASPECT_1_1)
  100.         {
  101.             if (width < height && width > 0)
  102.                 glOrtho (-zakresORTO,zakresORTO,-zakresORTO*height/width,zakresORTO*height/width,-blisko,daleko);
  103.             else if (width >= height && height > 0)
  104.                 glOrtho (-zakresORTO*width/height,zakresORTO*width/height,-zakresORTO,zakresORTO,-blisko,daleko);
  105.         }
  106.         else
  107.             glOrtho (-zakresORTO,zakresORTO,-zakresORTO,zakresORTO,-blisko,daleko);
  108.     }
  109.     if (rzut==PERSP)
  110.     {
  111.         if (height > 0)
  112.             aspect = width/(GLdouble)height;
  113.         gluPerspective (90,aspect,blisko,daleko);
  114.     }
  115.  
  116.     gluLookAt(eyex,eyey,eyez,pointx,pointy,pointz,0,1,0);
  117.     glMatrixMode(GL_MODELVIEW);
  118.     glLoadIdentity() ;
  119. }
  120. static void display(void)
  121. {
  122.     const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
  123.     const double a = t*90.0;
  124.  
  125.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  126.  
  127.     glPushMatrix();
  128.         glTranslated(positionX,positionY,positionZ);
  129.         //glRotated(45,0.5,0.5,0.5);
  130.         glColor3d(1,0,0);
  131.         //glScaled(5,5.5,2.0);
  132.         glScaled(1,1.0,1.0);
  133.         glutSolidCube(25);
  134.     glPopMatrix();
  135.     glPushMatrix();
  136.         glColor3d(0,1,0);
  137.         glRotated(a,0,1,0);
  138.         glTranslated(positionX +30,positionY,positionZ +10);
  139.         glutSolidTeapot(15);
  140.     glPopMatrix();
  141.         glFlush();
  142.         glutSwapBuffers();
  143. }
  144.  
  145. void xyzoka()
  146. {
  147.     cout<<"OKO -X : "<<eyex<<"OKO -Y : "<<eyey<<"OKO -Z : "<<eyez<<endl;
  148. }
  149. void xyzcentrum()
  150. {
  151.     cout<<"centrum -X : "<<pointx<<"centrum -Y : "<<pointy<<"centrum -Z : "<<pointz<<endl;
  152. }
  153.  
  154. static void key(unsigned char key, int x, int y)
  155. {
  156.     switch (key)
  157.     {
  158.         case '1':
  159.             edytuj = 1;
  160.             cout<<"teraz edytujesz kat rozwarcia reflektora za pomoca klawiszy [+/-]"<<endl;
  161.         break;
  162.         case '2':
  163.             edytuj = 2;
  164.             cout<<"teraz edytujesz skupienie reflektora za pomoca klawiszy [+/-]"<<endl;
  165.         break;
  166.         case '3':
  167.             edytuj = 3;
  168.             cout<<"teraz edytujesz kierunek reflektora za pomoca klawiszy [+/-]"<<endl;
  169.         break;
  170.         case '-' :
  171.             if(edytuj == 1)
  172.             {
  173.                 frozwarcie-=0.1f;
  174.                 glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, frozwarcie);
  175.                 cout<<"rozwarcie kata : "<<frozwarcie<<endl;
  176.             }
  177.             if(edytuj == 2)
  178.             {
  179.                 fskupienie-=0.1f;
  180.                 glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,fskupienie);
  181.                 cout<<"skupienie reflektora : "<<fskupienie<<endl;
  182.             }
  183.         break;
  184.         case '+' :
  185.             if(edytuj == 1)
  186.             {
  187.                 frozwarcie+=0.1f;
  188.                 glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, frozwarcie);
  189.                 cout<<"rozwarcie kata : "<<frozwarcie<<endl;
  190.             }
  191.             if(edytuj == 2)
  192.             {
  193.                 fskupienie+=0.1f;
  194.                 glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,fskupienie);
  195.                 cout<<"skupienie reflektora : "<<fskupienie<<endl;
  196.             }
  197.         break;
  198.         case 'w':
  199.         skok_eye += 1.0f;
  200.         eyex = skok_eye * cos (alfa) + eyex;
  201.         eyez = skok_eye * sin (alfa) + eyez;
  202.         pointx = skok_point * cos (alfa) + eyex;
  203.         pointz = skok_point * sin (alfa) + eyez;
  204.         glLightfv (GL_LIGHT1, GL_POSITION, fPozycja_reflektora);
  205.  
  206.         skok_eye = 1.0f;
  207.         break;
  208.         case 's':
  209.         skok_eye -= 1.0f;
  210.         eyex = skok_eye * cos (alfa) + eyex;
  211.         eyez = skok_eye * sin (alfa) + eyez;
  212.         pointx = skok_point * cos (alfa) + eyex;
  213.         pointz = skok_point * sin (alfa) + eyez;
  214.         glLightfv (GL_LIGHT1, GL_POSITION, fPozycja_reflektora);
  215.         break;
  216.     }
  217.     Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
  218. }
  219.  
  220. void SpecialKeys( int key, int x, int y )
  221. {
  222.     switch( key )
  223.     {
  224.     case GLUT_KEY_LEFT:
  225.         if(edytuj == 3)
  226.         {
  227.             fKierunek_reflektora[0] -= 1.0f;
  228.             glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  229.             cout<<"kierunek X reflektora : "<< fKierunek_reflektora[0]<<endl;
  230.         }
  231.         else
  232.         {
  233.         alfa -= PI / 32;
  234.         pointx = skok_point * cos (alfa) + eyex;
  235.         pointz = skok_point * sin (alfa) + eyez;
  236.                 fKierunek_reflektora[0] = pointx;
  237.                 fKierunek_reflektora[2] = pointz;
  238.         glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  239.         cout<<"kierunek X reflektora : "<< fKierunek_reflektora[0]<<endl;
  240.  
  241.         }
  242.         break;
  243.     case GLUT_KEY_RIGHT:
  244.         if(edytuj == 3)
  245.         {
  246.             fKierunek_reflektora[0] += 1.0f;
  247.             glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  248.             cout<<"kierunek X reflektora : "<< fKierunek_reflektora[0]<<endl;
  249.         }
  250.         else
  251.         {
  252.         alfa += PI / 32;
  253.         pointx = skok_point * cos (alfa) + eyex;
  254.         pointz = skok_point * sin (alfa) + eyez;
  255.                 fKierunek_reflektora[0] = pointx;
  256.                 fKierunek_reflektora[2] = pointz;
  257.         glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  258.         cout<<"kierunek X reflektora : "<< fKierunek_reflektora[0]<<endl;
  259.         }
  260.         break;
  261.     case GLUT_KEY_UP:
  262.         if(edytuj == 3)
  263.         {
  264.             fKierunek_reflektora[1] += 1.0f;
  265.             glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  266.         }
  267.         else
  268.         {
  269.         alfa -= PI / 32;
  270.         pointz = skok_point * cos (alfa) + eyez;
  271.         pointy = skok_point * sin (alfa) + eyey;
  272.                      fKierunek_reflektora[1] = pointy;
  273.                      fKierunek_reflektora[2] = pointz;
  274.             glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  275.             cout<<"kierunek Y reflektora : "<< fKierunek_reflektora[1]<<endl;
  276.         }
  277.         break;
  278.     case GLUT_KEY_DOWN:
  279.         if(edytuj == 3)
  280.         {
  281.             fKierunek_reflektora[1] -= 1.0f;
  282.             glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  283.             cout<<"kierunek Y reflektora : "<< fKierunek_reflektora[1]<<endl;
  284.         }
  285.         else
  286.         {
  287.         alfa += PI / 32;
  288.         pointz = skok_point * cos (alfa) + eyez;
  289.         pointy = skok_point * sin (alfa) + eyey;
  290.                     fKierunek_reflektora[1] = pointy;
  291.                     fKierunek_reflektora[2] = pointz;
  292.             glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora);
  293.             cout<<"kierunek Y reflektora : "<< fKierunek_reflektora[1]<<endl;
  294.         }
  295.         break;
  296.     }
  297.  
  298.     Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
  299. }
  300.  
  301. void TimerFunction (int value)
  302. {
  303.     glutPostRedisplay ();
  304.     glutTimerFunc(3, TimerFunction, 1);
  305.     angleA+=1.0;
  306.  
  307. }
  308. static void idle(void)
  309. {
  310.     glutPostRedisplay();
  311. }
  312.  
  313. const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
  314. const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
  315. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  316. const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
  317.  
  318.  
  319.  
  320. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
  321. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
  322. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
  323. const GLfloat high_shininess[] = { 100.0f };
  324.  
  325. void Menu (int value)
  326. {
  327.     switch (value)
  328.     {
  329.     case EXIT:
  330.         exit (0);
  331.         case REFLEKTOR:
  332.         glDisable(GL_LIGHT0);
  333.         glEnable(GL_LIGHTING);
  334.         glEnable(GL_LIGHT1);
  335.         break;
  336.         case SWIATLO_OGOLNE:
  337.         glDisable(GL_LIGHT1);
  338.         glEnable(GL_LIGHT0);
  339.     }
  340.  
  341.  
  342. }
  343. void resh(int value)
  344. {
  345.     switch (value)
  346.     {
  347.     case ORTO:
  348.         rzut=ORTO;
  349.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  350.         break;
  351.     case FRUST:
  352.         rzut=FRUST;
  353.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  354.         break;
  355.     case PERSP:
  356.         rzut=PERSP;
  357.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  358.         break;
  359.     }
  360. }
  361. void skal(int value)
  362. {
  363.     switch (value)
  364.     {
  365.         case FULL_WINDOW:
  366.         skala=FULL_WINDOW;
  367.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  368.         break;
  369.         case ASPECT_1_1:
  370.         skala=ASPECT_1_1;
  371.         Reshape (glutGet (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
  372.         break;
  373.     }
  374. }
  375.  
  376. int main(int argc, char *argv[])
  377. {
  378.     cout<<"IDZ DO PRZODU - 'W'"<<endl;
  379.     cout<<"IDZ DO PRZODU - 'S'"<<endl;
  380.     cout<<"SPOJRZ W GORE - 'strzalka w gore'"<<endl;
  381.     cout<<"SPOJRZ W DOL - 'strzalka w dol'"<<endl;
  382.     cout<<"SPOJRZ W LEWO - 'strzalka w lewo'"<<endl;
  383.     cout<<"SPOJRZ W DOL - 'strzalka w prawo'"<<endl;
  384.  
  385.     rzut =FRUST;
  386.     glutInit(&argc, argv);
  387.     glutInitWindowSize(width,height);
  388.     glutInitWindowPosition(10,10);
  389.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  390.  
  391.     glutCreateWindow("GLUT Shapes");
  392.  
  393.     glutReshapeFunc(Reshape);
  394.     glutDisplayFunc(display);
  395.     glutKeyboardFunc(key);
  396.     glutSpecialFunc(SpecialKeys);
  397.     glutIdleFunc(idle);
  398.     glutTimerFunc (1000/60, TimerFunction, 0);
  399.     int sub1=glutCreateMenu(skal);
  400.         glutAddMenuEntry ("Rodzaj skalowania - cale okno",FULL_WINDOW);
  401.         glutAddMenuEntry ("Rodzaj skalowania - skala 1:1",ASPECT_1_1);
  402.     int sub2=glutCreateMenu(resh);
  403.     glutAddMenuEntry ("Rzutowanie ortogonalne", ORTO);
  404.     glutAddMenuEntry ("Rzutowanie frustum", FRUST);
  405.     glutAddMenuEntry ("Rzutowanie perspective", PERSP);
  406.     int mainmenu =glutCreateMenu(Menu);
  407.     glutAddSubMenu("Skalowanie",sub1);
  408.     glutAddSubMenu("Rzutowanie", sub2);
  409.     glutAddMenuEntry("Reflektor", REFLEKTOR);
  410.     glutAddMenuEntry("Swiatlo Ogolne", SWIATLO_OGOLNE);
  411.     glutAddMenuEntry ("Wyjscie",EXIT);
  412.     glutAttachMenu (GLUT_RIGHT_BUTTON);
  413.  
  414.     glClearColor(0,0,0,1);
  415.  
  416.     glEnable(GL_CULL_FACE);
  417.     glCullFace(GL_BACK);
  418.  
  419.     glEnable(GL_DEPTH_TEST);
  420.     glDepthFunc(GL_LESS);
  421.  
  422.     glEnable(GL_LIGHTING);
  423.     glEnable(GL_LIGHT1);
  424.     glEnable(GL_NORMALIZE);
  425.     glEnable(GL_COLOR_MATERIAL);
  426.     glEnable(GL_LIGHTING);
  427.  
  428.     glLightfv (GL_LIGHT0, GL_AMBIENT, fSlabe_swiatlo); // œwiat³o otoczenia
  429.     glLightfv (GL_LIGHT0, GL_DIFFUSE, fMocne_swiatlo); // œwiat³o rozproszenia
  430.     glLightfv (GL_LIGHT0, GL_SPECULAR, fMocne_swiatlo); // œwiat³o odbite
  431.     glLightfv (GL_LIGHT0, GL_POSITION, fPozycja_swiatla); // pozycja œwiat³a
  432.  
  433.     glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, frozwarcie); // reflektor o k¹cie rozwarcia 60 stopni
  434.     glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,fskupienie); // stopieñ skupienia reflektora
  435.  
  436.     glLightfv (GL_LIGHT1, GL_AMBIENT, fSlabe_swiatlo); // œwiat³o otoczenia
  437.     glLightfv (GL_LIGHT1, GL_DIFFUSE, fMocne_swiatlo); // œwiat³o rozproszenia
  438.     glLightfv (GL_LIGHT1, GL_SPECULAR, fMocne_swiatlo); // œwiat³o odbite
  439.     glLightfv (GL_LIGHT1, GL_POSITION, fPozycja_reflektora); // pozycja œwiat³a
  440.     glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, fKierunek_reflektora); // kierunek w który odwrócony jest reflektor
  441.  
  442. glMaterialfv (GL_FRONT, GL_AMBIENT, ambient_materials);
  443. glMaterialfv (GL_FRONT, GL_DIFFUSE, diffuse_materials);
  444. glMaterialfv (GL_FRONT, GL_SPECULAR, specular_materials);
  445. glMateriali (GL_FRONT, GL_SHININESS, shininess_materials);
  446.  
  447.  
  448.     glutMainLoop();
  449.  
  450.     return EXIT_SUCCESS;
  451. }
  452.  
Add Comment
Please, Sign In to add comment