Advertisement
Guest User

Untitled

a guest
Jan 24th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 20.05 KB | None | 0 0
  1. /*
  2. Zadanie 17
  3. Materiały:
  4. 1.  Właściwości materiału nr 1:     fioletowy błyszczący (widziany w białym świetle),
  5. 2.  Właściwości materiału nr 2:     zielony matowy (widziany w białym świetle),
  6. 3.  Właściwości materiału nr 3:     jadeit
  7.  
  8. Źródła światła:
  9. Źródło nr 1:
  10. -   typ: reflektor (ang. spot),
  11. -   kolor: biały,
  12. -   natężenie: 1,
  13. -   kąt odcięcia: 30o,
  14. -   położenie: zmienne po orbicie kołowej o środku w punkcie S(0,0,0) z możliwością interaktywnej zmiany następujących parametrów:
  15. o   promienia orbity,
  16. o   prędkości kątowej (3 różne prędkości),
  17. o   kąta nachylenia orbity do osi OX,
  18. -   kierunek świecenia: na obiekt.
  19.  
  20. Źródło nr 2:
  21. -   typ: kierunkowe,
  22. -   kolor: żółty,
  23. -   natężenie: 0.7,
  24. -   położenie: stałe w punkcie P(-10,1 0, 10) układu współrzędnych sceny.
  25. -   kierunek świecenia: na obiekt.
  26. */
  27.  
  28. //////////////////////////////////////////////////////////////////////////////////////////
  29. //
  30. // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
  31. // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
  32. //
  33. //////////////////////////////////////////////////////////////////////////////////////////
  34. #include <GL/glut.h>
  35. #include <math.h>
  36.  
  37.  
  38. // Definicja stalych
  39. #define DLUGOSC_BOKU            5.0
  40. #define OBSERWATOR_ODLEGLOSC    20.0
  41. #define OBSERWATOR_OBROT_X      20.0
  42. #define OBSERWATOR_OBROT_Y      20.0
  43. #define OBSERWATOR_FOV_Y        30.0  
  44. #define X_OFFSET_OBIEKT     10
  45. #define Y_OFFSET_OBIEKT     300
  46.  
  47. #define ID_MENU_SWIATLA     0
  48. #define ID_MENU_MATERIALU   1
  49. #define LPOZ_MENU_SWIATLA   10
  50. #define LPOZ_MENU_MATERIALU 5
  51.  
  52. #define PI 3.1415926535
  53. #define DEG2RAD(x) ((float)(x)*PI/180.0)
  54. #define dAlfa   (360.0/N)
  55. // Zmienne globalne
  56. double N = 8;
  57. double  bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  58. int     szerokoscOkna = 800;
  59. int     wysokoscOkna = 600;
  60. int q = 0;
  61. int r = 0;
  62. int po = 0;
  63. int op = 0;
  64. int p;
  65. double promien_obrotu = 10;
  66. GLfloat predkosc_katowa = 1;
  67. GLfloat predkosc = 0.1;
  68. GLfloat kat_nachylenia = 0;
  69. GLfloat odleglosc = -100.0;
  70. GLfloat min = -10.0;
  71. GLfloat max = -300.0;
  72.  
  73. GLfloat ob0x = 20.0;
  74. GLfloat ob0y = 20.0;
  75. GLfloat ob0z = 0.0;
  76.  
  77. int     menu;              // Identyfikator wybranego menu (menu swiatla lub menu materialu)
  78.  
  79. // Prototypy funkcji
  80. void RysujSzescian(double a);
  81. void UstawParametryWidoku(int szer, int wys);
  82. void WyswietlObraz(void);
  83. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  84.  
  85. void RysujTekstRastrowy(void *font, char *tekst)
  86. {
  87.     int i;
  88.     for (i = 0; i < (int)strlen(tekst); i++)
  89.         glutBitmapCharacter(font, tekst[i]);
  90. }
  91.  
  92.  
  93. void RysujNakladke(void)
  94. {
  95.     char buf[255];
  96.  
  97.     // Zmiana typu rzutu z perspektywicznego na ortogonalny
  98.     glMatrixMode(GL_PROJECTION);
  99.     glPushMatrix();
  100.     glLoadIdentity();
  101.     glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  102.  
  103.     // Modelowanie sceny 2D (zawartosci nakladki)
  104.     glMatrixMode(GL_MODELVIEW);
  105.     glPushMatrix();
  106.     glLoadIdentity();
  107.  
  108.     // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  109.     glDisable(GL_LIGHTING);
  110.  
  111.     // Okreslenie koloru tekstu
  112.     glColor3f(1.0, 1.0, 1.0);
  113.  
  114.     // RYSOWANIE MENU PARAMETROW WALCA
  115.  
  116.     glColor3f(1.0, 1.0, 1.0);
  117.  
  118.     //sprintf(buf, "Walec:");
  119.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT);
  120.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "MENU");
  121.  
  122.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 30);
  123.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zwieksz promien orbity (>)");
  124.  
  125.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 40);
  126.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz promien orbity (<)");
  127.  
  128.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 50);
  129.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Material 1 (1)");
  130.  
  131.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 60);
  132.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Material 2 (2)");
  133.  
  134.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 70);
  135.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Material 3 (3)");
  136.  
  137.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 80);
  138.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "glShadeModel(GL_FLAT) (h)");
  139.  
  140.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 90);
  141.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "glShadeModel(GL_SMOOTH) (j)");
  142.  
  143.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 100);
  144.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz liczbe podzialow bryly (z)");
  145.  
  146.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 110);
  147.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz liczbe podzialow bryly (x)");
  148.  
  149.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 120);
  150.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Rysuj wektory normalne (k)");
  151.  
  152.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 130);
  153.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Ukryj wektory normalne (l)");
  154.  
  155.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 140);
  156.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmien tryb rysowania na GL_FILL (O)");
  157.  
  158.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 150);
  159.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmien tryb rysowania na GL_LINE (P)");
  160.  
  161.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 160);
  162.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wlacz swiatlo nr 1 (4)");
  163.  
  164.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 170);
  165.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wylacz swiatlo nr 1 (5)");
  166.  
  167.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 180);
  168.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wlacz swiatlo nr 2 (6)");
  169.  
  170.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 190);
  171.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wylacz swiatlo nr 2 (7)");
  172.  
  173.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 200);
  174.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "1 predkosc swiatla (b)");
  175.  
  176.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 210);
  177.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "2 predkosc swiatla (n)");
  178.  
  179.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 220);
  180.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "3 predkosc swiatla (m)");
  181.  
  182.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 230);
  183.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zwiększ kąt nachylenia swiatla (N)");
  184.  
  185.     glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 240);
  186.     RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz kąt nachylenia swiatla (M)");
  187.  
  188.  
  189.  
  190.     // Przywrocenie macierzy sprzed wywolania funkcji
  191.     glMatrixMode(GL_PROJECTION);
  192.     glPopMatrix();
  193.     glMatrixMode(GL_MODELVIEW);
  194.     glPopMatrix();
  195.  
  196.     // Odblokowanie oswietlenia
  197.     glEnable(GL_LIGHTING);
  198. }
  199. //////////////////////////////////////////////////////////////////////////////////////////
  200. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  201. // Srodek szescianu znajduje się w punkcie (0,0,0).
  202. void RysujSzescian(double a)
  203. {
  204.     // Sciany boczne
  205.     glColor3f(1, 1, 0);
  206.     glBegin(GL_QUAD_STRIP);
  207.     glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  208.     glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  209.     glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  210.     glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  211.  
  212.     glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  213.     glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  214.  
  215.     glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  216.     glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  217.  
  218.     glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  219.     glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  220.     glEnd();
  221.  
  222.     // Gorna sciana
  223.     glColor3f(1, 0, 0);
  224.     glBegin(GL_QUAD_STRIP);
  225.     glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  226.     glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  227.     glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  228.     glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  229.     glEnd();
  230.  
  231.     // Dolna sciana
  232.     glColor3f(1, 0, 0);
  233.     glBegin(GL_QUAD_STRIP);
  234.     glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  235.     glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  236.     glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  237.     glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  238.     glEnd();
  239.  
  240. }
  241.  
  242. void wlaczswiatlo1()
  243. {
  244.     GLfloat swiatlo[5][4] = { {0.0, 0.0, 0.0, 0.7},   //[0] światło otoczenia
  245.                               {1.0, 1.0, 0, 1.0},     //[1] światło rozproszone
  246.                               {1.0, 1.0, 0, 1.0},     //[2] światło zwierciadlane
  247.                               {-10, 10, 10, 0} };   //[3] położenie
  248.                             //  {10, -10, -10, 1} }; //[4] kierunek świecenia
  249.  
  250.     glEnable(GL_LIGHTING);
  251.  
  252.     glEnable(GL_LIGHT1);
  253.  
  254.     glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo[0]);
  255.     glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo[1]);
  256.     glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo[2]);
  257.     glLightfv(GL_LIGHT1, GL_POSITION, swiatlo[3]);
  258.     //glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo[4]);
  259.  
  260. }
  261.  
  262. void wlaczswiatlo2()
  263. {
  264.     GLfloat x, y, z;
  265.    
  266.         predkosc_katowa += predkosc;
  267.  
  268.     x = promien_obrotu * cos(DEG2RAD(predkosc_katowa*dAlfa));
  269.     z = promien_obrotu * sin(DEG2RAD(predkosc_katowa*dAlfa));
  270.     y = promien_obrotu * sin(DEG2RAD(kat_nachylenia*dAlfa));
  271.  
  272.     GLfloat swiatlo[5][4] = { {0.0, 0.0, 0.0, 1.0},   //[0] światło otoczenia
  273.                               {1.0, 1.0, 1.0, 1.0},   //[1] światło rozproszone
  274.                               {0.540000, 0.540000, 0.540000, 0.540000},   //[2] światło zwierciadlane
  275.                               {x, y, z, 1},   //[3] położenie
  276.                               {-x, -y, -z, 1} }; //[4] kierunek świecenia
  277.  
  278.     glEnable(GL_LIGHTING);
  279.  
  280.     glEnable(GL_LIGHT1);
  281.  
  282.     glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo[0]);
  283.     glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo[1]);
  284.     glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo[2]);
  285.     glLightfv(GL_LIGHT1, GL_POSITION, swiatlo[3]);
  286.     glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo[4]);
  287.  
  288. }
  289.  
  290.  
  291. void ustawmaterial1() { //1.    Właściwości materiału nr 1:     fioletowy błyszczący (widziany w białym świetle),
  292.     float material[5][4] = { {0, 0, 0, 1},      //[0] współczynnik odbicia światła otoczenia
  293.                               {0.8, 0.49, 0.96, 1},   //[1] współczynnik odbicia światła rozproszonego
  294.                               {0.75, 0.011, 1, 1},    //[2] współczynnik odbicia światła lustrzanego
  295.                               {100, 0, 0, 0},             //[3] połysk
  296.                              {0, 0, 0, 0} };    //[4] kolor światła emitowanego
  297.  
  298.     glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
  299.     glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
  300.     glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
  301.     glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
  302.     glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
  303.  
  304. }
  305.  
  306. void ustawmaterial2() { //2.    Właściwości materiału nr 2:     zielony matowy (widziany w białym świetle),
  307.     float material[5][4] = { {0, 0, 0, 0},    //[0] współczynnik odbicia światła otoczenia
  308.                               {0.540000, 0.958, 0.540000, 0.540000},      //[1] współczynnik odbicia światła rozproszonego
  309.                               {0.0042, 0.005400, 0.0042, 0.0042},     //[2] współczynnik odbicia światła lustrzanego
  310.                               {0.0042, 0, 0, 0},   //[3] połysk
  311.                               {0, 0, 0, 0} }; //[4] kolor światła emitowanego
  312.  
  313.     glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
  314.     glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
  315.     glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
  316.     glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
  317.     glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
  318.  
  319. }
  320.  
  321. void ustawmaterial3() { //3.    Właściwości materiału nr 3:     jadeit
  322.     float material[5][4] = { {0.135000, 0.222500, 0.157500, 0.950000},    //[0] współczynnik odbicia światła otoczenia
  323.                               {0.540000, 0.890000, 0.630000, 0.950000},   //[1] współczynnik odbicia światła rozproszonego
  324.                               {0.316228, 0.316228, 0.316228, 0.950000},   //[2] współczynnik odbicia światła lustrzanego
  325.                               {12.8, 0, 0, 0},                            //[3] połysk
  326.                               {0, 0, 0, 0} };             //[4] kolor światła emitowanego
  327.  
  328.     glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
  329.     glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
  330.     glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
  331.     glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
  332.     glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
  333.  
  334. }
  335.  
  336. void stozek() {
  337.  
  338.     float R = 10.0;
  339.     float r = 15.0;
  340.     float h = 15.0;
  341.     int i;
  342.     glBegin(GL_TRIANGLE_FAN);
  343.     glColor3f(1.0, 0.0, 0.0);
  344.     glVertex3f(0.0, 0.0, 0.0);
  345.     for (i = 0; i*dAlfa <= 360.0; i++)
  346.     {
  347.         glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
  348.     }
  349.     glEnd();
  350.  
  351.     glBegin(GL_TRIANGLE_FAN);
  352.     glColor3f(1.0, 0.0, 0.0);
  353.     glVertex3f(0.0, h, 0.0);
  354.     for (i = 0; i*dAlfa <= 360.0; i++)
  355.     {
  356.         glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
  357.     }
  358.     glEnd();
  359.  
  360.     glBegin(GL_TRIANGLE_STRIP);
  361.     glColor3f(0.0, 1.0, 0.0);
  362.     for (i = 0; i*dAlfa <= 360.0; i++)
  363.     {
  364.         glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
  365.         glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
  366.     }
  367.     glEnd();
  368.  
  369. }
  370.  
  371. void swiatlo(int q) {
  372.     if (q == 1) {
  373.         wlaczswiatlo2();
  374.     }
  375.     if (q == 2) {
  376.         wlaczswiatlo1();
  377.     }
  378.  
  379.     if (q == 0) {
  380.         glDisable(GL_LIGHTING);
  381.     }
  382. }
  383.  
  384. void material(int p) {
  385.     if (p == 1) {
  386.         ustawmaterial1();
  387.     }
  388.  
  389.     if (p == 2) {
  390.         ustawmaterial2();
  391.     }
  392.  
  393.     if (p == 3) {
  394.         ustawmaterial3();
  395.     }
  396.  
  397. }
  398.  
  399.  
  400. //7.(Y3)    stożek ścięty w trybie GL_QUAD_STRIP o promieniu dolnej podstawy 3 i jej środku
  401. //w punkcie (0, 0, 0), oraz promieniu górnej podstawy 1, wysokości 2.
  402.  
  403. void stozek3() {
  404.  
  405.     float R = 3.0;
  406.     float r = 1.0;
  407.     float h = 2.0;
  408.     float i, j;
  409.     float x, y, z, R1 = R;
  410.  
  411.     swiatlo(q);
  412.     material(p);
  413.  
  414.     glBegin(GL_TRIANGLE_FAN);
  415.     glNormal3f(0, -1, 0);
  416.     glColor3f(0.0, 1.0, 0.0);
  417.     glVertex3f(0.0, 0.0, 0.0);
  418.     for (i = 0; i*dAlfa <= 360.0; i++)
  419.     {
  420.         glNormal3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
  421.         glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
  422.     }
  423.     glEnd();
  424.  
  425.     glBegin(GL_TRIANGLE_FAN);
  426.     glNormal3f(0, 1, 0);
  427.     glColor3f(0.0, 1.0, 0.0);
  428.     glVertex3f(0.0, h, 0.0);
  429.     for (i = 0; i*dAlfa <= 360.0; i++)
  430.     {
  431.         glNormal3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
  432.         glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
  433.     }
  434.     glEnd();
  435.  
  436.     glColor3f(1.0, 0.0, 0.0);
  437.  
  438.     for (y = 0; (y <= h) && (R1 >= r); y += h / N, R1 -= ((R - r) / N)) {
  439.         for (i = 0.0; i*dAlfa < 360; i++) {
  440.             glBegin(GL_QUAD_STRIP);
  441.             x = R1 * cos(DEG2RAD(i*dAlfa));
  442.             z = R1 * sin(DEG2RAD(i*dAlfa));
  443.             glNormal3f(x, y, z);
  444.             glVertex3f(x, y, z);
  445.  
  446.             if (y + h / N < h) {
  447.                 x = (R1 - ((R - r) / N)) * cos(DEG2RAD(i*dAlfa));
  448.                 z = (R1 - ((R - r) / N)) * sin(DEG2RAD(i*dAlfa));
  449.                 glNormal3f(x, (y + h / N), z);
  450.                 glVertex3f(x, (y + h / N), z);
  451.             }
  452.  
  453.             else {
  454.                 x = r * cos(DEG2RAD(i*dAlfa));
  455.                 z = r * sin(DEG2RAD(i*dAlfa));
  456.                 glNormal3f(x, h, z);
  457.                 glVertex3f(x, h, z);
  458.             }
  459.  
  460.             i++;
  461.  
  462.             x = R1 * cos(DEG2RAD(i*dAlfa));
  463.             z = R1 * sin(DEG2RAD(i*dAlfa));
  464.             glVertex3f(x, y, z);
  465.  
  466.             if (y + h / N < h) {
  467.                 x = (R1 - ((R - r) / N)) * cos(DEG2RAD(i*dAlfa));
  468.                 z = (R1 - ((R - r) / N)) * sin(DEG2RAD(i*dAlfa));
  469.                 glVertex3f(x, (y + h / N), z);
  470.             }
  471.  
  472.             else {
  473.                 x = r * cos(DEG2RAD(i*dAlfa));
  474.                 z = r * sin(DEG2RAD(i*dAlfa));
  475.                 glVertex3f(x, h, z);
  476.             }
  477.  
  478.             i--;
  479.  
  480.             glNormal3f(cos(DEG2RAD(i*dAlfa)), (y + h / N), sin(DEG2RAD(i*dAlfa)));
  481.  
  482.             glEnd();
  483.         }
  484.     }
  485.  
  486.  
  487.  
  488. }
  489.  
  490. void norstozek3() {
  491.  
  492.     float R = 3.0;
  493.     float r = 1.0;
  494.     float h = 2.0;
  495.     float i, j;
  496.     float x, y, z, R1 = R;
  497.  
  498.  
  499.  
  500.     glBegin(GL_LINES);
  501.     glColor3f(1, 1, 1);
  502.     glVertex3f(0, 0, 0);
  503.     glVertex3f(0, -1, 0);
  504.     for (i = 0; i*dAlfa <= 360.0; i++)
  505.     {
  506.         glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
  507.         glVertex3f(R*cos(DEG2RAD(i*dAlfa)), -1, R*sin(DEG2RAD(i*dAlfa)));
  508.     }
  509.     glEnd();
  510.  
  511.     glBegin(GL_LINES);
  512.     glColor3f(1, 1, 1);
  513.     glVertex3f(0, h, 0);
  514.     glVertex3f(0, h + 1, 0);
  515.     for (i = 0; i*dAlfa <= 360.0; i++)
  516.     {
  517.         glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
  518.         glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h + 1, r*sin(DEG2RAD(i*dAlfa)));
  519.     }
  520.     glEnd();
  521.  
  522.  
  523.  
  524.     glColor3f(1, 1, 1);
  525.  
  526.  
  527.  
  528.  
  529.  
  530.     for (y = 0; (y <= h) && (R1 >= r); y += h / N, R1 -= ((R - r) / N)) {
  531.         for (i = 0.0; i*dAlfa < 360; i++) {
  532.             glBegin(GL_LINES);
  533.             x = R1 * cos(DEG2RAD(i*dAlfa));
  534.             z = R1 * sin(DEG2RAD(i*dAlfa));
  535.             glVertex3f(x, y, z);
  536.             glVertex3f(x + cos(DEG2RAD(i*dAlfa)), y + 1, z + sin(DEG2RAD(i*dAlfa)));
  537.  
  538.             if (y + h / N < h) {
  539.                 x = (R1 - ((R - r) / N)) * cos(DEG2RAD(i*dAlfa));
  540.                 z = (R1 - ((R - r) / N)) * sin(DEG2RAD(i*dAlfa));
  541.                 glVertex3f(x, (y + h / N), z);
  542.                 glVertex3f(x + cos(DEG2RAD(i*dAlfa)), (y + h / N) + 1, z + sin(DEG2RAD(i*dAlfa)));
  543.             }
  544.  
  545.             else {
  546.                 x = r * cos(DEG2RAD(i*dAlfa));
  547.                 z = r * sin(DEG2RAD(i*dAlfa));
  548.                 glVertex3f(x, h, z);
  549.                 glVertex3f(x + cos(DEG2RAD(i*dAlfa)), h + 1, z + sin(DEG2RAD(i*dAlfa)));
  550.             }
  551.  
  552.  
  553.  
  554.             glEnd();
  555.         }
  556.     }
  557.  
  558.  
  559.  
  560. }
  561.  
  562.  
  563. //////////////////////////////////////////////////////////////////////////////////////////
  564. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  565. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  566. void UstawParametryWidoku(int szer, int wys)
  567. {
  568.     // Zapamietanie wielkosci widoku
  569.     szerokoscOkna = szer;
  570.     wysokoscOkna = wys;
  571.  
  572.     // Ustawienie parametrow viewportu
  573.     glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  574.  
  575.     // Przejscie w tryb modyfikacji macierzy rzutowania
  576.     glMatrixMode(GL_PROJECTION);
  577.     glLoadIdentity();
  578.     gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  579. }
  580.  
  581.  
  582. //////////////////////////////////////////////////////////////////////////////////////////
  583. // Funkcja wyswietlajaca pojedyncza klatke animacji
  584. void WyswietlObraz(void)
  585. {
  586.     if (po == 0) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  587.     else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  588.  
  589.     if (op == 0) glShadeModel(GL_FLAT);
  590.     else glShadeModel(GL_SMOOTH);
  591.  
  592.     // Wyczyszczenie bufora koloru i bufora glebokosci
  593.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  594.  
  595.     // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  596.     glMatrixMode(GL_MODELVIEW);
  597.  
  598.     // Zastapienie aktywnej macierzy macierza jednostkowa
  599.     glLoadIdentity();
  600.  
  601.     // Ustalenie polozenia obserwatora
  602.     glTranslatef(0, 0, odleglosc);
  603.     glRotatef(ob0x, 1, 0, 0);
  604.     glRotatef(ob0y, 0, 1, 0);
  605.     glRotatef(ob0z, 0, 0, 1);
  606.  
  607.     // uklad();
  608.  
  609.      // Narysowanie szescianu
  610.     // RysujSzescian(bok);
  611.     if (r == 1) norstozek3();
  612.     stozek3();
  613.  
  614.     // Narysowanie tekstow z opisem parametrow oswietlenia i materialu
  615.     RysujNakladke();
  616.  
  617.     // Przelaczenie buforow ramki
  618.     glutSwapBuffers();
  619. }
  620.  
  621.  
  622. //////////////////////////////////////////////////////////////////////////////////////////
  623. // Funkcja obslugi klawiatury
  624. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  625. {
  626.     if (klawisz == '-')
  627.     {
  628.         if (odleglosc - 1 < max);
  629.         else
  630.         {
  631.             odleglosc -= 5;
  632.         }
  633.     }
  634.     else if (klawisz == '+')
  635.     {
  636.         if (odleglosc + 1 > min);
  637.         else
  638.         {
  639.             odleglosc += 5;
  640.         }
  641.     }
  642.  
  643.     else if (klawisz == 'w')
  644.         ob0x++;
  645.  
  646.     else if (klawisz == 's')
  647.         ob0x--;
  648.  
  649.     else if (klawisz == 'a')
  650.         ob0y++;
  651.  
  652.     else if (klawisz == 'd')
  653.         ob0y--;
  654.  
  655.     else if (klawisz == 'q')
  656.         ob0z++;
  657.  
  658.     else if (klawisz == 'e')
  659.         ob0z--;
  660.  
  661.     else if (klawisz == 'z')
  662.     {
  663.         if (N - 1 < 4);
  664.         else
  665.         {
  666.             N -= 1;
  667.         }
  668.     }
  669.     else if (klawisz == 'x')
  670.     {
  671.         if (N + 1 > 64);
  672.         else
  673.         {
  674.             N += 1;
  675.         }
  676.     }
  677.  
  678.     else if (klawisz == '4')
  679.         q = 1;
  680.     else if (klawisz == '5')
  681.         q = 0;
  682.     else if (klawisz == '6')
  683.         q = 2;
  684.     else if (klawisz == '7')
  685.         q = 0;
  686.  
  687.     else if (klawisz == 'k')
  688.         r = 1;
  689.     else if (klawisz == 'l')
  690.         r = 2;
  691.  
  692.     else if (klawisz == '1')
  693.         p = 1;
  694.     else if (klawisz == '2')
  695.         p = 2;
  696.     else if (klawisz == '3')
  697.         p = 3;
  698.     else if (klawisz == '#')
  699.         p = 0;
  700.     else if (klawisz == 'O')
  701.         po = 0;
  702.     else if (klawisz == 'P')
  703.         po = 1;
  704.     else if (klawisz == 'h')
  705.         op = 0;
  706.     else if (klawisz == 'j')
  707.         op = 1;
  708.  
  709.     else if (klawisz == '<')
  710.         promien_obrotu -= 1;
  711.  
  712.     else if (klawisz == '>')
  713.         promien_obrotu += 1;
  714.  
  715.     else if (klawisz == 'b')
  716.         predkosc = 0.01;
  717.  
  718.     else if (klawisz == 'n')
  719.         predkosc = 0.1;
  720.  
  721.     else if (klawisz == 'm')
  722.         predkosc = 0.5;
  723.  
  724.     else if (klawisz == 'N')
  725.         kat_nachylenia += 1;
  726.  
  727.     else if (klawisz == 'M')
  728.         kat_nachylenia -= 1;
  729.    
  730.     else if (klawisz == 27)
  731.         exit(0);
  732. }
  733.  
  734.  
  735. //////////////////////////////////////////////////////////////////////////////////////////
  736. // Glowna funkcja programu
  737. int  main(int argc, char **argv)
  738. {
  739.     // Zainicjowanie biblioteki GLUT
  740.     glutInit(&argc, argv);
  741.  
  742.     // Ustawienie trybu wyswietlania
  743.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  744.  
  745.     // Ustawienie polozenia dolenego lewego rogu okna
  746.     glutInitWindowPosition(100, 100);
  747.  
  748.     // Ustawienie rozmiarow okna
  749.     glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  750.  
  751.     // Utworzenie okna
  752.     glutCreateWindow("Szescian");
  753.  
  754.     // Odblokowanie bufora glebokosci
  755.     glEnable(GL_DEPTH_TEST);
  756.  
  757.     // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  758.     glClearDepth(1000.0);
  759.  
  760.     // Ustawienie koloru czyszczenia bufora ramki
  761.     glClearColor(0.0f, 0.0f, 0.3f, 0.0f);
  762.  
  763.     // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  764.  
  765.  
  766.  
  767.     // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  768.     glutDisplayFunc(WyswietlObraz);
  769.  
  770.     // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  771.     // zmieniane sa rozmiary okna
  772.     glutReshapeFunc(UstawParametryWidoku);
  773.  
  774.     // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  775.     // zadnych zadan
  776.     glutIdleFunc(WyswietlObraz);
  777.  
  778.     // Zarejestrowanie funkcji obslugi klawiatury
  779.     glutKeyboardFunc(ObslugaKlawiatury);
  780.  
  781.     // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  782.     // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  783.     glutMainLoop();
  784.  
  785.     return 0;
  786. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement