Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.50 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. #pragma region Zmienne globalne
  4.  
  5. SCameraState player;
  6.  
  7. double T = 0.0;
  8.  
  9. int mouseX = 0; // aktualna pozycja kursora myszy (x)
  10. int mouseY = 0; // aktualna pozycja kursora myszy (y)
  11.  
  12. bool captureMouse = true; // czy przechwytywać kursor myszy?
  13. bool free3DMovement = false; // czy pozwolić na ruch w 3D?
  14.  
  15. float mouseSensitivity = .15f; // czułość na ruchy kursora myszy
  16.  
  17. #pragma endregion
  18. void walec(float a, float b, float c) {
  19.  
  20. glPushMatrix();
  21.  
  22. glTranslatef(a, b, c);
  23. glScalef(0.5f, 0.5f, 0.5f);
  24.  
  25. float m2_amb[] = { 0.2f, 0.5f, 0.8f };
  26. float m2_dif[] = { 0.2f, 0.5f, 0.8f };
  27. float m2_spe[] = { 0.0f, 0.0f, 0.0f };
  28. glMaterialfv(GL_FRONT, GL_AMBIENT, m2_amb);
  29. glMaterialfv(GL_FRONT, GL_DIFFUSE, m2_dif);
  30. glMaterialfv(GL_FRONT, GL_SPECULAR, m2_spe);
  31.  
  32. int Np = 20;
  33.  
  34. // Powierzchnia boczna
  35. glBegin(GL_QUAD_STRIP);
  36. for (int i = 0; i <= Np / 2; ++i) {
  37. float x = sin(2.0f * PI * ((float)i / Np));
  38. float z = cos(2.0f * PI * ((float)i / Np));
  39. glNormal3f(z, x, 0.0f);
  40. glVertex3f(z, x, 1.0f);
  41. glNormal3f(z, x, 0.0f);
  42. glVertex3f(z, x, -1.0f);
  43. }
  44. glEnd();
  45.  
  46. // Podstawa gorna
  47. glBegin(GL_TRIANGLE_FAN);
  48. glNormal3f(0.0f, 0.0f, 1.0f);
  49. glVertex3f(0.0f, 0.0f, 1.0f);
  50. for (int i = 0; i <= Np / 2; ++i) {
  51. float x = sin(2.0f * PI * ((float)i / Np));
  52. float z = cos(2.0f * PI * ((float)i / Np));
  53. glNormal3f(0.0f, 0.0f, 1.0f);
  54. glVertex3f(z, x, 1.0f);
  55. }
  56. glEnd();
  57. glBegin(GL_QUADS);
  58. glNormal3f(0.0f, 0.0f, 1.0f);
  59. glVertex3f(1.0f, -1.0f, 1.0f);
  60. glVertex3f(1.0f, 0.0f, 1.0f);
  61. glVertex3f(-1.0f, 0.0f, 1.0f);
  62. glVertex3f(-1.0f, -1.0f, 1.0f);
  63. glEnd();
  64.  
  65. // Podstawa dolna
  66. glBegin(GL_TRIANGLE_FAN);
  67. glNormal3f(0.0f, 0.0f, -1.0f);
  68. glVertex3f(0.0f, 0.0f, -1.0f);
  69. for (int i = Np / 2; i >= 0; --i) {
  70. float x = sin(2.0f * PI * ((float)i / Np));
  71. float z = cos(2.0f * PI * ((float)i / Np));
  72. glNormal3f(0.0f, -1.0f, 0.0f);
  73. glVertex3f(z, x, -1.0f);
  74. }
  75. glEnd();
  76. glBegin(GL_QUADS);
  77. glNormal3f(0.0f, 0.0f, -1.0f);
  78. glVertex3f(-1.0f, -1.0f, -1.0f);
  79. glVertex3f(-1.0f, 0.0f, -1.0f);
  80. glVertex3f(1.0f, 0.0f, -1.0f);
  81. glVertex3f(1.0f, -1.0f, -1.0f);
  82. glEnd();
  83. glBegin(GL_QUADS);
  84. glNormal3f(-1.0f, 0.0f, 0.0f);
  85. glVertex3f(-1.0f, -1.0f, 1.0f);
  86. glVertex3f(-1.0f, 0.0f, 1.0f);
  87. glVertex3f(-1.0f, 0.0f, -1.0f);
  88. glVertex3f(-1.0f, -1.0f, -1.0f);
  89. glEnd();
  90. glBegin(GL_QUADS);
  91. glNormal3f(1.0f, 0.0f, 0.0f);
  92. glVertex3f(1.0f, -1.0f, -1.0f);
  93. glVertex3f(1.0f, 0.0f, -1.0f);
  94. glVertex3f(1.0f, 0.0f, 1.0f);
  95. glVertex3f(1.0f, -1.0f, 1.0f);
  96.  
  97.  
  98.  
  99. glEnd();
  100. glPopMatrix();
  101. }
  102. int main(int argc, char* argv[])
  103. {
  104. glutInit(&argc, argv);
  105.  
  106. glutInitWindowPosition(100, 100);
  107. glutInitWindowSize(640, 360);
  108. glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
  109.  
  110. glutCreateWindow("GKiW: Lab 4");
  111.  
  112. glutDisplayFunc(OnRender);
  113. glutReshapeFunc(OnReshape);
  114. glutKeyboardFunc(OnKeyPress);
  115. glutKeyboardUpFunc(OnKeyUp);
  116. glutPassiveMotionFunc(OnMouseMove);
  117. glutMotionFunc(OnMouseMove);
  118. glutTimerFunc(17, OnTimer, 0);
  119.  
  120. glEnable(GL_DEPTH_TEST);
  121.  
  122. glDisable(GL_CULL_FACE); // Włączenie cullingu - rysowania tylko jednej strony wielokątów
  123. glCullFace(GL_BACK); // Określenie, którą stronę wielokątów chcemy ukrywać
  124. glFrontFace(GL_CCW); // Określenie, jaki kierunek definicji wierzchołków oznacza przód wielokątu (GL_CCW - przeciwnie do ruchu wskazówek zegara, GL_CW - zgodnie)
  125.  
  126. glEnable(GL_LIGHTING);
  127. glEnable(GL_LIGHT0);
  128. glEnable(GL_LIGHT1);
  129.  
  130. float gl_amb[] = { 0.0f, 0.0f, 0.0f, 1.0f };
  131. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, gl_amb);
  132.  
  133. player.pos.x = 0.0f;
  134. player.pos.y = 1.0f;
  135. player.pos.z = 4.0f;
  136.  
  137. player.dir.x = 0.0f;
  138. player.dir.y = 0.0f;
  139. player.dir.z = -1.0f;
  140.  
  141. player.speed = .4f;
  142.  
  143. // Ustawienie obsługi myszy
  144. glutWarpPointer(glutGet(GLUT_WINDOW_WIDTH) / 2, glutGet(GLUT_WINDOW_HEIGHT) / 2); // Przesunięcie kursora na środek ekranu
  145. mouseX = glutGet(GLUT_WINDOW_WIDTH) / 2;
  146. mouseY = glutGet(GLUT_WINDOW_HEIGHT) / 2;
  147. glutSetCursor(GLUT_CURSOR_NONE); // Ukrycie kursora
  148.  
  149. glutMainLoop();
  150.  
  151. return 0;
  152. }
  153.  
  154. #pragma region Obsluga wejscia
  155.  
  156. bool keystate[255];
  157.  
  158. void OnKeyPress(unsigned char key, int x, int y) {
  159. if (!keystate[key]) {
  160. keystate[key] = true;
  161. OnKeyDown(key, x, y);
  162. }
  163. }
  164.  
  165. void OnKeyDown(unsigned char key, int x, int y) {
  166. if (key == 27) {
  167. glutLeaveMainLoop();
  168. }
  169. if (key == 'm' || key == 'M') { // Włączenie/wyłączenie przechwytywania kursora myszy - "uwalnia" mysz
  170. if (captureMouse) {
  171. captureMouse = false;
  172. glutSetCursor(GLUT_CURSOR_LEFT_ARROW);
  173. }
  174. else {
  175. captureMouse = true;
  176. glutWarpPointer(glutGet(GLUT_WINDOW_WIDTH) / 2, glutGet(GLUT_WINDOW_HEIGHT) / 2);
  177. glutSetCursor(GLUT_CURSOR_NONE);
  178. }
  179. }
  180. if (key == 'l' || key == 'L') { // "Odklejenie" kamery od podłogi
  181. free3DMovement = !free3DMovement;
  182. }
  183. }
  184.  
  185. void OnKeyUp(unsigned char key, int x, int y) {
  186. keystate[key] = false;
  187. }
  188.  
  189. // Zapamiętanie pozycji kursora myszy w momencie, gdy następuje jego przesunięcie.
  190. // Zapamiętana pozycja jest później "konsumowana" przez OnTimer().
  191. void OnMouseMove(int x, int y) {
  192. mouseX = x;
  193. mouseY = y;
  194. }
  195.  
  196. #pragma endregion
  197.  
  198. void OnTimer(int id) {
  199.  
  200. glutTimerFunc(17, OnTimer, 0);
  201.  
  202. #pragma region Ruch kamery
  203.  
  204. if (captureMouse) {
  205. player.velRY = -mouseSensitivity * (glutGet(GLUT_WINDOW_WIDTH) / 2 - mouseX);
  206. player.velRX = mouseSensitivity * (glutGet(GLUT_WINDOW_HEIGHT) / 2 - mouseY);
  207. glutWarpPointer(glutGet(GLUT_WINDOW_WIDTH) / 2, glutGet(GLUT_WINDOW_HEIGHT) / 2);
  208. }
  209.  
  210. if (keystate['w']) {
  211. player.velM = player.speed;
  212. }
  213. if (keystate['s']) {
  214. player.velM = -player.speed;
  215. }
  216. if (keystate['a']) {
  217. player.velS = -player.speed;
  218. }
  219. if (keystate['d']) {
  220. player.velS = player.speed;
  221. }
  222. if (keystate['q']) {
  223. player.velRY = -player.speed;
  224. }
  225. if (keystate['e']) {
  226. player.velRY = player.speed;
  227. }
  228. if (keystate['f']) {
  229. player.velRX = -player.speed;
  230. }
  231. if (keystate['c']) {
  232. player.velRX = player.speed;
  233. }
  234.  
  235. // Obrót kamery (wsp. sferyczne):
  236. float T = acos(player.dir.y);
  237. float G = atan2(player.dir.z, player.dir.x);
  238. T -= player.velRX * .03f;
  239. G += player.velRY * .03f;
  240. player.dir.x = sin(T) * cos(G);
  241. player.dir.y = cos(T);
  242. player.dir.z = sin(T) * sin(G);
  243.  
  244. // Wektor prostopadły:
  245. vec3 per;
  246. per.x = -player.dir.z;
  247. per.y = 0;
  248. per.z = player.dir.x;
  249.  
  250. // Ruch przod/tyl:
  251. player.pos.x += player.dir.x * player.velM * .1f;
  252. if (free3DMovement) {
  253. player.pos.y += player.dir.y * player.velM * .1f;
  254. }
  255. else {
  256. player.pos.y = 1.0f;
  257. }
  258. player.pos.z += player.dir.z * player.velM * .1f;
  259.  
  260. // Ruch na boki:
  261. player.pos.x += per.x * player.velS * .1f;
  262. if (free3DMovement) {
  263. player.pos.y += player.dir.y * player.velM * .1f;
  264. }
  265. else {
  266. player.pos.y = 1.0f;
  267. }
  268. player.pos.z += per.z * player.velS * .1f;
  269.  
  270. // Inercja:
  271. player.velRX /= 1.2;
  272. player.velRY /= 1.2;
  273. player.velM /= 1.2;
  274. player.velS /= 1.2;
  275.  
  276. #pragma endregion
  277. }
  278.  
  279. void OnRender() {
  280.  
  281. T = glutGet(GLUT_ELAPSED_TIME);
  282.  
  283. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  284. glMatrixMode(GL_MODELVIEW);
  285. glLoadIdentity();
  286.  
  287. gluLookAt(
  288. player.pos.x, player.pos.y, player.pos.z,
  289. player.pos.x + player.dir.x, player.pos.y + player.dir.y, player.pos.z + player.dir.z,
  290. 0.0f, 1.0f, 0.0f
  291. );
  292.  
  293. #pragma region Swiatlo
  294. float l0_amb[] = { 0.2f, 0.2f, 0.2f };
  295. float l0_dif[] = { 0.6f, 0.6f, 0.6f };
  296. float l0_spe[] = { 1.0f, 1.0f, 1.0f };
  297. float l0_pos[] = { 1.0f, 5.0f, 4.0f, 1.0f };
  298. glLightfv(GL_LIGHT0, GL_AMBIENT, l0_amb);
  299. glLightfv(GL_LIGHT0, GL_DIFFUSE, l0_dif);
  300. glLightfv(GL_LIGHT0, GL_SPECULAR, l0_spe);
  301. glLightfv(GL_LIGHT0, GL_POSITION, l0_pos);
  302. #pragma endregion
  303.  
  304.  
  305.  
  306. #pragma region Walec
  307. walec(1.5, 0.5, 0.0);
  308. walec(-1.5, 0.5, -1.0);
  309.  
  310. #pragma endregion
  311.  
  312. #pragma region Sciany
  313.  
  314. glBegin(GL_QUADS);
  315.  
  316. #pragma region Przednia sciana
  317. {
  318. float m_amb[] = { 1.0f, 1.0f, 1.0f };
  319. float m_dif[] = { 1.0f, 1.0f, 1.0f };
  320. float m_spe[] = { 0.0f, 0.0f, 0.0f };
  321. glMaterialfv(GL_FRONT, GL_AMBIENT, m_amb);
  322. glMaterialfv(GL_FRONT, GL_DIFFUSE, m_dif);
  323. glMaterialfv(GL_FRONT, GL_SPECULAR, m_spe);
  324.  
  325. glNormal3f(0.0f, 0.0f, 1.0f);
  326. glVertex3f(-5.0f, 5.0f, -5.0f);
  327.  
  328. glNormal3f(0.0f, 0.0f, 1.0f);
  329. glVertex3f(-5.0f, 0.0f, -5.0f);
  330.  
  331. glNormal3f(0.0f, 0.0f, 1.0f);
  332. glVertex3f(5.0f, 0.0f, -5.0f);
  333.  
  334. glNormal3f(0.0f, 0.0f, 1.0f);
  335. glVertex3f(5.0f, 5.0f, -5.0f);
  336. }
  337. #pragma endregion
  338.  
  339. #pragma region Lewa sciana
  340. {
  341. float m_amb[] = { 1.0f, 0.0f, 0.0f };
  342. float m_dif[] = { 1.0f, 0.0f, 0.0f };
  343. float m_spe[] = { 0.0f, 0.0f, 0.0f };
  344. glMaterialfv(GL_FRONT, GL_AMBIENT, m_amb);
  345. glMaterialfv(GL_FRONT, GL_DIFFUSE, m_dif);
  346. glMaterialfv(GL_FRONT, GL_SPECULAR, m_spe);
  347.  
  348. glNormal3f(1.0f, 0.0f, 0.0f);
  349. glVertex3f(-5.0f, 0.0f, -5.0f);
  350.  
  351. glNormal3f(1.0f, 0.0f, 0.0f);
  352. glVertex3f(-5.0f, 5.0f, -5.0f);
  353.  
  354. glNormal3f(1.0f, 0.0f, 0.0f);
  355. glVertex3f(-5.0f, 5.0f, 5.0f);
  356.  
  357. glNormal3f(1.0f, 0.0f, 0.0f);
  358. glVertex3f(-5.0f, 0.0f, 5.0f);
  359. }
  360. #pragma endregion
  361.  
  362. #pragma region Prawa sciana
  363. {
  364. float m_amb[] = { 0.0f, 1.0f, 0.0f };
  365. float m_dif[] = { 0.0f, 1.0f, 0.0f };
  366. float m_spe[] = { 0.0f, 0.0f, 0.0f };
  367. glMaterialfv(GL_FRONT, GL_AMBIENT, m_amb);
  368. glMaterialfv(GL_FRONT, GL_DIFFUSE, m_dif);
  369. glMaterialfv(GL_FRONT, GL_SPECULAR, m_spe);
  370.  
  371. glNormal3f(-1.0f, 0.0f, 0.0f);
  372. glVertex3f(5.0f, 5.0f, -5.0f);
  373.  
  374. glNormal3f(-1.0f, 0.0f, 0.0f);
  375. glVertex3f(5.0f, 0.0f, -5.0f);
  376.  
  377. glNormal3f(-1.0f, 0.0f, 0.0f);
  378. glVertex3f(5.0f, 0.0f, 5.0f);
  379.  
  380. glNormal3f(-1.0f, 0.0f, 0.0f);
  381. glVertex3f(5.0f, 5.0f, 5.0f);
  382. }
  383. #pragma endregion
  384.  
  385. #pragma region Tylna sciana
  386. {
  387. float m_amb[] = { 1.0f, 1.0f, 1.0f };
  388. float m_dif[] = { 1.0f, 1.0f, 1.0f };
  389. float m_spe[] = { 0.0f, 0.0f, 0.0f };
  390. glMaterialfv(GL_FRONT, GL_AMBIENT, m_amb);
  391. glMaterialfv(GL_FRONT, GL_DIFFUSE, m_dif);
  392. glMaterialfv(GL_FRONT, GL_SPECULAR, m_spe);
  393.  
  394. glNormal3f(0.0f, 0.0f, -1.0f);
  395. glVertex3f(-5.0f, 0.0f, 5.0f);
  396.  
  397. glNormal3f(0.0f, 0.0f, -1.0f);
  398. glVertex3f(-5.0f, 5.0f, 5.0f);
  399.  
  400. glNormal3f(0.0f, 0.0f, -1.0f);
  401. glVertex3f(5.0f, 5.0f, 5.0f);
  402.  
  403. glNormal3f(0.0f, 0.0f, -1.0f);
  404. glVertex3f(5.0f, 0.0f, 5.0f);
  405. }
  406. #pragma endregion
  407.  
  408. #pragma region Podloga
  409. {
  410. float m_amb[] = { 1.0f, 1.0f, 1.0f };
  411. float m_dif[] = { 1.0f, 1.0f, 1.0f };
  412. float m_spe[] = { 0.0f, 0.0f, 0.0f };
  413. glMaterialfv(GL_FRONT, GL_AMBIENT, m_amb);
  414. glMaterialfv(GL_FRONT, GL_DIFFUSE, m_dif);
  415. glMaterialfv(GL_FRONT, GL_SPECULAR, m_spe);
  416.  
  417. glNormal3f(0.0f, 1.0f, 0.0f);
  418. glVertex3f(-5.0f, 0.0f, -5.0f);
  419.  
  420. glNormal3f(0.0f, 1.0f, 0.0f);
  421. glVertex3f(-5.0f, 0.0f, 5.0f);
  422.  
  423. glNormal3f(0.0f, 1.0f, 0.0f);
  424. glVertex3f(5.0f, 0.0f, 5.0f);
  425.  
  426. glNormal3f(0.0f, 1.0f, 0.0f);
  427. glVertex3f(5.0f, 0.0f, -5.0f);
  428. }
  429. #pragma endregion
  430.  
  431. #pragma region Sufit
  432. {
  433. float m_amb[] = { 1.0f, 1.0f, 1.0f };
  434. float m_dif[] = { 1.0f, 1.0f, 1.0f };
  435. float m_spe[] = { 0.0f, 0.0f, 0.0f };
  436. glMaterialfv(GL_FRONT, GL_AMBIENT, m_amb);
  437. glMaterialfv(GL_FRONT, GL_DIFFUSE, m_dif);
  438. glMaterialfv(GL_FRONT, GL_SPECULAR, m_spe);
  439.  
  440. glNormal3f(0.0f, -1.0f, 0.0f);
  441. glVertex3f(-5.0f, 5.0f, 5.0f);
  442.  
  443. glNormal3f(0.0f, -1.0f, 0.0f);
  444. glVertex3f(-5.0f, 5.0f, -5.0f);
  445.  
  446. glNormal3f(0.0f, -1.0f, 0.0f);
  447. glVertex3f(5.0f, 5.0f, -5.0f);
  448.  
  449. glNormal3f(0.0f, -1.0f, 0.0f);
  450. glVertex3f(5.0f, 5.0f, 5.0f);
  451. }
  452. #pragma endregion
  453.  
  454. glEnd();
  455.  
  456. #pragma endregion
  457.  
  458. glutSwapBuffers();
  459. glFlush();
  460. glutPostRedisplay();
  461.  
  462. }
  463.  
  464. void OnReshape(int width, int height) {
  465. glMatrixMode(GL_PROJECTION);
  466. glLoadIdentity();
  467. glViewport(0, 0, width, height);
  468. gluPerspective(60.0f, (float)width / height, .01f, 100.0f);
  469. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement