Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <GL/glut.h>
- #include <stdlib.h>
- #pragma comment (lib,"opengl32.lib")
- #pragma comment (lib,"glu32.lib")
- #pragma comment (lib,"glaux.lib")
- #pragma comment (lib,"glut32.lib")
- /* параметры материала тора */
- float mat1_dif[] = { 0.8f,0.8f,0.0f };
- float mat1_amb[] = { 0.2f,0.2f,0.2f };
- float mat1_spec[] = { 0.6f,0.6f,0.6f };
- float mat1_shininess = 0.5f * 128;
- /* параметры материала конуса */
- float mat2_dif[] = { 0.0f,0.0f,0.8f };
- float mat2_amb[] = { 0.2f,0.2f,0.2f };
- float mat2_spec[] = { 0.6f,0.6f,0.6f };
- float mat2_shininess = 0.7f * 128;
- // Красный
- float mat3_dif[] = { 0.9f,0.2f,0.0f };
- float mat3_amb[] = { 0.2f,0.2f,0.2f };
- float mat3_spec[] = { 0.6f,0.6f,0.6f };
- float mat3_shininess = 0.1f * 128;
- // Зеленый
- float mat4_dif[] = { 0.0f,0.8f,0.0f };
- float mat4_amb[] = { 0.2f,0.2f,0.2f };
- float mat4_spec[] = { 0.6f,0.6f,0.6f };
- float mat4_shininess = 0.1f * 128;
- float rotor1 = 0; // текущий угол вращения планеты по орбите
- int stop = 0;
- int stopcolor = 0;
- static int flag;
- static int mousex, mousey;
- float dd = 1.5;
- float dx, dy;
- /* Инициализируем параметры материалов и источника света */
- void init(void)
- {
- GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
- /* устанавливаем параметры источника света */
- glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
- glLightfv(GL_LIGHT0, GL_POSITION, light_position);
- /* включаем освещение и источник света */
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- /* включаем z-буфер */
- glEnable(GL_DEPTH_TEST);
- }
- /* Функция вызывается при необходимости
- * перерисовки изображения. В ней осуществляется
- * весь вывод геометрии.
- */
- void display(void)
- {
- /* очищаем буфер кадра и буфер глубины */
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glPushMatrix();
- glRotatef(dx, 0, 1, 0);
- glRotatef(dy, -1, 0, 0);
- /* отображаем круг */
- glPushMatrix();
- glRotatef(90.0, 1.0, 0.0, 0.0);
- glMaterialfv(GL_FRONT, GL_AMBIENT, mat1_amb);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat1_dif);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat1_spec);
- glMaterialf(GL_FRONT, GL_SHININESS, mat1_shininess);
- GLUquadricObj *obj = gluNewQuadric();
- gluDisk(obj, 0, 1.6, 30, 30);
- glPopMatrix();
- /* отображаем стрелку */
- glPushMatrix();
- glRotatef(rotor1, 0.0, 1.0, 0.0);
- glTranslatef(0.0, 0.0, -2);
- glRotatef(1.0, 1.0, 0.0, 0.0);
- if (stop < 10000) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, mat2_amb);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat2_dif);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat2_spec);
- glMaterialf(GL_FRONT, GL_SHININESS, mat2_shininess);
- }
- else {
- if (stopcolor == 1) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, mat3_amb);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat3_dif);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat3_spec);
- glMaterialf(GL_FRONT, GL_SHININESS, mat3_shininess);
- }
- else {
- glMaterialfv(GL_FRONT, GL_AMBIENT, mat4_amb);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat4_dif);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat4_spec);
- glMaterialf(GL_FRONT, GL_SHININESS, mat4_shininess);
- }
- }
- glutSolidCone(0.1, 1.0, 15, 15);
- glPopMatrix();
- glPopMatrix();
- /* выводим сцену на экран */
- glFlush();
- }
- void redraw(void) {
- if (stop < 10000) { rotor1 += 0.1; if (rotor1>360.0) { rotor1 -= 360.0; } stop++; glutPostRedisplay();}
- if (stop >= 10000 && stopcolor == 0) {
- stopcolor = rand() % 2 + 1;
- }
- }
- /* Вызывается при изменении пользователем размеров окна */
- void reshape(int w, int h)
- {
- /* устанавливаем размер области вывода
- * равным размеру окна
- */
- glViewport(0, 0, (GLsizei)w, (GLsizei)h);
- /* задаем матрицу проекции с учетом размеров окна */
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(
- 40.0, /* угол зрения в градусах */
- (GLfloat)w / h, /* коэффициент сжатия окна */
- 1, 100.0); /* расстояние до плоскостей отсечения */
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt(
- 0.0f, 0.0f, 8.0f, /* положение камеры */
- 0.0f, 0.0f, 0.0f, /* центр сцены */
- 0.0f, 1.0f, 0.0f); /* положительное направление оси y */
- }
- /* Вызывается при нажатии клавиши на клавиатуре */
- void keyboard(unsigned char key, int x, int y)
- {
- switch (key) {
- case 27: /* escape */
- exit(0);
- break;
- }
- }
- void mouse(int button, int state, int x, int y)
- {
- if (state == GLUT_DOWN) {
- switch (button) {
- case GLUT_LEFT_BUTTON:
- flag = 1;
- break;
- case GLUT_RIGHT_BUTTON:
- break;
- }
- }
- else if (state == GLUT_UP) {
- flag = 0;
- }
- }
- void action(int x, int y)
- {
- if (flag == 1) {
- if (x - mousex > 0) { dx += dd; }
- if (x - mousex < 0) { dx -= dd; }
- if (y - mousey < 0) { dy += dd; }
- if (y - mousey > 0) { dy -= dd; }
- }
- mousex = x; mousey = y;
- glutPostRedisplay();
- }
- /* Главный цикл приложения */
- int main(int argc, char** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB
- | GLUT_DEPTH);
- glutInitWindowSize(500, 500);
- glutCreateWindow(argv[0]);
- init();
- glutReshapeFunc(reshape);
- glutDisplayFunc(display);
- glutKeyboardFunc(keyboard);
- glutIdleFunc(redraw);
- glutMouseFunc(mouse);
- glutMotionFunc(action);
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement