Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <windows.h>
- #include <iostream>
- #include "glut.h"
- float magic = 1.618033989f;
- float magic2 = 0.618033989f;
- float PI = 3.1415926535f;
- int faces[12][5] = {{ 0, 16, 2, 10, 8 }, { 0, 8, 4, 14, 12 }, { 16, 17, 1, 12, 0 }, { 1, 9, 11, 3, 17 },{ 1, 12, 14, 5, 9 }, { 2, 13, 15, 6, 10 }, { 13, 3, 17, 16, 2 }, { 3, 11, 7, 15, 13 }, { 4, 8, 10, 6, 18 }, { 14, 5, 19, 18, 4 }, { 5, 19, 7, 11, 9 }, { 15, 7, 19, 18, 6 }};
- double points[20][3] = {{ 1, 1, 1 }, { 1, 1, -1 }, { 1, -1, 1 }, { 1, -1, -1 }, { -1, 1, 1 }, { -1, 1, -1 }, { -1, -1, 1 }, { -1, -1, -1 }, { 0, magic2, magic }, { 0, magic2, -magic }, { 0, -magic2, magic }, { 0, -magic2, -magic }, { magic2, magic, 0 }, { magic2, -magic, 0 }, { -magic2, magic, 0 }, { -magic2, -magic, 0 }, { magic, 0, magic2 }, { magic, 0, -magic2 }, { -magic, 0, magic2 }, { -magic, 0, -magic2}};
- int angle = 0; // угол вращения
- bool flag = false; // флаг статуса отрисовки
- void init() {
- //rgb(248,227,220)
- glClearColor(0.97, 0.89, 0.86, 1.0); // цвет очистки буферов
- glEnable(GL_DEPTH_TEST); // включаем сортировку по глубине
- glShadeModel(GL_SMOOTH); // режим закрашивания: интерполируемые значения
- }
- void display() {
- flag = true; // мы еще рисуем
- glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // очистка рабочих буферов
- std::cout << light_sample << std::endl;
- glPushMatrix(); // начинаем матричные преобразования
- glRotatef(angle, 1, 1, 0); // матрица вращения
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // changed
- for (int i = 0; i < 12; i++) {
- glBegin(GL_TRIANGLE_FAN);
- for (int x = 0; x < 5; x++)
- glVertex3dv(points[faces[i][x]]);
- glEnd();
- glBegin(GL_LINE_STRIP); // changed
- for (int x = 0; x < 5; x++)
- glVertex3dv(points[faces[i][x]]);
- glVertex3dv(points[faces[i][0]]); // added
- glEnd();
- }
- glFlush();
- // прожектор
- // убывание интенсивности с расстоянием
- // отключено (по умолчанию)
- // половина угла при вершине 30 градусов
- // направление на центр плоскости
- float light3_diffuse[] = { 1.0, 0.33, 0.34, 1 };
- float light3_position[] = { 0.0, 0.0, 1.0, 1.0 };
- float light3_spot_direction[] = { 0.0, 0.0, -1.0 };
- float light3_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // колір дзеркального відображення
- glEnable(GL_LIGHT3);
- glLightfv(GL_LIGHT3, GL_DIFFUSE, light3_diffuse);
- glLightfv(GL_LIGHT3, GL_POSITION, light3_position);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light3_specular);
- glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 30);
- glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, light3_spot_direction);
- glEnable(GL_LIGHT5); // включаем источник света
- glEnable(GL_LIGHTING); // включаем освещение
- glPushMatrix(); // начинаем матричные преобразования
- glRotatef(angle, 1, 1, 0); // матрица вращения
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- for (int i = 0; i < 12; i++) {
- glBegin(GL_TRIANGLE_FAN);
- for (int x = 0; x < 5; x++)
- glVertex3dv(points[faces[i][x]]);
- glEnd();
- glBegin(GL_LINE_STRIP);
- for (int x = 0; x < 5; x++)
- glVertex3dv(points[faces[i][x]]);
- glVertex3dv(points[faces[i][0]]);
- glEnd();
- }
- glFlush();
- glPopMatrix(); // завершаем матричные преобразования
- glDisable(GL_LIGHT0); glDisable(GL_LIGHT1); glDisable(GL_LIGHT2); glDisable(GL_LIGHT3); glDisable(GL_LIGHT4); glDisable(GL_LIGHT5); glutSwapBuffers(); flag = false;
- }
- void reshape(int w, int h) {
- glViewport(0, 0, (GLsizei)w, (GLsizei)h);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- // установка перспективы: угол обзора 60 градусов, аспект,
- // глубина пространства 20 единиц
- gluPerspective(60, GLfloat(1.33), 1, 20);
- // установка вектора обзора
- // (0,0,5) камера; (0,0,0) центр сцены, верхом будет ось Y
- gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0);
- }
- void key(unsigned char key, int x, int y) {
- if (key == 'w' || key == 'W') { glRotated(10.0, 0.0, 0.0, 1.0); }
- else if (key == 'a' || key == 'A') { glRotated(10.0, 0.0, -1.0, 0.0); }
- else if (key == 's' || key == 'S') { glRotated(10.0, 0.0, 0.0, -1.0); }
- else if (key == 'd' || key == 'D') { glRotated(10.0, 0.0, 1.0, 0.0); }
- std::cout << key << std::endl;
- glutPostRedisplay();
- }
- void mytime(int value) {
- angle = (angle>358) ? 0 : angle + 2; // расчет угла
- if (!flag) {
- glutPostRedisplay();
- }
- glutTimerFunc(40, mytime, 0);
- }
- int main(int argc, char** argv) {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize(800, 600);
- int glWin = glutCreateWindow("My program");
- init();
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- glutKeyboardFunc(key);
- glutTimerFunc(40, mytime, 0);
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment