Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.19 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <GL/glut.h>
  5.  
  6. char key[256] = { 0 }; /* Хранит флаги о нажатых кнопках */
  7.  
  8. /* Наша матрица позиции камеры */
  9. /* В начале инициализируем в единичную */
  10. /* Т.е. перемещаем камеру в координаты 0 по X и 0 по Y */
  11. /* Направленную вдоль оси -Z */
  12. GLdouble matrix_camera[4][4] = {
  13. { 1.0, 0.0, 0.0, 0.0 },
  14. { 0.0, 1.0, 0.0, 0.0 },
  15. { 0.0, 0.0, 1.0, 0.0 },
  16. { 0.0, 0.0, 0.0, 1.0 },
  17. };
  18.  
  19. void MatrixPrint(GLdouble (*m)[4])
  20. {
  21. printf(
  22. "%12.5lf %12.5lf %12.5lf %12.5lf\n"
  23. "%12.5lf %12.5lf %12.5lf %12.5lf\n"
  24. "%12.5lf %12.5lf %12.5lf %12.5lf\n"
  25. "%12.5lf %12.5lf %12.5lf %12.5lf\n"
  26. , m[0][0], m[1][0], m[2][0], m[3][0]
  27. , m[0][1], m[1][1], m[2][1], m[3][1]
  28. , m[0][2], m[1][2], m[2][2], m[3][2]
  29. , m[0][3], m[1][3], m[2][3], m[3][3]
  30. );
  31. }
  32.  
  33. GLdouble h = 0.0;
  34.  
  35.  
  36. /* Обработчик события изменении размеров окна */
  37. /* Для инициализации матрицы проэкции */
  38. void Reshape(int width, int height)
  39. {
  40. glViewport(0, 0, width, height);
  41. glMatrixMode(GL_PROJECTION);
  42. glLoadIdentity();
  43. gluPerspective(45.0, ((GLdouble)width) / ((GLdouble)height), 0.1, 50.0);
  44. }
  45.  
  46. /* Обработчик управлении камеры */
  47. /* Проверяет нажатие клавиши и выполнении действия над ней */
  48. void Control()
  49. {
  50. char is_render = 0; /* Флаг перерисовке сцены */
  51. if (key[27] || key['q'] || key['Q']) exit(0); /* Если нажата клавиша Esc или клавиша Q, то выход */
  52. if (0
  53. || key['a'] || key['s'] || key['w'] || key['d']
  54. || key['o'] || key['p']
  55. || key['k'] || key['m']
  56. ) /* Клавиши управлением камеры */
  57. {
  58. glMatrixMode(GL_MODELVIEW); /* Выбираем модельную матрицу */
  59. glPushMatrix(); /* Сохраняем её содержимое */
  60. glLoadIdentity(); /* Подготавливаем её для формирования матрицы изменения положения */
  61. // glLoadMatrixd((GLdouble*)matrix_camera); /* Инициализируем текущим положением камеры */
  62. if (key['s']) { glRotated( 0.1, 1.0, 0.0, 0.0); is_render = 1; } /* Вращаем камеру вниз */
  63. if (key['w']) { glRotated(-0.1, 1.0, 0.0, 0.0); is_render = 1; } /* Вращаем камеру вверх */
  64. if (key['d']) { glRotated( 0.1, 0.0, 1.0, 0.0); is_render = 1; } /* Поворот камеры вправо */
  65. if (key['a']) { glRotated(-0.1, 0.0, 1.0, 0.0); is_render = 1; } /* Поворот камеры влево */
  66. if (key['p']) { glRotated( 0.1, 0.0, 0.0, 1.0); is_render = 1; } /* Наклон камеры вправо */
  67. if (key['o']) { glRotated(-0.1, 0.0, 0.0, 1.0); is_render = 1; } /* Наклон камеры влево */
  68. /* После таких не хитроумных изменений мы сформировали матрицу шага для камеры по нужным направлениям */
  69.  
  70. GLdouble a[3] = { matrix_camera[3][0], matrix_camera[3][1], matrix_camera[3][2] };
  71. matrix_camera[3][0] = matrix_camera[3][1] = matrix_camera[3][2] = 0.0;
  72.  
  73. glMultMatrixd((GLdouble*)matrix_camera); /* Происходит движение камеры */
  74.  
  75. glGetDoublev(GL_MODELVIEW_MATRIX, (GLdouble*)matrix_camera); /* Сохраняем новое положение камеры */
  76.  
  77. matrix_camera[3][0] = a[0];
  78. matrix_camera[3][1] = a[1];
  79. matrix_camera[3][2] = a[2];
  80.  
  81. glLoadIdentity(); /* Подготавливаем её для формирования матрицы изменения положения */
  82. if (key['k']) { glTranslated( 0.0, 0.0, 0.01); is_render = 1; } /* Движение камеры вперед */
  83. if (key['m']) { glTranslated( 0.0, 0.0, -0.01); is_render = 1; } /* Движение камеры назад */
  84. glMultMatrixd((GLdouble*)matrix_camera); /* Происходит движение камеры */
  85. glGetDoublev(GL_MODELVIEW_MATRIX, (GLdouble*)matrix_camera); /* Сохраняем новое положение камеры */
  86.  
  87. glPopMatrix(); /* Восстанавливаем предыдущее значение модельной матрицы */
  88. }
  89. if (0
  90. || key['-']
  91. || key['=']
  92. )
  93. {
  94. if (key['-']) h -= 1.0;
  95. if (key['=']) h += 1.0;
  96. is_render = 1;
  97. }
  98. if (is_render) glutPostRedisplay(); /* Если было движение! то перерисовываем дисплей */
  99. }
  100.  
  101. /* Обработчик от рисовки примитивов */
  102. void Display()
  103. {
  104. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Очищаем всё что намусорили */
  105. glMatrixMode(GL_MODELVIEW); /* Выбираем модельную матрицу */
  106. glPushMatrix();
  107. glLoadIdentity();
  108. glTranslated(0.0, 0.0, h);
  109. glMultMatrixd((GLdouble*)matrix_camera); /* Инициализируем текущим положением камеры */
  110.  
  111. GLdouble m[4][4];
  112. glGetDoublev(GL_MODELVIEW_MATRIX, (GLdouble*)m); /* Сохраняем новое положение камеры */
  113. MatrixPrint(m);printf("\n");
  114. printf("%12.5lf %12.5lf\n", h, sqrt(m[3][0] * m[3][0] + m[3][1] * m[3][1] + m[3][2] * m[3][2]));
  115.  
  116. /* для примера работоспособности нарисуем куб с разноцветными гранями */
  117. glBegin(GL_QUADS);
  118. /* -x */ glColor3d(1.0, 0.0, 0.0);glVertex3d(-1.0, -1.0, -1.0);glVertex3d(-1.0, 1.0, -1.0);glVertex3d(-1.0, 1.0, 1.0);glVertex3d(-1.0, -1.0, 1.0);
  119. /* +x */ glColor3d(1.0, 0.5, 0.5);glVertex3d( 1.0, -1.0, -1.0);glVertex3d( 1.0, 1.0, -1.0);glVertex3d( 1.0, 1.0, 1.0);glVertex3d( 1.0, -1.0, 1.0);
  120. /* -y */ glColor3d(0.0, 1.0, 0.0);glVertex3d(-1.0, -1.0, -1.0);glVertex3d( 1.0, -1.0, -1.0);glVertex3d( 1.0, -1.0, 1.0);glVertex3d(-1.0, -1.0, 1.0);
  121. /* +y */ glColor3d(0.5, 1.0, 0.5);glVertex3d(-1.0, 1.0, -1.0);glVertex3d( 1.0, 1.0, -1.0);glVertex3d( 1.0, 1.0, 1.0);glVertex3d(-1.0, 1.0, 1.0);
  122. /* -z */ glColor3d(0.0, 0.0, 1.0);glVertex3d(-1.0, -1.0, -1.0);glVertex3d( 1.0, -1.0, -1.0);glVertex3d( 1.0, 1.0, -1.0);glVertex3d(-1.0, 1.0, -1.0);
  123. /* +z */ glColor3d(0.5, 0.5, 1.0);glVertex3d(-1.0, -1.0, 1.0);glVertex3d( 1.0, -1.0, 1.0);glVertex3d( 1.0, 1.0, 1.0);glVertex3d(-1.0, 1.0, 1.0);
  124. glEnd();
  125.  
  126. glMatrixMode(GL_MODELVIEW); /* Выбираем модельную матрицу */
  127. glLoadIdentity();
  128. glTranslated(0.0, 0.0, -0.5);
  129.  
  130. glBegin(GL_LINES);
  131. glColor3d(1.0, 0.0, 0.0);glVertex3d(0.0, 0.0, 0.0);glVertex3d(matrix_camera[0][0], matrix_camera[0][1], matrix_camera[0][2]);
  132. glColor3d(0.0, 1.0, 0.0);glVertex3d(0.0, 0.0, 0.0);glVertex3d(matrix_camera[1][0], matrix_camera[1][1], matrix_camera[1][2]);
  133. glColor3d(0.0, 0.0, 1.0);glVertex3d(0.0, 0.0, 0.0);glVertex3d(matrix_camera[2][0], matrix_camera[2][1], matrix_camera[2][2]);
  134. glEnd();
  135.  
  136. glMatrixMode(GL_MODELVIEW); /* Выбираем модельную матрицу */
  137. glPopMatrix();
  138. glFinish(); /* Скажем OpenGL "выполняй!" */
  139. glutSwapBuffers(); /* Поменяем местами дисплеи */
  140. }
  141.  
  142. void KeyDown(unsigned char code, int x, int y) { key[code] = 1; } /* Обработчик регистрирует нажатие клавиши */
  143. void KeyUp (unsigned char code, int x, int y) { key[code] = 0; } /* Обработчик регистрирует отпускание клавиши */
  144.  
  145. int main(int argc, char** argv)
  146. {
  147. /* Скелет OpenGL */
  148. glutInit(&argc, argv);
  149. glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA | GLUT_STENCIL);
  150. glutInitWindowPosition(-1, -1);
  151. glutInitWindowSize(640, 480);
  152. glutCreateWindow("Camera");
  153. glutSetCursor(GLUT_CURSOR_NONE);
  154. glClearColor(0.1, 0.1, 0.1, 0.0);
  155.  
  156. glEnable(GL_DEPTH_TEST);
  157.  
  158. glutKeyboardFunc(KeyDown);
  159. glutKeyboardUpFunc(KeyUp);
  160.  
  161. glutIdleFunc(Control);
  162. glutDisplayFunc(Display);
  163. glutReshapeFunc(Reshape);
  164. glutMainLoop();
  165. return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement