ГРАФИЧЕСКАЯ РЕАЛИЗАЦИЯ КУБИКА-РУБИКА СРЕДСТВАМИ OPENGL - Студенческий научный форум

V Международная студенческая научная конференция Студенческий научный форум - 2013

ГРАФИЧЕСКАЯ РЕАЛИЗАЦИЯ КУБИКА-РУБИКА СРЕДСТВАМИ OPENGL

Агафонов А.А. 1, Салихова Е.Г. 2, Вылегжанин О.Н. 2
1Томский Политехнический Унивеситет
2Томский Политехнический Университет
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF
Введение

Кубик Рубика - одна из самых известных головоломок. Изобрел его в 1975 году преподаватель архитектуры из Будапешта Эрне Рубик для развития пространственного мышления у студентов.

Головоломка представляет собой пластмассовый куб (форм-фактор в первоначальном варианте 3 × 3 × 3). Его видимые элементы снаружи выглядят как составляющие куб 27 кубиков и способны вращаться вокруг 3 внутренних осей куба. Каждая грань состоит из девяти квадратов и окрашена в один из шести цветов, в одном из распространённых вариантов окраски расположенных парами друг напротив друга: красный — оранжевый, белый — жёлтый, синий — зелёный; но в различных вариантах Кубика Рубика грани окрашиваются в разные цвета совершенно различным образом.

Повороты граней позволяют переупорядочить цветные квадраты множеством различных способов. Задача игрока заключается в том, чтобы «собрать кубик Рубика»: поворачивая грани куба, вернуть его в первоначальное состояние, когда каждая из граней состоит из квадратов одного цвета.

Постановка задачи

Требуется разработать модель Кубика-Рубика.

Данную модель возможно представить в нескольких вариантах: 3х3х3, 2х2х2, 4х4х4, 5х5х5, 11х11х11, 12х12х12, 17х17х17. А так же имеются другие формы представления: тетраэдр «Пирамида Мефферта», октаэдр «Trajber’s Octahedron», додекаэдр «Мегаминкс», а так же ромбододекаэдр, кубооктаэдр, усечённые тетраэдр и октаэдр и тд. [1]

Для простоты восприятия и изложения используем самую известную форму в виде куба 3х3х3.

Для разработки данной модели выберем среду программирования – Borland C++ с поддержкой встроенного использования возможностей OpenGL.

Изучение программного интерфейса OpenGL

OpenGL[2] - это графический стандарт в области компьютерной графики. На данный момент он является одним из самых популярных графических стандартов во всём мире. Ещё в 1982 г. в Стенфордском университете была разработана концепция графической машины, на основе которой фирма Silicon Graphics в своей рабочей станции Silicon IRIS реализовала конвейер рендеринга. Таким образом была разработана графическая библиотека IRIS GL. На основе библиотеки IRIS GL, в 1992 году был разработан и утверждён графический стандарт OpenGL. Разработчики OpenGL - это крупнейшие фирмы разработчики как оборудования так и программного обеспечения: Silicon Graphics, Inc., Microsoft, IBM Corporation, Sun Microsystems, Inc., Digital Equipment Corporation (DEC), Evans & Sutherland, Hewlett-Packard Corporation, Intel Corporation и Intergraph Corporation.

OpenGL переводится как Открытая Графическая Библиотека (Open Graphics Library)[3], это означает, что OpenGL - это открытый и мобильный стандарт. Программы, написанные с помощью OpenGL можно переносить практически на любые платформы, получая при этом одинаковый результат, будь это графическая станция или суперкомпьютер. OpenGL освобождает программиста от написания программ для конкретного оборудования. Если устройство поддерживает какую-то функцию, то эта функция выполняется аппаратно, если нет, то библиотека выполняет её программно.

Что же представляет из себя OpenGL? С точки зрения программиста OpenGL - это программный интерфейс для графических устройств, таких как графические ускорители. Он включает в себя около 150 различных команд, с помощью которых программист может определять различные объекты и производить рендеринг. Говоря более простым языком, вы определяете объекты, задаёте их местоположение в трёхмерном пространстве, определяете другие параметры (поворот, масштаб, ...), задаёте свойства объектов (цвет, текстура, материал, ...), положение наблюдателя, а библиотека OpenGL позаботится о том чтобы отобразить всё это на экране. Поэтому можно сказать, что библиотека OpenGL является только воспроизводящей (Rendering), и занимается только отображением 3Д обьектов, она не работает с устройствами ввода (клавиатуры, мыши). Также она не поддерживает менеджер окон.

OpenGL имеет хорошо продуманную внутреннюю структуру и довольно простой процедурный интерфейс. Несмотря на это с помощью OpenGL можно создавать сложные и мощные программные комплексы, затрачивая при этом минимальное время по сравнению с другими графическими библиотеками.

В некоторых библиотеках OpenGL (например под X Windows) имеется возможность изображать результат не только на локальной машине, но также и по сети. Приложение, которое вырабатывает команды OpenGL называется клиентом, а приложение, которое получает эти команды и отображает результат - сервером. Таким образом можно строить очень мощные воспроизводящие комплексы на основе нескольких рабочих станций или серверов, соединённых сетью.

Основные возможности OpenGL.

Что предоставляет библиотека в распоряжение программиста? Основные возможности:

  • Геометрические и растровые примитивы. На основе геометрических и растровых примитивов строятся все объекты. Из геометрических примитивов библиотека предоставляет: точки, линии, полигоны. Из растровых: битовый массив(bitmap) и образ(image)

  • Использование В-сплайнов. B-сплайны используются для рисования кривых по опорным точкам.

  • Видовые и модельные преобразования. С помощью этих преобразований можно располагать обьекты в пространстве, вращать их, изменять форму, а также изменять положение камеры из которой ведётся наблюдение.

  • Работа с цветом. OpenGL предоставляет программисту возможность работы с цветом в режиме RGBA (красный-зелёный-синий-альфа) или используя индексный режим, где цвет выбирается из палитры.

  • Удаление невидимых линий и поверхностей. Z-буферизация.

  • Двойная буферизация. OpenGL предоставляет как одинарную так и двойную буферизацию. Двойная буферизация используется для того, чтобы устранить мерцание при мультипликации, т.е. изображение каждого кадра сначала рисуется во втором(невидимом) буфере, а потом, когда кадр полностью нарисован, весь буфер отображается на экране.

  • Наложение текстуры. Позволяет придавать объектам реалистичность. На объект, например шар, накладывается текстура(просто какое-то изображение), в результате чего наш объект теперь выглядит не просто как шар, а как разноцветный мячик.

  • Сглаживание. Сглаживание позволяет скрыть ступенчатость, свойственную растровым дисплеям. Сглаживание изменяет интенсивность и цвет пикселей около линии, при этом линия смотрится на экране без всяких зигзагов.

  • Освещение. Позволяет задавать источники света, их расположение, интенсивность, и т.д.

  • Атмосферные эффекты. Например туман, дым. Всё это также позволяет придать объектам или сцене реалистичность, а также "почувствовать" глубину сцены.

  • Прозрачность объектов.

  • Использование списков изображений.

Пример примитивной структуры программы

В проекте будет использоваться за основной заголовочный файл – “FreeGLUT.h”, его и необходимо подключить директивой прекомпилятора #include:

#include

  1. Поскольку основной задачей библиотеки FreeGLUT является облегчение рутинной работы по созданию класса окна, его инициализации, подготовки контекста рендеринга и т.д., данный инструмент прекрасно облегчает процесс написания простых приложений OpenGL. При использовании GLUT, нам лишь необходимо написать функции, отвечающие за:

    1. вывод изображения на экран,

    2. обработку изменения размера окна программы,

    3. обработку ввода данных с клавиатуры,

    4. «простой» программы.

Пример функции вывода изображения на экран:

void Display()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(-1.5f,0.0f,-6.0f);

glBegin(GL_TRIANGLES);

glVertex3f( 0.0f, 1.0f, 0.0f);

glVertex3f(-1.0f,-1.0f, 0.0f);

glVertex3f( 1.0f,-1.0f, 0.0f);

glEnd();

glTranslatef(3.0f,0.0f,0.0f);

glBegin(GL_QUADS);

glVertex3f(-1.0f, 1.0f, 0.0f);

glVertex3f( 1.0f, 1.0f, 0.0f);

glVertex3f( 1.0f,-1.0f, 0.0f);

glVertex3f(-1.0f,-1.0f, 0.0f);

glEnd();

glutSwapBuffers();

}

glClear

Очистка различных буферов OpenGL. В данном случае (см. параметры в коде) буфера цвета и буфера глубины

glTranslatef

Функция сдвига сисемы координат на заданную dx, dy и dz. Буква “f” в названии говорит о том, что аргументы команды – числа типа float.

glScalef

Угадайте из названия, что делает эта функция

glRotatef

Аналогично. Только параметров у неё 4: угол поворота и три оси, где значение 1.0 должно показывать ту, относительно которой производится поворот

glLoadIdentity()

Функция устанавливающая исходный вид системы координат. Проще говоря, отменяет действие всех предыдущих translate, scale и rotate.

glBegin … glEnd

Операторные скобки процедуры рисования в OpenGL, где параметром glBegin является тип объединения вертексов, описывающихся перед glEnd, в фигуры:

  • GL_POINTS – каждый вызов glVertex задает отдельную точку.

  • GL_LINES – каждая пара вершин задает отрезок.

  • GL_LINE_STRIP – рисуется ломанная.

  • GL_LINE_LOOP – рисуется ломанная, причем ее последняя точка соединяется с первой.

  • GL_TRIANGLES – каждые три вызова glVertex задают треугольник.

  • GL_TRIANGLE_STRIP – рисуются треугольники с общей стороной.

  • GL_TRIANGLE_FAN – рисуются треугольники с одной общей вершиной.

  • GL_QUADS – четырёхугольники.

  • GL_QUAD_STRIP – четырёхугольники с общей стороной.

  • GL_POLYGON – многоугольник

glVertex

Команда, которая должна находиться между соответствующей парой glBegin – glEnd. Описывает вершину в 3-мерном или 2-мерном (если команда вида glVertex2#, где # – буква, указывающая на тип параметров команды). Вызов glVertex вне скобок begin – end приведёт к ошибке.

glColor

Угадайте, за что она отвечает! Команда описывает текущее состояние рисования OpenGL. Соответсвенно, если если произошёл один вызов этой команды с каким-то заданным цветом, то всё, что будет рисоваться после этого вызова будет закрашено этим цветом. Может вызываться внутри или вне begin – end, как для всей фигуры, так и для отдельного вертекса. ПЕо умолчанию – белый(RGB 1, 1, 1)

glutSwapBuffers

Вызывается тогда, когда обработаны все команды на прорисовку фигур на экране, выполняя смену буфера кадра.

Пример функции-обработчика изменения размера окна:

void Reshape(int w, int h)

{

if(h == 0)

h = 1;

glViewport(0, 0, (GLsizei)w, (GLsizei)h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0f, (GLfloat)w/(GLfloat)h, 0.1f, 100.0f);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

glViewport

Утанавливает размеры области, в которой OpenGL будет выполнять прорисовку

gluPerspective

Устанавливает параметры перспективы отображения

glMatrixMode

Устанавливает тип матрицы, которую необходимо изменить:

  • GL_PROJECTION – проектно-видовая матрица, отвечающая за то, как и куда мы смотрим на визуализируемую сцену

  • GL_MODELVIEW – модельно-видовая матрица, наша система координат. Собственно эта матрица и изменяется при вызове rotate, translate и scale команд.

Пример функции-обработчика ввода с клавиатуры:

void Keyb(unsigned char key, int x, int y)

{

if(key == 27 || key == 'q' || key == 'Q')

exit(0);

glutPostRedisplay();

}

Пример функции обработки «ничего не делания»:

void Idle()

{

glutPostRedisplay();

}

Пример функции инициализации OpenGL:

void Init()

{

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

glEnable(GL_DEPTH_TEST);

glDepthFunc(GL_LEQUAL);

glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

}

glClearColor

Функция, устанавливающая цвет очистки экрана. По умолчанию – чёрный.

  1. Последним необходимо написать функцию Main:

int _tmain(int argc, char* argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize(500, 500);

glutCreateWindow("Lab01");

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutKeyboardFunc(Keyb);

glutIdleFunc(Idle);

Init();

glutMainLoop();

return 0;

}

Анализ и исследование задачи

Поскольку перед нам стоит задача построения модели Кубика-Рубика, то необходимо изучить непосредственно сам Кубик-Рубика.

Кубик Рубика[4] – одна из самых известных головоломок. Изобрел его в 1975 году преподаватель архитектуры из Будапешта Эрне Рубик для развития пространственного мышления у студентов. Головоломка представляет собой куб, как бы разрезанный на 27 одинаковых кубиков. В исходном положении каждая грань куба окрашена в один из шести цветов. Механизм кубика позволяет поворачивать любой слой из девяти кубиков, примыкающих к одной грани куба, вокруг ее центра, при этом цвета граней смешиваются. Задача состоит в том, чтобы вернуть разноцветные грани куба в исходное положение.

Число возможных различных состояний кубика Рубика равно (8! × 38−1) × (12! × 212−1)/2 = 43 252 003 274 489 856 000 [5]. Это число не учитывает то, что ориентация центральных квадратов может быть разной. С учётом ориентации центральных квадратов количество состояний получается в 46/2=2048 раз больше, а именно 88 580 102 706 155 225 088 000 состояний. Однако, при сборке кубика обычно не учитывают ориентацию центральных квадратов, поскольку на большинстве кубиков нет обозначений, которые позволяли бы определить оную (за исключением, возможно, надписи «Rubik's Cube» на одном из квадратов).

Несмотря на то, что после создания кубика прошло уже более 30 лет, так называемый «алгоритм бога» (алгоритм решения головоломки за наименьшее количество ходов) для его сборки все еще не найден. С помощью больших по объёму расчётов на компьютере (7,8 ядро-лет) математик Томас Рокики (Tom Rokicki) доказал, что из любой начальной конфигурации кубик можно собрать не более чем за 23 хода, улучшив тем самым своё же прежнее достижение в 25 ходов. А теперь, что касается непосредственно схемы сборки. В данном случае цвета - вещь относительная и внимания на них не обращаем. Важно расположить собираемый кубик согласно положению, указанному на схеме. Для этого в каждом этапе сборки необходимо выбирать фронтальную грань (обозначена буквой Ф) и, чтобы сориентировать кубик в пространстве, запомнить цвет грани к ней прилегающей, например верхней. Далее производим сборку по указанным операциям, обозначенными определенными буквами. Н - поворот нижней грани по часовой стрелке; Н' - поворот нижней грани против часовой стрелки и т.д.

Шаг 1. В начале этого этапа кубик полностью разобран. Рис.1В конце этапа у Вас должен быть собран крест на верхней грани и цвета верхних серединок каждой боковой грани должны совпадать с центральными цветами боковых граней. Рис.2Найдите один из кубиков верхнего креста, и расположите его на нижней гране. Теперь, в зависимости от того, как встали цвета этого кубика, проделайте операцию показанную ниже.

Рис.3

Рис.4

Рис.5

Рис.6ИЛИ Рис.7

Повторите операцию с тремя оставшимися кубиками верхнего креста.

Шаг 2. В начале этого этапа должен быть собран верхний крест. Рис.8В конце этапа у Вас должна быть собрана вся верхняя грань. Рис.9Найдите один из угловых кубиков верхней грани, и расположите его на нижней гране. Теперь, в зависимости от того, как встали цвета этого кубика, проделайте операцию показанную ниже.

Рис.10

Рис.11

Рис.12

Рис.13

Рис.14

Рис.15

Повторите операцию с тремя оставшимися угловыми кубиками верхней грани.

Шаг 3. В начале этого этапа должен быть собран верхний слой. Рис.16В конце этапа у Вас должны быть собраны два верхних слоя. Рис.17Найдите один из боковых кубиков , и расположите его на нижней гране. Теперь, в зависимости от того, как встали цвета этого кубика, проделайте операцию показанную ниже.

Рис.18

Рис.19

Рис.20

Рис.21

Повторите операцию с тремя оставшимися кубиками.

Шаг 4. В начале этого этапа должны быть собраны 2 слоя. Переверните кубик так, как показано на рисунке Рис.22В конце этапа кубики верхнего креста должны быть на своём месте, при этом их цвета могуть быть перевёрнуты. Рис.23Вам нужно переставлять между собой серединные кубики верхней грани, пока все они не окажутся на своём месте, при этом то, как они повёрнуты - неважно!

Рис.24

Рис.25

Шаг 5. В конце этапа у вас должен быть собраны два нижних слоя и верхний крест. Рис.26В начале этого этапа кубики верхнего креста должны быть на своём месте, при этом их цвета могуть быть перевёрнуты. У Вас может быть одна из следующих картин. Либо все кубики верхнего креста повёрнуты неправильно, либо

a)2 соседних кубика повёрнуты неправильно, Рис.27

б)либо 2 противоположенных кубика повёрнуты неправильно. Рис.28

Чтобы перевернуть кубики проделайте следующие действия:

Рис.29

Рис.30

После этих действий весь кубик "поломается", но проделав эту последовательность ещё раз, всё вернётся на свои места. Только перед тем как проделывать последовательность нужно поставить второй "неправильный" кубик на правую грань. В зависимости от случая, нужно просто повернуть верхнюю грань на нужное число оборотов, чтоб "неправильный" кубик встал на правую грань. В случае а) поверните верхнюю грань один разВ случае б) поверните верхнюю грань два раза

Шаг 6. В начале этого этапа должны быть собраны два нижних слоя и верхний крест Рис.31В конце этапа, все угловые кубики верхней грани должны быть на своих местах, при этом они могут быть неправильно повёрнуты. Рис.32Чтобы переставить угловые кубики верхней грани, проделайте один из следующих алгоритмов:

Рис.33

Рис.34

Рис.35

Рис.36

Шаг 7. В начале этого этапа все угловые кубики верхней грани должны быть на своих местах, при этом они могут быть неправильно повёрнуты. Рис.37В конце этапа, весь кубик должен быть собран. Рис.38У Вас может быть одна из следующих картин. Либо все угловые кубики верхней грани повёрнуты неправильно, либо

a)2 соседних кубика повёрнуты неправильно, Рис.39

б)либо 2 противоположенных кубика повёрнуты неправильно. Рис.40

Чтобы перевернуть кубики проделайте следующие действия:

Рис.41 Рис.42

Эту последовательность надо повторять пока правый кубик верхней грани, не повернётся правильным образом. При этом весь кубик может "поломаться". Не пугайтесь. Если повторить последовательность ещё несколько раз, то всё встанет на свои места. Только перед тем как повторять последовательность, нужно поставить другой "неправильный кубик" в правый угол. В зависимости от случая, нужно просто повернуть верхнюю грань на нужное число оборотов, чтоб "неправильный" кубик встал в правый угол. В случае а) поверните верхнюю грань один раз Рис.43В случае б) поверните верхнюю грань два раза в любую сторону Рис.44Теперь проделайте последовательность, чтоб и этот кубик повернулся правильно. В конце ваш кубик должен быть собран!

Построение модели

При построении модели следует учитывать, что формально кубик Рубика состоит из 27 маленьких кубиков. Исходя из того, что задача выполняется в среде программирования C++ при использовании графических стандартов OpenGL, следует определить несколько вещей.

Во-первых, для отображения полного куба нам не требуется центральное звено что обуславливается тем, что мы его никогда не увидим. Следовательно, нам требуется для построения куба только 26 кубиков.

Во-вторых, для наглядного использования средств OpenGL применим к нашему кубу текстурирование. За текстуры возьмем 6 видов (оттенков) древесного покрытия.

В-третьих, нам необходимо управлять моделью, что заставляло бы куб крутиться полностью и крутить части по 9 кубиков. Для управления будет использовать клавиатуру, а именно следующие клавиши:

  • Клавиши для перемещения:

    • ‘A’ – Движение вправо;

    • ‘W’ – Движение вниз;

    • ‘D’ – Движение влево;

    • ‘S’ – Двинение вверх;

    • ‘Q’ – Движение от пользователя;

    • ‘E’ - Движение к пользователю;

  • Клавиши для вращения:

    • ‘I’ – Вращение вниз по оси Y;

    • ‘K’ – Вращение вверх по оси Y;

    • ‘J’ – Вращение вправо по оси X;

    • ‘L’ – Вращение влево по оси X;

    • ‘U’ – Вращение влево по оси Z;

    • ‘O’ – Вращение вправо по оси Z;

  • Клавиши для поворота:

    • ‘Y’ – Поворот верхнего набора относительно оси X;

    • ‘H’ – Поворот среднего набора относительно оси X;

    • ‘N’ – Поворот нижнего набора относительно оси X;

    • ‘T’ - Поворот правого набора относительно оси Y;

    • ‘G’ – Поворот среднего набора относительно оси Y;

    • ‘B’ – Поворот левого набора относительно оси Y;

    • ‘R’ – Поворот ближнего набора относительно оси Z;

    • ‘F’ – Поворот среднего набора относительно оси Z;

    • ‘V’ – Поворот дальнего набора относительно оси Z;

Для построения модели была использованная основа структура выше приведенной программы. Для задания куба потребовалось создать структуру - struct cube1 (где cube1 cubic1[54])(см. Приложение – Листинг 1.) , где инициализировались координаты XYZ, величины поворота по всем трем осям и значение текстур.

Для выполнения поворотов введена функция void cubik() (см. Приложение - Листинг 2.)[6]. Что бы добиться целостности модели потребовалось вывести правила для осей в отдельные функции (пример см. Приложение – Листинг 3.)[7], Что позволило избавиться от громоздкости кода и привело к адекватному вращению частей куба, состоящих из 9 кубиков.

Для наложения текстур использовалась функция - void LoadGLTextures() (см Приложение – Листинг 4.)[8].

После введения правил поворота, управления и текстурирования на выходе работы приложения был получен трех-мерный кубик Рубика, состоящий из 26 кубиков(исключен центральный) и имеющий раскрас в виде 6 видов(оттенков) деревянного покрытия.

Пример работы программы представлен ниже на Рис.45.

Рис.45. Модель кубика Рубика.

Заключение

В процессе разработки программного приложения для решения конкретной задачи было проделано следующее:

  1. Изучена литература по теме проекта;

  2. Разработан алгоритм решения задачи;

  3. Рассмотрены теоретические алгоритмы сборки;

  4. Разработана модель приложения;

  5. Произведено тестирование приложения.

В перспективе созданное приложение можно усовершенствовать до полноценной логической игры.

В программу можно внести следующие изменения:

  • Создание пользовательского интерфейса;

  • Реагирование модели на мышь;

  • Возможность задания исходного условия сборки.

Список литературы

  1. «Кубик Рубика» [электронный ресурс]; Режим доступа: http://ru.wikipedia.org/wiki/Кубик_Рубика; Свободный.

  2. «Что такое OpenGL?» [электронный ресурс]; Режим доступа: http://www.3dnews.ru./software/opengl; Свободный.

  3. «Основы OpenGL» [электронный ресурс]; Режим доступа: http://www.codenet.ru/progr/opengl/; Свободный.

  4. «Схема сборки кубика Рубика» [электронный ресурс]; Режим доступа: http://www.kubik-rubika.narod.ru/; Свободный.

  5. «История кубика Рубика» [электронный ресурс]; Режим доступа: http://www.playlab.ru/club/history/rubiks_cube/; Свободный.

  6. «Народный учебник по OpenGL» [электронный ресурс]; Режим доступа: http://www.opengl.org.ru/lesson/index.html; Свободный.

  7. «Работа с OpenGL» [электронный ресурс]; Режим доступа: http://www.pmg.org.ru/nehe/index.html; Свободный.

  8. «Уроки программирования OpenGL» [электронный ресурс]; Режим доступа: http://www.masandilov.ru/opengl/; Свободный.

Приложение

Листинг 1. Структура куба.

struct cube1

{

int x;

int y;

int z;

int anglex;

int angley;

int anglez;

GLuint tex;

} ;

cube1 cubic1[54];

Листинг 2. Функция поворота.

void cubik()

{

glPushMatrix();

for (int i =0 ;i90)

{

dyc[0]=false;

dyc[1]=false;

dyc[2]=false;

dxc[0]=false;

dxc[1]=false;

dxc[2]=false;

move=false;

turn=0;

}

glPopMatrix();

}

Листинг 3. Пример функции для оси X.

cube1 RotZY(cube1 cubicx,int i)

{

switch (cubicx.y)

{

case -1:

switch (cubicx.z)

{

case -1: cubicx.y=1; cubicx.z=-1;break;

case 0: cubicx.y=0;cubicx.z=-1; break;

case 1: cubicx.y=-1;cubicx.z=-1; break;

}break;

case 0:

switch (cubicx.z)

{

case -1: cubicx.y=1; cubicx.z=0;break;

case 0: break;

case 1: cubicx.y=-1;cubicx.z=0; break;

}break;

case 1:

switch (cubicx.z)

{

case -1: cubicx.y=1; cubicx.z=1; break;

case 0: cubicx.y=0; cubicx.z=1; break;

case 1: cubicx.y=-1; cubicx.z=1; break;

}break;

}

if (cubicx.angley%360!=90 && cubicx.angley%360!=270) cubicx.anglex=cubicx.anglex+90;

return cubicx;

}

Листинг 4. Функция текстурирования.

void LoadGLTextures() Creates Textures From Bitmaps In The Resource File

{

HBITMAP hBMP; // Handle Of The Bitmap

BITMAP BMP; // Bitmap Structure

// The ID Of The 3 Bitmap Images We Want To Load From The Resource File

byte Texture[]={ IDB_FRONT, IDB_TOP, IDB_BACK, IDB_BOTTOM, IDB_LEFT, IDB_RIGHT };

glGenTextures(sizeof(Texture), &texture[0]); // Generate 5 Textures (sizeof(Texture)=5 ID's)

for (int loop=0; loop

Просмотров работы: 3854