#include <stdlib.h>
#include <GL/glut.h>
#include <iostream>
#include <clocale>
using namespace std;
//Инициализация
void init1(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
//Отображение
void display1(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
//Очистить матрицу
glLoadIdentity();
//Видовая трансформация(камера)
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
//Модельная трансформация
glScalef(1.0,2.0,1.0);
glutWireCube(1.0);
glFlush();
}
//Изменение размеров окна
void reshape1(int w, int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
glMatrixMode(GL_MODELVIEW);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Инициализация
void init2(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
//Изменение размеров окна
void reshape2(int w, int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat) w/(GLfloat) h,1.0,20.0); glMatrixMode(GL_MODELVIEW);
}
//Отображение
void display2(void)
{
GLdouble eqn[4]={0.0,1.0,0.0,0.0};
GLdouble eqn2[4]={1.0,0.0,0.0,0.0};
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glPushMatrix();
glTranslatef(0.0,0.0,-5.0);
//Отсечь нижнюю половину (y<0)
glClipPlane(GL_CLIP_PLANE0,eqn);
glEnable(GL_CLIP_PLANE0);
//Отсечь левую половину (x<0)
glClipPlane(GL_CLIP_PLANE1,eqn2);
glEnable(GL_CLIP_PLANE1);
glRotatef(90.0,1.0,0.0,0.0);
glutWireSphere(2.0,20,16);
glPopMatrix();
glFlush();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int year=0, day=0;
//Инициализация
void init3(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
//Изменение размеров окна
void reshape3(int w, int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat) w/ (GLfloat) h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
//Отображение
void display3(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glPushMatrix();
//Рисуем солнце
glutWireSphere(1.0,20,16);
glRotatef((GLfloat)year,0.0,1.0,0.0);
glTranslatef(2.0,0.0,0.0);
glRotatef((GLfloat)day,0.0,1.0,0.0);
//Рисуем планету
glutWireSphere(0.2,10,8);
glPopMatrix();
glutSwapBuffers();
}
//Реакция на клавиатуру
void keyboard(unsigned char key,int x, int y)
{
switch(key)
{
case 'd':
day=(day+10)%360;
glutPostRedisplay();
break;
case 'D':
day=(day-10)%360;
glutPostRedisplay();
break;
case 'y':
year=(year+5)%360;
glutPostRedisplay();
break;
case 'Y':
year=(year-5)%360;
glutPostRedisplay();
break;
default:
break;
}
}
int main(int argc, char **argv)
{
setlocale(LC_CTYPE, "rus");
int number;
cout <<"1 - Куб" <<endl;
cout <<"2 - Усечонная проволочная сфера" <<endl;
cout <<"3 - Планетарная система" <<endl;
cin >>number;
if (number == 1) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Transformed Cube");
init1();
glutDisplayFunc(display1);
glutReshapeFunc(reshape1);
glutMainLoop();
} else if (number == 2) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Wireframe Sphere with Two Clipping Planes");
init2();
glutDisplayFunc(display2);
glutReshapeFunc(reshape2);
glutMainLoop();
} else if (number == 3) {
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Planetary System");
init3();
glutDisplayFunc(display3);
glutReshapeFunc(reshape3);
glutKeyboardFunc(keyboard);
glutMainLoop();
} else {
return 0;
}
return 0;
}