Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.20 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <cstdlib>
  3. #include <GL/gl.h>
  4. #include <GL/glut.h>
  5. #include <ctime>
  6. #include <cmath>
  7. #include <iostream>
  8. #include <vector>
  9. using namespace std;
  10.  
  11.  
  12. typedef float point3[3];
  13. static GLfloat light_position[] = {10.0, 10.0, 10.0, 1.0};
  14. static GLfloat observerPosition[] = {0.0, 0.0, 15.0};
  15. static GLfloat thetaU = 1.0;
  16. static GLfloat thetaV = 1.0;
  17. static int buttonState = 0;
  18. static int xMousePosition = 0;
  19. static int xMousePositionDifference = 0;
  20. static int yMousePosition = 0;
  21. static int yMousePositionDifference = 0;
  22. static GLfloat xAngleInPixels;
  23. static GLfloat yAngleInPixels;
  24.  
  25. static GLfloat radiusStart = 15.0;
  26. static GLfloat raduisCurrent = 0.0;
  27. static GLfloat radiusDifference = 0.0;
  28.  
  29. float aspectRatio;
  30.  
  31. float randFloat(){
  32. return (float)(rand()%101/100.0F);
  33. }
  34. float xi(GLfloat u, GLfloat v){
  35. return (float)(radiusStart*cos(u)*cos(v));
  36. }
  37. float yi(int u, int v){
  38. return (float)(radiusStart*sin(v));
  39. }
  40. float zi(int u, int v){
  41. return (float)(radiusStart*sin(u)*cos(v));
  42. }
  43.  
  44. void Mouse(int btn, int state, int x, int y)
  45. {
  46.  
  47. if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  48. {
  49. xMousePosition = x;
  50. yMousePosition = y;
  51. buttonState = 1;
  52. }
  53. else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  54. {
  55. raduisCurrent = y;
  56. buttonState = 2;
  57. }
  58. else
  59. buttonState = 0;
  60. }
  61.  
  62.  
  63. void Motion( GLsizei x, GLsizei y )
  64. {
  65. xMousePositionDifference = x - xMousePosition;
  66. yMousePositionDifference = y - yMousePosition;
  67. radiusDifference = y - raduisCurrent;
  68. xMousePosition = x;
  69. yMousePosition = y;
  70. raduisCurrent = y;
  71. glutPostRedisplay();
  72. }
  73.  
  74. class Point{ //klasa Punkty posiadająca 6 pól typu float - te od polozenia (x,y,z) i koloru (r,g,b)
  75. public:
  76. float x,y,z,r,g,b;
  77. Point(float x,float y, float z){ //konstruktor punktu przypisujacy mu zadane koordynaty i losowe skladniki RGB
  78. this->x=x;
  79. this->y=y;
  80. this->z=z;
  81. this->r=randFloat();
  82. this->g=randFloat();
  83. this->b=randFloat();
  84. }
  85. Point(){
  86. }
  87. };
  88.  
  89.  
  90.  
  91. float x (float u, float v){ //wyliczenie wartosci funkcji x(u,v)
  92. return (float)(-90*pow(u,5)+225*pow(u,4)-270*pow(u,3)+180*pow(u,2)-45*u)*cos(M_PI*v);
  93. }
  94. float y (float u, float v){ //wyliczenie wartoscy funkcji y(u,v)
  95. return (160*pow(u,4)-320*pow(u,3)+160*pow(u,2))-5;
  96. }
  97.  
  98. float z (float u, float v){ //wyliczenie wartosci funkcji z(u,v)
  99. return (-90*pow(u,5)+225*pow(u,4)-270*pow(u,3)+180*pow(u,2)-45*u)*sin(M_PI*v);
  100. }
  101.  
  102. float xu(float u, float v)
  103. {
  104. return (-450*pow(u, 4) + 900*pow(u, 3) - 810*pow(u, 2) + 360*u - 45) * cos(M_PI * v);
  105. }
  106.  
  107. float xv(float u, float v)
  108. {
  109. return M_PI * (90*pow(u, 5) - 225*pow(u, 4) + 270*pow(u, 3) - 180*pow(u, 2) + 45*u) * sin(M_PI * v);
  110. }
  111.  
  112. float yu(float u, float v)
  113. {
  114. return (640*pow(u, 3) - 960*pow(u, 2) + 320*u);
  115. }
  116.  
  117. float yv(float u, float v)
  118. {
  119.  
  120. }
  121.  
  122. void Egg(int N){ //funkcja rysujaca jajko
  123.  
  124. //deklaracja tablicy punktow o rozmiarze N*N
  125. Point tablica[N][N];
  126.  
  127. //uzupelnienie tablice punktami
  128. for(int i=0;i<N;i++)
  129. for(int j=0;j<N;j++){
  130. float u = i / ((float)N - 1);
  131. float v =j / ((float)N - 1);
  132. tablica[i][j]=Point(x(u,v),y(u,v),z(u,v));
  133. }
  134.  
  135. for (int i = 0; i < N-1; i++)
  136. for (int j = 0; j < N-1; ++j)
  137. {
  138. glBegin(GL_TRIANGLES); //podobnie jak w przypdku wyzej, rysowanie trojkatych tworzacych
  139. glVertex3f(tablica[i][j].x,tablica[i][j].y ,tablica[i][j].z);
  140. glVertex3f(tablica[(i + 1)][j].x,tablica[(i + 1)][j].y, tablica[(i + 1) ][j].z);
  141. glVertex3f(tablica[(i + 1)][(j + 1) ].x, tablica[(i + 1) ][(j + 1) ].y, tablica[(i + 1) ][(j + 1) ].z);
  142. glVertex3f(tablica[i][j].x, tablica[i][j].y , tablica[i][j].z);
  143. glVertex3f(tablica[i][(j + 1) ].x, tablica[i][(j + 1) ].y, tablica[i][(j + 1) ].z);
  144. glVertex3f(tablica[(i + 1) ][(j + 1) ].x, tablica[(i + 1) ][(j + 1) ].y , tablica[(i + 1) ][(j + 1) ].z);
  145. glEnd();
  146. }
  147. }
  148.  
  149. void Axes(void) //funkcja rysująca układ współrzednych
  150. {
  151. point3 x_min = {-5.0, 0.0, 0.0};
  152. point3 x_max = { 5.0, 0.0, 0.0};
  153. // początek i koniec obrazu osi x
  154. point3 y_min = {0.0, -5.0, 0.0};
  155. point3 y_max = {0.0, 5.0, 0.0};
  156. // początek i koniec obrazu osi y
  157. point3 z_min = {0.0, 0.0, -5.0};
  158. point3 z_max = {0.0, 0.0, 5.0};
  159. // początek i koniec obrazu osi y
  160. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  161. glBegin(GL_LINES); // rysowanie osi x
  162. glVertex3fv(x_min);
  163. glVertex3fv(x_max);
  164. glEnd();
  165. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  166. glBegin(GL_LINES); // rysowanie osi y
  167. glVertex3fv(y_min);
  168. glVertex3fv(y_max);
  169. glEnd();
  170. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  171. glBegin(GL_LINES); // rysowanie osi z
  172. glVertex3fv(z_min);
  173. glVertex3fv(z_max);
  174. glEnd();
  175. }
  176.  
  177. void renderScene()
  178. {
  179. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  180. glLoadIdentity();
  181. if (buttonState == 1)
  182. {
  183. thetaU += xMousePositionDifference * xAngleInPixels * 0.1;
  184. thetaV += yMousePositionDifference * yAngleInPixels * 0.1;
  185. }
  186. if (buttonState == 2)
  187. {
  188. radiusStart += radiusDifference * yAngleInPixels;
  189. }
  190. gluLookAt(observerPosition[0], observerPosition[1], observerPosition[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  191. light_position[0] = radiusStart * cos(thetaU) * cos(thetaV);
  192. light_position[1] = radiusStart * sin(thetaV);
  193. light_position[2] = radiusStart * sin(thetaU) * cos(thetaV);
  194. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  195. Axes();
  196. Egg(50);
  197.  
  198.  
  199. glFlush();
  200. glutSwapBuffers();
  201. }
  202.  
  203. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  204. {
  205. // Przeliczenie zmiany ilości pikseli w ruchu myszy na stopnie
  206. xAngleInPixels = 360.0 / (float)horizontal;
  207. yAngleInPixels = 360.0 / (float)vertical;
  208.  
  209. // Przejście w tryb projekcji
  210. glMatrixMode(GL_PROJECTION);
  211.  
  212. // Czyszczenie macierzy bieżącej
  213. glLoadIdentity();
  214.  
  215. aspectRatio = (GLfloat)horizontal / (GLfloat)vertical;
  216.  
  217. // Ustawienie parametrów dla rzutu perspektywicznego
  218. gluPerspective(70, aspectRatio, 1.0, 30.0);
  219.  
  220. // Ustawienie okna widoku w zalezności od stostunku x i y okna
  221. if (horizontal <= vertical)
  222. {
  223. glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
  224. }
  225. else
  226. {
  227. glViewport((horizontal - vertical) / 2, 0, vertical, vertical);
  228. }
  229.  
  230. // Powrót do trybu modelu
  231. glMatrixMode(GL_MODELVIEW);
  232.  
  233. // Czyszczenie macierzy bieżącej
  234. glLoadIdentity();
  235. }
  236.  
  237. void initLight()
  238. {
  239. /*************************************************************************************/
  240.  
  241. // Definicja materiału z jakiego zrobiony jest czajnik
  242. // i definicja źródła światła
  243.  
  244. /*************************************************************************************/
  245.  
  246.  
  247. /*************************************************************************************/
  248. // Definicja materiału z jakiego zrobiony jest czajnik
  249.  
  250. GLfloat mat_ambient[] = {1.0, 1.0, 1.0, 1.0};
  251. // współczynniki ka =[kar,kag,kab] dla światła otoczenia
  252.  
  253. GLfloat mat_diffuse[] = {1.0, 1.0, 1.0, 1.0};
  254. // współczynniki kd =[kdr,kdg,kdb] światła rozproszonego
  255.  
  256. GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
  257. // współczynniki ks =[ksr,ksg,ksb] dla światła odbitego
  258.  
  259. GLfloat mat_shininess = {20.0};
  260. // współczynnik n opisujący połysk powierzchni
  261.  
  262.  
  263. /*************************************************************************************/
  264. // Definicja źródła światła
  265.  
  266.  
  267. // GLfloat light_position[] = {0.0, 0.0, 10.0, 1.0};
  268. // położenie źródła
  269.  
  270.  
  271. GLfloat light_ambient[] = {0.1, 0.1, 0.1, 1.0};
  272. // składowe intensywności świecenia źródła światła otoczenia
  273. // Ia = [Iar,Iag,Iab]
  274.  
  275. GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
  276. // składowe intensywności świecenia źródła światła powodującego
  277. // odbicie dyfuzyjne Id = [Idr,Idg,Idb]
  278.  
  279. GLfloat light_specular[]= {1.0, 1.0, 1.0, 1.0};
  280. // składowe intensywności świecenia źródła światła powodującego
  281. // odbicie kierunkowe Is = [Isr,Isg,Isb]
  282.  
  283. GLfloat att_constant = {1.0};
  284. // składowa stała ds dla modelu zmian oświetlenia w funkcji
  285. // odległości od źródła
  286.  
  287. GLfloat att_linear = {0.05};
  288. // składowa liniowa dl dla modelu zmian oświetlenia w funkcji
  289. // odległości od źródła
  290.  
  291. GLfloat att_quadratic = {0.001};
  292. // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji
  293. // odległości od źródła
  294.  
  295. /*************************************************************************************/
  296. // Ustawienie parametrów materiału i źródła światła
  297.  
  298. /*************************************************************************************/
  299. // Ustawienie patrametrów materiału
  300.  
  301.  
  302. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  303. glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  304. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  305. glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
  306.  
  307.  
  308. /*************************************************************************************/
  309. // Ustawienie parametrów źródła
  310.  
  311. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  312. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  313. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  314. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  315.  
  316. glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
  317. glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att_linear);
  318. glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att_quadratic);
  319.  
  320.  
  321. /*************************************************************************************/
  322. // Ustawienie opcji systemu oświetlania sceny
  323.  
  324. glShadeModel(GL_SMOOTH); // właczenie łagodnego cieniowania
  325. glEnable(GL_LIGHTING); // właczenie systemu oświetlenia sceny
  326. glEnable(GL_LIGHT0); // włączenie źródła o numerze 0
  327. glEnable(GL_DEPTH_TEST); // włączenie mechanizmu z-bufora
  328.  
  329. /*************************************************************************************/
  330. }
  331.  
  332. void myInit()
  333. {
  334. glClearColor(0.0F, 0.0F, 0.0F, 1.0F);
  335. initLight();
  336. }
  337.  
  338. int main(int argc, char *argv[])
  339. {
  340. srand((unsigned int)time(NULL));
  341. glutInit(&argc, argv);
  342. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  343. glutInitWindowSize(900, 900);
  344. glutCreateWindow("Oswietlenie");
  345. glEnable(GL_DEPTH_TEST);
  346. glutDisplayFunc(renderScene);
  347. glutReshapeFunc(ChangeSize);
  348. glutMouseFunc(Mouse);
  349. glutMotionFunc(Motion);
  350. myInit();
  351. glEnable(GL_DEPTH_TEST);
  352. glutMainLoop();
  353. return 0;
  354. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement