Advertisement
annstasi

Untitled

Dec 14th, 2020
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.24 KB | None | 0 0
  1. #include<iostream>
  2. #include<math.h>
  3. #include <cmath>
  4. #include<time.h>
  5. #include<stdlib.h>
  6. #include <windows.h>
  7. #include<D:/GraphicProject/soil-master/include/SOIL/SOIL.h>
  8. #include <glut.h> //Подключение библиотеки glut.h
  9.  
  10. // угол поворота камеры
  11. float angle = 0.0;
  12. float rx = 1.0, ry = 1.0, rz = 1.0;
  13. // координаты вектора направления движения камеры
  14. float lx = 0.0f, lz = -1.0f;
  15. // XZ позиция камеры
  16. float x = 3.0f, z = 3.0f, dx = 0.01f, dz = 0.01f;
  17. //Ключи статуса камеры. Переменные инициализируются нулевыми значениями
  18. //когда клавиши не нажаты
  19. float deltaAngle = 0.0f;
  20. float deltaMove = 0;
  21. int counter = 0;
  22. GLuint texture;
  23. GLfloat treecolor[] = { 0.9, 0.6, 0.3, 0.8 };
  24. float pos0[] = { 0.0, 20.0, 1.0, 1.0 };
  25. float pos1[] = { 20.0, 10.0, 30.0, 1.0 };
  26. float direction[] = { 0.0, 0.0, -20.0 };
  27. float diffuseColor1[] = { 1.0, 1.0, 1.0, 1.0 };
  28. float ambientColor0[] = { 0.3, 0.3, 0.3, 1.0 };
  29. float diffuseColor0[] = { 1.0, 1.0, 1.0, 1.0 };
  30. // phisic
  31. int V = 1;
  32. int angleS = 30;
  33. float g = 9.8;
  34. float t = (2 * V * sin(angleS)) / g;
  35. float newY = 1.0;
  36. float newZ = 2.0;
  37. float tm = 0;
  38. bool checher = false;
  39. float newX = 0;
  40.  
  41. void changeSize(int w, int h) {
  42. // предотвращение деления на ноль
  43. if (h == 0)
  44. h = 1;
  45. float ratio = w * 1.0 / h;
  46. // используем матрицу проекции
  47. glMatrixMode(GL_PROJECTION);
  48. // обнуляем матрицу
  49. glLoadIdentity();
  50. // установить параметры вьюпорта
  51. glViewport(0, 0, w, h);
  52. // установить корректную перспективу
  53. gluPerspective(45.0f, ratio, 0.1f, 100.0f);
  54. // вернуться к матрице проекции
  55. glMatrixMode(GL_MODELVIEW);
  56. }
  57.  
  58. void drawSnowMan() {
  59. glColor3f(1.0 * rx, 1.0f * ry, 1.0 * rz);
  60. // тело снеговика
  61. glTranslatef(0.0f, 0.5f, 0.0f);
  62. glutSolidSphere(0.75f, 30, 30);
  63. // 2 тело снеговика
  64. glTranslatef(0.0f, 1.0f, 0.0f);
  65. glutSolidSphere(0.55f, 30, 30);
  66. // ruka снеговика
  67. glTranslatef(0.5f, 0.1f, 0.0f);
  68. glutSolidSphere(0.25f, 30, 30);
  69. // ruka снеговика
  70. glTranslatef(-1.0f, 0.0f, 0.0f);
  71. glutSolidSphere(0.25f, 30, 30);
  72. // голова снеговика
  73. glTranslatef(0.5f, 0.68f, 0.0f);
  74. glutSolidSphere(0.25f, 30, 30);
  75.  
  76. // глаза снеговика
  77. glPushMatrix();
  78. glColor3f(0.0f, 0.0f, 0.0f);
  79. glTranslatef(0.05f, 0.10f, 0.18f);
  80. glutSolidSphere(0.05f, 10, 10);
  81. glTranslatef(-0.1f, 0.0f, 0.0f);
  82. glutSolidSphere(0.05f, 30, 30);
  83. glPopMatrix();
  84. // нос снеговика
  85. glColor3f(1.0f, 0.5f, 0.5f);
  86. glRotatef(0.0f, 1.0f, 0.0f, 0.0f);
  87. glutSolidCone(0.08f, 0.5f, 10, 2);
  88. }
  89. void drawSnowMan2() {
  90. glColor3f(1.0f, 0.0f, 0.0f);
  91. // тело снеговика
  92. glTranslatef(0.0f, 0.5f, 0.0f);
  93. glutSolidSphere(0.75f, 30, 30);
  94. // 2 тело снеговика
  95. glTranslatef(0.0f, 1.0f, 0.0f);
  96. glutSolidSphere(0.55f, 30, 30);
  97. // ruka снеговика
  98. glTranslatef(0.5f, 0.1f, 0.0f);
  99. glutSolidSphere(0.25f, 30, 30);
  100. // ruka снеговика
  101. glTranslatef(-1.0f, 0.0f, 0.0f);
  102. glutSolidSphere(0.25f, 30, 30);
  103. // голова снеговика
  104. glTranslatef(0.5f, 0.68f, 0.0f);
  105. glutSolidSphere(0.25f, 30, 30);
  106.  
  107. // глаза снеговика
  108. glPushMatrix();
  109. glColor3f(1.0f, 0.0f, 0.0f);
  110. glTranslatef(0.05f, 0.10f, 0.18f);
  111. glutSolidSphere(0.05f, 10, 10);
  112. glTranslatef(-0.1f, 0.0f, 0.0f);
  113. glutSolidSphere(0.05f, 30, 30);
  114. glPopMatrix();
  115. // нос снеговика
  116. glColor3f(1.0f, 0.0f, 0.0f);
  117. glRotatef(0.0f, 1.0f, 0.0f, 0.0f);
  118. glutSolidCone(0.08f, 0.5f, 10, 2);
  119. }
  120.  
  121. void computePos(float deltaMove)
  122. {
  123. x += deltaMove * lx * 0.1f;
  124. z += deltaMove * lz * 0.1f;
  125.  
  126. }
  127.  
  128. void computeDir(float deltaAngle)
  129. {
  130. angle += deltaAngle;
  131. lx = sin(angle);
  132. lz = -cos(angle);
  133. }
  134.  
  135.  
  136.  
  137. //void texture1()
  138. //{
  139.  
  140. //glGenTextures(1, &texture);
  141. //glBindTexture(GL_TEXTURE_2D, texture);
  142. //int width, height;
  143. //unsigned char* tex_2d = SOIL_load_image("Sun_Texture.jpg", &width, &height, 0, SOIL_LOAD_RGB); // загрузка текстуры
  144. //glTexImage2D(GL_TEXTURE_2D, 0.0, GL_RGB, width, height, 0.0, GL_RGB, GL_UNSIGNED_BYTE, tex_2d);
  145. //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  146. //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  147.  
  148. //SOIL_free_image_data(tex_2d);
  149. //glBindTexture(GL_TEXTURE_2D, 0);
  150. //}
  151.  
  152.  
  153. void present() {
  154. glTranslatef(15.0, 2.0, 17.0);
  155. glColor3f(1.0 * rx, 1.0 * ry, 0.0 + rz);
  156. glutSolidCube(5.0);
  157. }
  158. void renderScene(void) {
  159. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  160. glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseColor0);
  161. glLightfv(GL_LIGHT0, GL_AMBIENT, ambientColor0);
  162. glLightfv(GL_LIGHT0, GL_POSITION, pos0);
  163. glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuseColor1);
  164. glLightfv(GL_LIGHT1, GL_POSITION, pos1);
  165. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction);
  166. glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 15.0);
  167. glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 120);
  168.  
  169.  
  170. if (deltaMove)
  171. computePos(deltaMove);
  172. if (deltaAngle)
  173. computeDir(deltaAngle);
  174. //очистить буфер цвета и глубины
  175. //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  176. // обнулить трансформацию
  177. glLoadIdentity();
  178. glColor3f(0.0, 0.0, 0.0);
  179. glBegin(GL_LINES);
  180. glVertex3f(-0.05, 0.0, -1.0);
  181. glVertex3f(0.05, 0.0, -1.0);
  182. glVertex3f(0.0, -0.05, -1.0);
  183. glVertex3f(0.0, 0.05, -1.0);
  184. glEnd();
  185.  
  186. /*glPushMatrix();
  187. glTranslatef(x, 1.0, z - 1.0);
  188. phisic();
  189. glPopMatrix();
  190. */
  191. // установить камеру
  192. gluLookAt(x, 1.0f, z,
  193. x - lx, 1.0f, z - lz,
  194. 0.0f, 1.0f, 0.0f);
  195. // нарисуем "землю"
  196. //sf
  197.  
  198. //std::cout << newY << " y";
  199. //std::cout << newZ << " z";
  200. if (checher) {
  201. glPushMatrix();
  202. glColor3f(1.0, 0.0, 0.0);
  203. glTranslatef(x - lx, 1.0, z - lz);
  204. glTranslatef(0, newY, newZ);
  205. glutSolidSphere(0.3, 30, 30);
  206. glPopMatrix();
  207. tm += 0.01;
  208. //if (z < 0 && x < 0) newZ = -(newZ + V * cos(angleS) * tm);
  209. newZ = (newZ + V * cos(angleS) * tm);
  210. newY = 1 + V * sin(angleS) * tm - (g * tm * tm) / 2;
  211. newX = sqrt(V * tm * V * tm - newZ * newZ) / 2;
  212. //if (angle > 3.14 / 2) newX = -newX;
  213. if (newY < -1) {
  214. tm = 0;
  215. newY = 1.0;
  216. newZ = 2.0;
  217. newX = 0;
  218. checher = false;
  219. }
  220. }
  221. //sf
  222. if (counter >= 5) {
  223. glPushMatrix();
  224. glTranslatef(1.5, 0.0, 5.0);
  225. present();
  226. glPopMatrix();
  227. }
  228. glBegin(GL_QUADS);// полигон с коондинатами
  229. glColor3f(0.5f, 0.5f, 0.5f);
  230. glVertex3f(-40.0f, 0.0f, -40.0f);
  231. glColor3f(0.5f, 0.5f, 0.5f);
  232. glVertex3f(-40.0f, 0.0f, 40.0f);
  233. glColor3f(0.5f, 0.5f, 0.5f);
  234. glVertex3f(40.0f, 0.0f, 40.0f);
  235. glColor3f(0.5f, 0.5f, 0.5f);
  236. glVertex3f(40.0f, 0.0f, -40.0f);
  237. glEnd();
  238.  
  239. glBindTexture(GL_TEXTURE_2D, texture);
  240. glBegin(GL_QUADS);
  241.  
  242. glTexCoord2f(0.0f, 0.0f); glVertex3f(-40.0f, 0.0f, -40.0f);
  243. glTexCoord2f(1.0f, 0.0f); glVertex3f(-40.0f, 20.0f, -40.0f);
  244. glTexCoord2f(1.0f, 1.0f); glVertex3f(40.0f, 20.0f, -40.0f);
  245. glTexCoord2f(0.0f, 1.0f); glVertex3f(40.0f, 0.0f, -40.0f);
  246.  
  247. glEnd();
  248.  
  249. glBindTexture(GL_TEXTURE_2D, 0);
  250. /*glBegin(GL_QUADS);// полигон с коондинатами
  251. glColor3f(0.0f, 0.0f, 0.7f);
  252. glVertex3f(-40.0f, 0.0f, -40.0f);
  253. glColor3f(0.0f, 0.0f, 0.7f);
  254. glVertex3f(-40.0f, 20.0f, -40.0f);
  255. glColor3f(0.0f, 0.0f, 0.7f);
  256. glVertex3f(40.0f, 20.0f, -40.0f);
  257. glColor3f(0.0f, 0.0f, 0.7f);
  258. glVertex3f(40.0f, 0.0f, -40.0f);
  259. glEnd();*/
  260.  
  261. glBegin(GL_QUADS);// полигон с коондинатами
  262. glColor3f(0.0f, 0.0f, 0.8f);
  263. glVertex3f(40.0f, 0.0f, -40.0f);
  264. glColor3f(0.0f, 0.0f, 0.8f);
  265. glVertex3f(40.0f, 20.0f, -40.0f);
  266. glColor3f(0.0f, 0.0f, 0.8f);
  267. glVertex3f(40.0f, 20.0f, 40.0f);
  268. glColor3f(0.0f, 0.0f, 0.8f);
  269. glVertex3f(40.0f, 0.0f, 40.0f);
  270. glEnd();
  271.  
  272. glBegin(GL_QUADS);// полигон с коондинатами
  273. glColor3f(0.0f, 0.0f, 0.9f);
  274. glVertex3f(-40.0f, 0.0f, -40.0f);
  275. glColor3f(0.0f, 0.0f, 0.9f);
  276. glVertex3f(-40.0f, 20.0f, -40.0f);
  277. glColor3f(0.0f, 0.0f, 0.9f);
  278. glVertex3f(-40.0f, 20.0f, 40.0f);
  279. glColor3f(0.0f, 0.0f, 0.9f);
  280. glVertex3f(-40.0f, 0.0f, 40.0f);
  281. glEnd();
  282.  
  283. glBegin(GL_QUADS);// полигон с коондинатами
  284. glColor3f(0.0f, 0.0f, 1.0f);
  285. glVertex3f(-40.0f, 20.0f, -40.0f);
  286. glColor3f(0.0f, 0.0f, 1.0f);
  287. glVertex3f(40.0f, 20.0f, -40.0f);
  288. glColor3f(0.0f, 0.0f, 1.0f);
  289. glVertex3f(40.0f, 20.0f, 40.0f);
  290. glColor3f(0.0f, 0.0f, 1.0f);
  291. glVertex3f(-40.0f, 20.0f, 40.0f);
  292. glEnd();
  293. /*glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, treecolor);
  294. glPushMatrix();
  295. glTranslatef(2.6f, 1.0f, 3.2f);
  296. glRotatef(0.0f, 5.0f, 0.0f, 0.0f);
  297. glutSolidCone(0.5, 0.5, 20, 20);
  298. glTranslatef(0.0, 1.0 , 0.3);
  299. glRotatef(0.0f, 5.0f, 0.0f, 0.0f);
  300. glutSolidCone(0.4, 0.4, 20, 20);
  301. glTranslatef(0.0f, 1.0f, 0.3f);
  302. glScalef(0.0f, 0.0f, 0.0f);
  303. glutSolidCone(0.3f, 0.3f, 20, 20);
  304. glPopMatrix(); */
  305.  
  306.  
  307.  
  308. // Нарисуем 49 снеговика
  309. for (int i = -4; i < 3; ++i) {
  310. for (int j = -4; j < 3; ++j) {
  311. glPushMatrix();
  312. glTranslatef(i * 5.0, 0, j * 5.0);
  313. drawSnowMan();
  314. glPopMatrix();
  315. }
  316. }
  317. glFlush();
  318. glutSwapBuffers();
  319. }
  320.  
  321.  
  322. void pressKey(int key, int xx, int yy) {
  323.  
  324. switch (key) {
  325. case GLUT_KEY_LEFT:
  326. deltaAngle = -0.01f;
  327. break;
  328. case GLUT_KEY_RIGHT:
  329. deltaAngle = 0.01f;
  330. break;
  331. case GLUT_KEY_UP:
  332. deltaMove = -3.2f;
  333. break;
  334. case GLUT_KEY_DOWN:
  335. deltaMove = 3.2f;
  336. break;
  337. case GLUT_KEY_INSERT:
  338. exit(1);
  339. break;
  340. }
  341. }
  342. void timerF(int = 0) {
  343. renderScene();
  344. glutTimerFunc(1, timerF, 0);
  345.  
  346. }
  347.  
  348. void releaseKey(int key, int x, int y) {
  349.  
  350. switch (key) {
  351. case GLUT_KEY_LEFT:
  352. case GLUT_KEY_RIGHT:
  353. deltaAngle = 0.0f;
  354. break;
  355. case GLUT_KEY_UP:
  356. case GLUT_KEY_DOWN:
  357. deltaMove = 0;
  358. break;
  359. }
  360. }
  361.  
  362.  
  363. void mouseButton(int button, int state, int x, int y) {
  364. if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  365. srand(time(NULL));
  366. counter++;
  367. checher = true;
  368. rx = (rand() % 100) / (100 * 1.0);
  369. ry = (rand() % 100) / (100 * 1.0);
  370. rz = (rand() % 100) / (100 * 1.0);
  371. glutPostRedisplay();
  372. }
  373. }
  374.  
  375.  
  376. int main(int argc, char** argv) {
  377.  
  378. // инициализация GLUT и создание окна
  379. glutInit(&argc, argv);
  380. glutInitDisplayMode(GLUT_DEPTH | GLUT_RGBA);
  381. glutInitWindowPosition(100, 100);
  382. glutInitWindowSize(400, 400);
  383. glutCreateWindow("Урок 6");
  384. glClearColor(0.1, 0.1, 0.15, 0.0);
  385. glMatrixMode(GL_PROJECTION);
  386. glLoadIdentity();
  387. glOrtho(-500, 500, -500, 500, -500, 500);
  388. // регистрация вызовов
  389. glutDisplayFunc(renderScene);
  390. glEnable(GL_DEPTH_TEST);
  391. glEnable(GL_LIGHTING);
  392. glEnable(GL_COLOR_MATERIAL);
  393. glEnable(GL_TEXTURE_2D);
  394. glColor3f(1.0, 0.0, 0.0);
  395. glEnable(GL_LIGHT0);
  396. glEnable(GL_LIGHT1);
  397. glutMouseFunc(mouseButton);
  398. //glutDisplayFunc(Draw);
  399. //texture1();
  400. glutReshapeFunc(changeSize);
  401. glutIdleFunc(renderScene);
  402. glutSpecialFunc(pressKey);
  403. glutTimerFunc(30, timerF, 0);
  404.  
  405. // Новые функции для регистрации
  406. glutIgnoreKeyRepeat(1);
  407. glutSpecialUpFunc(releaseKey);
  408. // OpenGL - инициализация функции теста
  409. glEnable(GL_DEPTH_TEST);
  410. // главный цикл
  411.  
  412. glutMainLoop();
  413.  
  414. return 1;
  415. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement