Среда программирования:
Microsoft Visual Studio Express 2012
#include <glut.h> #include <Windows.h> //для задержки между вращениями float angle = 90.0f; //вводим угол на который будем поворачивать float mas[4] = {1.0, 0.0, 0.0, 0.0}; //переменные {флаг, х, у, z} для изменения вектора вращения //функция прорисовки void drawCube(void){ glEnable(GL_LINE_SMOOTH); //для сглаживания glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); glColor3f(0.0, 0.0, 0.0); //определяем цвет линий glLineWidth(2.0); //для толщины внутренних диагональных линий glBegin(GL_LINES); //прорисовка внутренних диагональных линий glVertex3f( 0.0, 0.3, 0.425); glVertex3f( 0.425, -0.3, 0.0); glVertex3f( 0.425, 0.3, 0.0); glVertex3f( 0.0, -0.3, 0.425); glVertex3f( 0.0, 0.3, 0.425); glVertex3f( 0.0, 0.3, -0.425); glVertex3f( 0.425, 0.3, 0.0); glVertex3f(-0.425, 0.3, 0.0); glVertex3f( 0.0, 0.3, 0.425); glVertex3f(-0.425, -0.3, 0.0); glVertex3f(-0.425, 0.3, 0.0); glVertex3f( 0.0, -0.3, 0.425); glVertex3f( 0.0, -0.3, -0.425); glVertex3f( 0.0, -0.3, 0.425); glVertex3f( 0.425, -0.3, 0.0); glVertex3f(-0.425, -0.3, 0.0); glVertex3f( 0.0, -0.3, -0.425); glVertex3f( 0.425, 0.3, 0.0); glVertex3f( 0.425, -0.3, 0.0); glVertex3f( 0.0, 0.3, -0.425); glVertex3f( 0.0, -0.3, -0.425); glVertex3f(-0.425, 0.3, 0.0); glVertex3f( 0.0, 0.3, -0.425); glVertex3f(-0.425, -0.3, 0.0); glEnd(); glLineWidth(0.6); //толщина внешних линий ребер glEnable(GL_LINE_STIPPLE); //функция прорисовки прерывистых линий glLineStipple(1, 0x00F0); //длина и расстояние между штрихами glBegin(GL_LINES); //прорисовка внешних линий ребер glVertex3f( 0.0, 0.3, 0.425); glVertex3f( 0.0, -0.3, 0.425); glVertex3f( 0.0, -0.3, 0.425); glVertex3f( 0.425, -0.3, 0.0); glVertex3f( 0.425, -0.3, 0.0); glVertex3f( 0.425, 0.3, 0.0); glVertex3f( 0.425, 0.3, 0.0); glVertex3f( 0.0, 0.3, 0.425); glVertex3f( 0.0, 0.3, 0.425); glVertex3f(-0.425, 0.3, 0.0); glVertex3f(-0.425, 0.3, 0.0); glVertex3f( 0.0, 0.3, -0.425); glVertex3f( 0.0, 0.3, -0.425); glVertex3f( 0.425, 0.3, 0.0); glVertex3f(-0.425, 0.3, 0.0); glVertex3f(-0.425, -0.3, 0.0); glVertex3f(-0.425, -0.3, 0.0); glVertex3f( 0.0, -0.3, 0.425); glVertex3f( 0.0, -0.3, -0.425); glVertex3f(-0.425, -0.3, 0.0); glVertex3f( 0.425, -0.3, 0.0); glVertex3f( 0.0, -0.3, -0.425); glVertex3f( 0.0, -0.3, -0.425); glVertex3f( 0.0, 0.3, -0.425); glEnd(); glDisable(GL_LINE_STIPPLE); //отключаем функцию прорисовки прерывистых линий } //меняем вектор вращения void change(float *arr){ if(arr[0] == 1.0){ arr[1] = -0.2125; arr[2] = 0.0; arr[3] = -0.2125; arr[0] = 2.0; return; } if(arr[0] == 2.0){ arr[1] = 0.2125; arr[2] = 0.0; arr[3] = -0.2125; arr[0] = 3.0; return; } if(arr[0] == 3.0){ arr[1] = 0.0; arr[2] = -1.0; arr[3] = 0.0; arr[0] = 1.0; return; } } //функция прорисовки void renderScene(void) { glClearColor(1.0, 1.0, 1.0, 1.0); //затираем рисунок фоном glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //очистка буфера цвета и глубины glLoadIdentity();//обнуление трансформации glTranslatef(0.0, 0.0, 1.0); //для нормальной видимости куба if (mas[2] == -1.0){ //установка камеры в положение вверх ногами gluLookAt( 0.0f, 0.6f, 0.85f, //координаты камеры 0.0f, 0.0f, 0.0f, //координаты центра 0.0f, -1.0f, 0.0f); //координаты вектора направления } else { //установка камеры в нормальном положении gluLookAt(0.0f, 0.6f, 0.85f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); } if (angle != 90.0f) angle += 0.3125f; //увеличиваем угол до 90 градусов else { angle = 0.0; //обнуляем угол после полного поворота на 90 градусов change(mas); //изменяем вектор вращения Sleep(300); //задержка между вращениями куба } Sleep(2);//задержка во время поворота куба glRotatef(angle, mas[1], mas[2], mas[3]);//функция вращения куба, (угол, х, у, z) drawCube();//отрисовка куба glutSwapBuffers(); //смена буфферов } //главная функция int main(int argc, char **argv) { //инициализация GLUT и создание окна glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(600,600); glutCreateWindow("Cube"); glutDisplayFunc(renderScene); //функция отрисовки всей сцены glutIdleFunc(renderScene); //функция для создания анимации glutMainLoop(); //графический цикл return 1; }
Прикрепленный файл | Размер |
---|---|
Ivanova_cube.rar | 262 кб |