Компьютерная графика
Основы проектирования 3D моделей реального мира в программном продукте Dev C++. Выбор и обоснование языка программирования. Реализация построения интерактивной модели. Минимальные требования к технической базе. Алгоритм визуализации спортивного зала.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 20.04.2014 |
Размер файла | 2,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
ВВЕДЕНИЕ
Компьютерная графика - это область информатики, занимающаяся проблемами получения различных изображений (рисунков, чертежей, мультипликации) на компьютере. Работа с компьютерной графикой - одно из самых популярных направлений использования персонального компьютера, причем занимаются этой работой не только профессиональные художники и дизайнеры. Существуют несколько основных видов графики - двумерная, которая включает в себя фрактальную, растровую и векторную графику, и трехмерная, которая пользуется в настоящее время гораздо большей популярностью из-за возможности создавать более реалистичные и оригинальные объекты. Трёхмерная графика (3D, 3 Dimensions, русск. 3 измерения) -- раздел компьютерной графики, совокупность приемов и инструментов (как программных, так и аппаратных), предназначенных для изображения объёмных объектов. Больше всего применяется для создания изображений на плоскости экрана или листа печатной продукции в архитектурной визуализации, кинематографе, телевидении, компьютерных играх, печатной продукции, а также в науке и промышленности.
Трёхмерное изображение на плоскости отличается от двумерного тем, что включает построение геометрической проекции трёхмерной модели сцены на плоскость (например, экран компьютера) с помощью специализированных программ.
Для получения трёхмерного изображения на плоскости требуются следующие шаги: - моделирование -- создание трёхмерной математической модели сцены и объектов в ней. - рендеринг (визуализация) -- построение проекции в соответствии с выбранной физической моделью.
- вывод полученного изображения на устройство вывода - дисплей или принтер.
1. ОПИСАНИЕ ОБЪЕКТА МОДЕЛИРОВАНИЯ
Шахматы -- настольная логическая игра специальными фигурами на 64-клеточной доске для двух соперников, сочетающая в себе элементы искусства (в части шахматной композиции), науки и спорта. Название берёт начало из персидского языка: шах и мат, что значит властитель (шах) умер. История шахмат насчитывает не менее полутора тысяч лет. Считается, что игра-прародитель, чатуранга, появилась в Индии не позже VI века нашей эры. По мере распространения игры на Арабский Восток, затем в Европу и Африку, правила менялись. В том виде, который игра имеет в настоящее время, она сформировалась к XV веку, окончательно правила были стандартизованы в XIX веке, когда стали систематически проводиться международные турниры.
Виды шахматных фигур и их назначение:
- Король (Юникод: ??) -- главная шахматная фигура, хотя и не сильнейшая. Цель шахматной партии -- объявить мат королю соперника.
- Ферзь(перс. ferzin -- визирь, советник; Юникод: ??) -- самая сильная шахматная фигура. Считается, что материальная ценность ферзя равна 8-9 пешкам. Таким образом он по силе превосходит ладью и лёгкую фигуру, уступает двум ладьям и примерно равен трём лёгким фигурам.
- Ладья (Юникод ??) -- шахматная фигура. Она примерно равноценна 5 пешкам. Ладья может двигаться на любое число полей по горизонтали или по вертикали при условии, что на её пути нет фигур. Ладьи в начале партии занимают поля a1 и h1 (белые ладьи), a8 и h8 (чёрные ладьи).
- Слон (иногда встречается название «офицер»)(Юникод ??) -- шахматная фигура. Слон примерно эквивалентен коню. Ближе к эндшпилю, если пешки на обеих сторонах доски, слон становится сильнее коня, но конь немного сильнее если пешки только на одной стороне.
- Конь (Юникод ??) -- шахматная фигура, в начале партии располагающаяся на полях b1, g1 (белые кони) и b8, g8 (чёрные кони). По цене конь примерно равен слону или трём пешкам. Три коня примерно равны ферзю или двум ладьям. Ценность коня возрастает в закрытых позициях, где дальнобойность других фигур (ферзя, ладей и слонов) ограничена.
- Пешка (Юникод: ??) -- основная единица измерения шахматного материала (в шахматах её не принято называть фигурой). В пешечном эквиваленте измеряют «вес» и других фигур (лёгкая фигура примерно эквивалентна трем пешкам, ладья -- пяти). По Ф. Филидору пешка -- «душа шахматной партии», структура пешечного расположения определяет стратегический рисунок партии. В эндшпиле роль пешек значительно возрастает, особенно далеко продвинутых (близких к полю превращения). Буквенное обозначение -- п. (В шахматной нотации обычно используется только при записи положения фигур на диаграмме, а в процессе партии опускается
Внешний вид спортивных снарядов приведён на рисунке 1.
Рисунок 1: 1-Король 2-Ферзь 3-Слон 4-Конь 5-Ладья 6-Пешка
2. МАТЕМАТИЧЕСКОЕ И АЛГОРИТМИЧЕСКОЕ ОБЕСПЕЧЕНИЕ
2.1 Математическая модель
Трёхмерная графика оперирует с объектами в трёхмерном пространстве. Обычно результаты представляют собой плоскую картинку, проекцию. Трёхмерная компьютерная графика широко используется в кино, компьютерных играх.
В трёхмерной компьютерной графике все объекты обычно представляются как набор поверхностей или частиц. Минимальную поверхность называют полигоном. В качестве полигона обычно выбирают треугольники.
Всеми визуальными преобразованиями в 3D-графике управляют матрицы (см. также: аффинное преобразование в линейной алгебре). В компьютерной графике используется три вида матриц:
· матрица поворота
· матрица сдвига
· матрица масштабирования
Любой полигон можно представить в виде набора из координат его вершин. Так, у треугольника будет 3 вершины. Координаты каждой вершины представляют собой вектор (x, y, z). Умножив вектор на соответствующую матрицу, мы получим новый вектор. Сделав такое преобразование со всеми вершинами полигона, получим новый полигон, а преобразовав все полигоны, получим новый объект, повёрнутый/сдвинутый/масштабированный относительно исходного.
В разрабатываемой программе будем использовать ПГМ, написанную на языке Dev С++ .
Все математические действия производимые в программе будут происходить с помощью перемножения матриц смещения, масштабирования и вращения.
Смещение точки-вектора на заданную величину реализуется посредством умножения ее координатной модели на матрицу вида:
где m - смещение координат точек относительно оси х,
n - смещение координат точек относительно оси у,
l - смещение координат точек относительно оси z.
Поворот точки-вектора на заданную величину, относительно определенной оси реализуется посредством умножения ее координатной модели на матрицу вида:
Матрицами вращения вокруг оси декартовой правой системы координат на угол ? в трёхмерном пространстве являются:
· Вращение вокруг оси x:
· Вращение вокруг оси y:
· Вращение вокруг оси z:
В программе будут использоваться матрицы поворота вокруг осей, а так же матрицы смещения. Первоначально на необходимо сделать чтобы модель плавно двигалась вокруг своей оси. Для этого возьмём матрицу вращения вокруг оси y:
Где ? - это постепенно изменяющийся угол;
Для того чтобы изображение можно было передвигать, добавим матрицу смещения:
Где Kx, Ky, Kz - соответствующее приращение к начальным значениям x,y,z для перемещения изображения на это расстояние.
Для визуализации ордена потребуется проводить для каждой точки в трёхмерной системе координат поворот и масштабирование в пространстве. Потребуется провести такие преобразования: a*A, a*B, a*C, a*D, где - а - точка-вектор, над которым требуется произвести действия, а A,B,C,D - матрицы поворотов и масштабирования.
Смещение точки-вектора на заданную величину реализуется посредством умножения ее координатной модели на матрицу вида:
где m - смещение координат точек относительно оси х,
n - смещение координат точек относительно оси у,
l - смещение координат точек относительно оси z.
Матрицы поворота вокруг осей x, y, z на угол a
Rx |
Ry |
Rz |
|
Для поворота тела вокруг точки (m, n, k) на угол a используется следующий алгоритм:
1) перенос тела на вектор A(-m, -n, -k) для совмещения точки (m, n, k) с началом координат;
2) поворот тела на угол a;
3) перенос тела на вектор A'(m, n, k) для возвращения его в исходное положение. Представим тело набором точек (вершин тела) и выполним операции 1) - 3) с каждой из них;
В матричной форме это представляется следующим образом (R(a) -- матрица поворота вокруг оси x, y или z)
Для масштабирования всего изображения понадобится матрица общего полного масштабирования, которая имеет следующий вид
где S-постоянная масштабирования.
Для задания цвета рабочей области, используется цветовая модель RGB. В основе основных цветов данной модели используется красный (R), зелёный (G) и синий (B). Все остальные цвета и их оттенки, получаемые в рамках использования модели получается в результате смешивания определённого количества перечисленных базовых компонентов. На основе первого закона планиметрии, рассматриваемая модель может быть представлена следующим уравнением:
где ,, - коэффициенты, характеризующие кол-во базовых компонентов.
2.2 Алгоритм визуализации спортивного зала
Алгоритм визуализации спортивного зала следующий:
1) Инициализация OpenGL и очистка буфера глубины;
2) Инициализация основных переменных, задание начальных условий;
3) Расчет координат тела;
4) Перерисовка сцены;
5) Сброс параметров в начальные условия.
Каждый из этих этапов будут подробно рассмотрены в 4 разделе.
2.3 Блок-схема алгоритма
Основные понятия блок - схемы :
Терминатор (овал) - Элемент отображает вход из внешней среды или выход из нее.
Процесс (прямоугольник) - Выполнение одной или нескольких операций, обработка данных любого вида.
Решение (ромб) - Отображает решение или функцию переключательного типа с одним входом и двумя или более альтернативными выходами, из которых только один может быть выбран после вычисления условий, определенных внутри этого элемента.
Постоим блок-схему построения изображения:
3. ПРОГРАМНОЕ И ТЕХНИЧЕСКОЕ ОБЕСПЕЧЕНИЕ.
3.1 Выбор и обоснование языка программирования
Для реализации поставленной задачи и разработки программного продукта я решил использовать Dev C++ 5. Вообще Dev C++- Dev-C++ -- свободная интегрированная среда разработки приложений для языков программирования C/C++. В дистрибутив входит компилятор MinGW. Сам Dev-C++ написан на Delphi. Распространяется согласно GPL.
Конечно, существует множество средств разработки, каждый любит больше свою, к которой привык. Некоторые умудряются пользоваться несколькими средами и языками программирования. Однако, можно дать некоторые объяснения выгодной позиции Dev С++.
Достоинства Dev С++:
1) графический интерфейс;
2) русскоязычное меню ;
3) встроенный отладчик GDB;
4) возможность создавать консольные и графические программы.
3.2 Выбор и обоснование среды визуального проектирования
В качестве среды визуализации модели для реализации поставленной задачи была выбрана библиотека OpenGL.
OpenGL переводится как Открытая Графическая Библиотека (Open Graphics Library). Программы, использующие OpenGL, гарантируют одинаковый визуальный результат во многих операционных системах - на персональных компьютерах, на рабочих станциях и на суперкомпьютерах.
С точки зрения программиста, OpenGL - это программный интерфейс для графических устройств (например, графических ускорителей). Он включает в себя около 150 различных функций, с помощью которых программист может задавать свойства различных трехмерных и двумерных объектов и выполнять их визуализацию (рендеринг). Т.е. в программе надо задать местоположение объектов в трехмерном пространстве, определить другие параметры (поворот, растяжение, ...), задать свойства объектов (цвет, текстура, материал, ...), положение наблюдателя, а затем библиотека OpenGL выполнит генерацию двумерной проекции этой трехмерной сцены
Возможности OpenGL, предоставляемые программисту, можно разделить на несколько групп:
- геометрические и растровые примитивы. На основе этих примитивов строятся все остальные объекты. Геометрические примитивы - это точки, отрезки и многоугольники. Растровыми примитивами являются битовые массивы (bitmap) и изображения (image).
- сплайны. Сплайны применяются для построения гладких кривых по опорным точкам.
- видовые и модельные преобразования. Эти преобразования позволяют задавать пространственное расположение объектов, изменять форму объектов и задавать положение камеры, для которой OpenGL строит результирующее проекционное изображение.
- работа с цветом. Для операций с цветом в OpenGL есть режим RGBA (красный- зелёный-синий-прозрачность) и индексный режим (цвет задается порядковым но- мером в палитре).
- удаление невидимых линий и поверхностей.
- двойная буферизация. В OpenGL доступна и одинарная, и двойная буферизация. Двойная буферизация применяется для устранения мерцания при мультипликации. При этом изображение каждого кадра сначала рисуется в невидимом буфере, а на экран кадр копируется только после того, как полностью нарисован.
- наложение текстуры. Текстуры упрощают создание реалистичных сцен. Если на объект, например, сферу, наложить текстуру (некоторое изображение), то объект будет выглядеть иначе (например, сфера будет выглядеть как разноцветный мячик).
- cглаживание. Автоматическое сглаживание компенсирует ступенчатость, свойственную растровым дисплеям. При сглаживании отрезков OpenGL изменяет интенсивность и цвет пикселей так, что эти отрезки отображаются на экране без "зигзагов".
- освещение. Указание расположения, интенсивности и цвета источников света.
- специальные эффекты. Например, туман, дым, прозрачность объектов. Эти средства позволяют сделать сцены более реалистичными.
3.3 Минимальные требования к технической базе
ь Платформа Windows XP/Vista/7
ь Процессор c тактовой частотой 1000 МГц
ь Память: 512 Мб (рекомендуется 1Гб)
ь Видеокарта c поддержкой PixelShaderModel 1.1 минимум
ь DirectX 9.0c и позднее
ь MicrosoftFramework 3.5 и позднее
алгоритм визуализация интерактивный модель
4. ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ РЕШЕНИЯ ЗАДАЧИ.
4.1 Реализация построения интерактивной модели
Трехмерное моделирование дает возможность реалистично создавать абсолютно фантастические проекты или напротив, точно воспроизводить реальный мир. В данном разделе будет приведено поэтапное описание создания интерактивной модели шахматной фигуры. Каждый этап ее создания снабжен необходимыми комментариями.
Этап 1: Построение.
Сначала сохраняем текущую видовую матрицу. Создаем объект quadric-объект, который используется для упрощения построений некоторых поверхностей второго порядка. Устанавливаем стиль фигуры. GLU_FILL - фигура закрашивается полностью. Рисуется цилиндр с параметрами: маленький радиус, большой радиус, количество частей вокруг оси Z, количество частей вдоль оси Z. Освобождаем память, занимаемую под quadObj.
glPushMatrix();
quadObj = gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluCylinder(quadObj, .3, .6, 2, 20, 20);
gluDeleteQuadric(quadObj);
Затем рисуем тор и сферу заданного радиуса и сдвигаем по оси Z.Устанавливаем цвет фигуры. Создаем quadObj объект. Рисуем диск с параметрами: маленький радиус, большой радиус, количество частей вокруг оси Z, количество частей вдоль оси Z. Освобождаем память, занимаемую под quadObj. Возвращаемся к сохраненной видовой матрице
auxSolidTorus(0.1, 0.5);
auxSolidTorus(0.1, 0.4);
glTranslated(0, 0, -.2);
auxSolidTorus(0.1, 0.3);
glTranslated(0, 0, -.6);
auxSolidSphere(.6);
glTranslated(0,0,2.6);
auxSolidTorus(0.2, .7);
glTranslated(0,0,.3);
auxSolidTorus(0.2, .7);
glTranslated(0,0,.2);
glColor3d(1,0,0);
quadObj = gluNewQuadric();
gluDisk(quadObj,0, .6, 20, 20);
gluDeleteQuadric(quadObj);
glPopMatrix();
Этап 2: Текстурирование.
Текстура -- растровое изображение, накладываемое на поверхность полигона, из которых состоят 3d-модели, для придания ей цвета, окраски или иллюзии рельефа. Качество поверхности текстуры определяется текселями -- количеством пикселей на минимальную единицу текстуры.
Инициализируем текстуру. Определяет двумерный образ текстуры с параметрами: уровень блеска, компоненты блеска, ширина, высота, граница блеска, формат, тип, пиксели. Устанавливаем параметры текстуры. Первый параметр должен быть GL_TEXTURE_2D, второй - это какой атрибут надо поменять, третий - это значение, которое надо атрибуту присвоить. GL_TEXTURE_MAG_FILTER и GL_TEXTURE_MIN_FILTER говорят о качестве наложенных текстур. MAG_FILTER может быть только GL_NEAREST или GL_LINEAR. MIN_FILTER имеет еще несколько возсожных значений, но мы пока не будет на них заострять внимание. Затем включаем текстуры. Устанавливаем координаты текстур GL_TEXTURE_GEN_MODE - определяет символическое имя текстура-координатного поколения функциональные или функциональные параметры.
GL_OBJECT_LINEAR- определяет указатель в массив параметров поколения текстуры.
photo_image = auxDIBImageLoad("00.bmp");
glTexImage2D(GL_TEXTURE_2D, 0, 3,
photo_image->sizeX,
photo_image->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
Пример текстуры приведен на рисунке 1
Рисунок 1 - текстура для созданной фигуры.
4.2 Программная реализация
Графический интерфейс написан на Dev C++. Этапы реализации:
1) Инициализируем библиотеку OpenGl
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include "glaux.h"
2) Создаем окно программы и анимацию вращения
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
HWND hWnd;//Содержит дискриптор окна
HDC hDC;//Приватный контекст GDI устройства
HGLRC hRC//Постоянный контекст отображения
int figure;
unsigned int photo_tex;//целое (число) без знака
AUX_RGBImageRec* photo_image;
GLUquadricObj *quadObj;//Создаем quadObj объект
HMENU menu;
int alpha = 0;
foat xrot = 0.0f;// Вращение по оси X
float yrot = 0.0f;// Вращение по оси Y
float zrot = 0.0f;// Вращение по оси Z
int Render(void)//рендеринг объекта на экран
{ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glColor3d(1.,1.,1.);
xrot+=2.0f;//увеличить значение переменной вращения по X
yrot+=5.0f;//увеличить значение переменной вращения по Y
zrot+=8.0f;//увеличить значение переменной вращения по Z
glRotatef(xrot,0.0f,0.0f,1.0f);//вращение по оси X
glRotatef(yrot,0.0f,2.0f,0.0f);//вращение по оси Y
glRotatef(zrot,1.0f,0.0f,0.0f);//вращение по оси Z
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - функция будет получать сообщения. которые Windows будет отсылать окну.
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);- включение использования.
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);- выключение использования.
AUX_RGBImageRec* photo_image;- эта функция вызывается всякий раз, когда поступает сообщение от мыши.
HMENU menu;- идентификатор строки меню, раскрывающееся меню или подменю, которое будет изменено.
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - очистка экрана и буфера глубины.
glLoadIdentity(); - считывает текущую матрицу.
glColor3d(1.,1.,1.); - устанавливает новые RGBA компоненты для текущего цвета.
3) Рисуем фигуры
// Рисуем ПЕШКУ
///////////////
if (figure == 0) {
glPushMatrix();
quadObj = gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluCylinder(quadObj, .3, .6, 2, 20, 20);
gluDeleteQuadric(quadObj);
auxSolidTorus(0.1, 0.5);
auxSolidTorus(0.1, 0.4);
glTranslated(0, 0, -.2);
auxSolidTorus(0.1, 0.3);
glTranslated(0, 0, -.6);
auxSolidSphere(.6);
glTranslated(0,0,2.6);
auxSolidTorus(0.2, .7);
glTranslated(0,0,.3);
auxSolidTorus(0.2, .7);
glTranslated(0,0,.2);
glColor3d(1,0,0);
quadObj = gluNewQuadric();
gluDisk(quadObj,0, .6, 20, 20);
gluDeleteQuadric(quadObj);
glPopMatrix();
}
//конец пешки
/////////////
// ОФИЦЕР
if (figure == 1) {
quadObj = gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_FILL);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
gluCylinder(quadObj, .2, .7, 3.2, 20, 20);
glTranslated(0,0,.4);
glTranslated(0,0,-.2);
gluDisk(quadObj, 0, .7, 15, 15);
glTranslated(0,0,-.1);
auxSolidTorus(.1, .7);
glTranslated(0,0,-.1);
gluDisk(quadObj, 0, .7, 15, 15);
glTranslated(0,0,-.1);
auxSolidTorus(.1, .4);
glTranslated(0,0,-.2);
auxSolidTorus(.1, .4);
glTranslated(0,0,-.6);
gluCylinder(quadObj, .7, .3, .6, 20, 20);
glTranslated(0,0,-.6);
gluCylinder(quadObj, .3, .7, .6, 20, 20);
glTranslated(0,0,-.2);
gluCylinder(quadObj, .3, .3, .3, 20, 20);
auxSolidTorus(.1,.2);
glTranslated(0,0,-.1);
gluDisk(quadObj, 0, .2, 15, 15);
glTranslated(0,0,3.7);
auxSolidTorus(0.2, .6);
glTranslated(0,0,.6);
auxSolidTorus(0.3, .8);
auxSolidTorus(0.3, .7);
glTranslated(0,0,.4);
auxSolidTorus(0.3,.8);
glTranslated(0,0,.3);
glColor3d(1,0,0);
gluDisk(quadObj,0, .8, 20, 20);
}
//конец офицеру
///////////////
//рисуем ЛАДЬЮ
////////////////
if (figure == 2) {
quadObj = gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_FILL);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
gluCylinder(quadObj, .5, .6, 2.3, 20, 20);
glTranslated(0,0,.4);
glTranslated(0,0,-.3);
auxSolidTorus(.1, .6);
glTranslated(0,0,-.3);
auxSolidTorus(.2, .6);
glTranslated(0,0,-.5);
gluCylinder(quadObj, .8, .5, .4, 20, 20);
gluDisk(quadObj, 0, .8, 15, 15);
glTranslated(0,-.6,-.1);
auxSolidBox(.3, .3, .2);
glTranslated(0,1.2,0);
auxSolidBox(.3, .3, .2);
glTranslated(0,-.6,0);
glTranslated(.6,0,0);
auxSolidBox(.3, .3, .2);
glTranslated(-1.2,0,0);
auxSolidBox(.3, .3, .2);
glTranslated(.6, 0,0);
glTranslated(0,0,2.8);
auxSolidTorus(0.2, .6);
glTranslated(0,0,.6);
auxSolidTorus(0.3, .8);
auxSolidTorus(0.3, .7);
glTranslated(0,0,.4);
auxSolidTorus(0.3,.8);
glTranslated(0,0,.3);
glColor3d(1,0,0);
gluDisk(quadObj,0, .8, 20, 20);
}
//конец ладье
// ФЕРЗЬ
if (figure == 3) {
quadObj = gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_FILL);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
gluCylinder(quadObj, .2, .7, 2.6, 20, 20);
glTranslated(0,0,.4);
glTranslated(0,0,-.2);
gluDisk(quadObj, 0, .7, 15, 15);
glTranslated(0,0,-.1);
auxSolidTorus(.1, .7);
glTranslated(0,0,-.1);
gluDisk(quadObj, 0, .7, 15, 15);
glTranslated(0,0,-.1);
auxSolidTorus(.1, .4);
glTranslated(0,0,-.2);
auxSolidTorus(.1, .4);
glTranslated(0,0,-.8);
gluCylinder(quadObj, .7, .3, 1, 20, 20);
gluDisk(quadObj, 0, .7, 15, 15);
glTranslated(0,0,-.1);
auxSolidTorus(.1, .3);
glTranslated(0,0,-.1);
gluDisk(quadObj, 0, .3, 15, 15);
glTranslated(0,0,-.6);
auxSolidBox(.3, .3, 1);
auxSolidBox(.3, .6, .3);
glTranslated(0,0,4);
auxSolidTorus(0.2, .6);
glTranslated(0,0,.6);
auxSolidTorus(0.3, .8);
auxSolidTorus(0.3, .7);
glTranslated(0,0,.4);
auxSolidTorus(0.3,.8);
glTranslated(0,0,.3);
glColor3d(1,0,0);
gluDisk(quadObj,0, .8, 20, 20);
}
//конец ферзя
///////////////
// КОРОЛЬ
if (figure == 4) {
quadObj = gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_FILL);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
gluCylinder(quadObj, .2, .7, 2.6, 20, 20);
glTranslated(0,0,.4);
glTranslated(0,0,-.2);
gluDisk(quadObj, 0, .7, 15, 15);
glTranslated(0,0,-.1);
auxSolidTorus(.1, .7);
glTranslated(0,0,-.1);
gluDisk(quadObj, 0, .7, 15, 15);
glTranslated(0,0,-.1);
auxSolidTorus(.1, .4);
glTranslated(0,0,-.2);
auxSolidTorus(.1, .4);
glTranslated(0,0,-.8);
gluCylinder(quadObj, .7, .3, 1, 20, 20);
glTranslated(0,0,-.4);
gluCylinder(quadObj, .2, .7, .4, 20, 20);
glTranslated(0,0,-.1);
auxSolidTorus(.1,.2);
glTranslated(0,0,-.3);
auxSolidIcosahedron(.3);
glTranslated(0,0,4);
auxSolidTorus(0.2, .6);
glTranslated(0,0,.6);
auxSolidTorus(0.3, .8);
auxSolidTorus(0.3, .7);
glTranslated(0,0,.4);
auxSolidTorus(0.3,.8);
glTranslated(0,0,.3);
glColor3d(1,0,0);
gluDisk(quadObj,0, .8, 20, 20);
}
//конец королю
///////////////
SwapBuffers(wglGetCurrentDC());
return 0;
}
SwapBuffers(wglGetCurrentDC()); - обмен буферов. WglGetCurrentDC функция получает ссылку на контекст устройства, связанный с текущей OpenGL рендеринг контексте вызывающего потока.
4) Создаем меню
int MenuCreate(HINSTANCE hinstance{
menu = CreateMenu();//создаем меню
HMENU Figures = CreateMenu();
AppendMenu(Figures, MF_STRING, 101, "Pawn");
AppendMenu(Figures, MF_STRING, 102, "Bishop");
AppendMenu(Figures, MF_STRING, 103, "Rook");
AppendMenu(Figures, MF_STRING, 104, "King");
AppendMenu(Figures, MF_STRING, 105, "Queen");
AppendMenu(menu , MF_POPUP, (UINT) Figures, "Figures");
HMENU Texture = CreateMenu();//создаем меню текстур
int i = 200;
WIN32_FIND_DATA fd;//структура для функций поиска файлов.
HANDLE fh;
if ((fh = FindFirstFile("*.bmp", &fd))==NULL)
AppendMenu(Texture, MF_STRING, 200, "Texture NotFound"); else{
AppendMenu(Texture, MF_STRING, 200, fd.cFileName);
while (FindNextFile(fh, &fd)){
i++;
AppendMenu(Texture, MF_STRING, i, fd.cFileName);
}
}
AppendMenu(menu , MF_POPUP, (UINT)Texture, "Textures");
return 0;
}
int MenuCreate(HINSTANCE hinstance) - возвращает уникальный номер созданного объекта.
AppendMenu(Figures, MF_STRING, 101, "Pawn"); -добавляет в конец заданной строки меню, "выпадающего" меню, подменю или контекстного меню новый пункт
5) Создаем WinMain.
WinMain вызывается системой как начальная точка входа, для базирующейся на Windows, прикладной программы.
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,// указатель на командную строку
int iCmdShow)// показывает состояние окна
{
WNDCLASS wc;
MSG msg;
BOOL bQuit = FALSE;
/* register window class */
wc.style = CS_OWNDC;// Флажок частного DC
wc.lpfnWndProc = WndProc;//указатель на оконную процедуру
wc.cbClsExtra = 0;// доп. данных для класса нет
wc.cbWndExtra = 0;// доп. данных для окна нет
wc.hInstance = hInstance;// программа-владелец класса
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); // значок класса
wc.hCursor = LoadCursor (NULL, IDC_ARROW);// курсор класса
wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
wc.lpszMenuName = NULL;// меню класса
wc.lpszClassName = "GLSample";// имя класса
RegisterClass (&wc);// Регистрация класса окна.
hWnd = CreateWindow (
"GLSample", "OpenGL Sample",
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0, 0, 600, 600,
NULL, NULL, hInstance, NULL);//создание непосредственно окна.
SetTimer(hWnd, 3, 70, NULL);//Таймер
MenuCreate(hInstance);//возвращает уникальный номер созданного объекта.
SetMenu(hWnd, menu);
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
/* enable OpenGL for the window */
EnableOpenGL (hWnd, &hDC, &hRC);
/* program main loop */
while (!bQuit)
{
/* check for messages */
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
/* handle or dispatch messages */
if (msg.message == WM_QUIT)/
{
bQuit = TRUE;
}
else
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
/*else
{SwapBuffers (hDC);
theta += 1.0f;// Представление угла
Sleep (1);//производит задержку в 1 милисекунду,
}*/
}
/* shutdown OpenGL */
DisableOpenGL (hWnd, hDC, hRC);
/* destroy the window explicitly */
DestroyWindow (hWnd);
return msg.wParam; }
HINSTANCE hInstance - дескриптор текущего экземпляра окна
HINSTANCE hPrevInstance - дескриптор предыдущего экземпляра окна
WNDCLASS wc; - Заполним поля структуры класса окна параметрами, которые описаны в главном окне.
wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH); - фон класса
Функция CreateWindow создает перекрывающее, выскакивающее или дочернее окно. Она определяет класс, заголовок, стиль окна и (необязательно) начальную позицию и размер окна. Функция также определяет и окно родителя или владельца, если таковые имеются и меню окна.
SetMenu(hWnd, menu);- устанавливает и пеpеpисовывает меню окна как меню, опpеделенное паpаметpом Menu
ShowWindow( hWnd, SW_SHOWDEFAULT ); -устанавливает состояние показа определяемого окна. SW_SHOWDEFAULT - устанавливает состояние показа, основанное на флажке SW_, определенном в структуре STARTUPINFO, переданной в функцию CreateProcess программой, которая запустила прикладную программу.
UpdateWindow( hWnd ); - обновляет рабочую область заданного окна, отправляя сообщение WM_PAINT окну, если регион обновления окна не пуст
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))- функция PeekMessage распределяет входящие отправленные (асинхронные) сообщения, проверяет помещенные в очередь (синхронные) сообщения очереди сообщений потока и извлекает сообщение (если таковое имеется).PM_REMOVE Сообщения удаляются из очереди после обработки функцией PeekMessage.
if (msg.message == WM_QUIT)-cooбщение WM_QUIT указывает запрос, чтобы завершить прикладную программу и создается, когда из прикладной программы вызвана функция PostQuitMessage.
TranslateMessage (&msg);-функция TranslateMessage переводит сообщения виртуальных клавиш в символьные сообщения. Символьные сообщения помещаются в очереди сообщений вызывающего потока для прочтения в следующий раз, когда поток вызовет функцию GetMessage или PeekMessage
DispatchMessage (&msg); - функция DispatchMessage распределяет сообщение оконной процедуре. Обычно она используется, чтобы доставить сообщение, извлеченное функцией GetMessage
SwapBuffers (hDC); - функция SwapBuffers заменяет внешнюю сторону и буферизует если текущий формат пикселя для окна ссылавшегося определенным контекстом устройства включает обратный буфер.
DestroyWindow (hWnd); - функция DestroyWindow разрушает заданное окно. Функция отправляет сообщения WM_DESTROY и WM_NCDESTROY окну, чтобы деактивировать его и удалить фокус клавиатуры из него. Функция также уничтожает меню окна, очищает очередь потоков сообщений, уничтожает таймеры, удаляет монопольное использование буфера обмена и разрывает цепочку просмотра окон буфера обмена (если окно имеет наверху цепочку просмотров).
return msg.wParam; - эта функция вызывается Windows 2000 и пересылает сообщения из очереди сообщений.
6) Window Procedure
Window procedure, она же процедура обработки сообщений, message
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{ switch (message)
{ case WM_COMMAND:
{if ((LOWORD(wParam)>=100)&&(LOWORD(wParam)<200)) figure = LOWORD(wParam) - 101;
if ((LOWORD(wParam)>=200)&&(LOWORD(wParam)<=300)){
CHAR buf[200];
GetMenuString(menu, LOWORD(wParam), buf, sizeof(buf), MF_BYCOMMAND);
photo_image = auxDIBImageLoad(buf);
glTexImage2D(GL_TEXTURE_2D, 0, 3, photo_image->sizeX,
photo_image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data);
return 0;
}
case WM_CREATE:
return 0;
case WM_CLOSE:
PostQuitMessage (0);
return 0;
case WM_DESTROY:
return 0;
case WM_TIMER:
{
alpha = alpha++ % 360;
Render();
return 0;
}
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
return 0;
}
return 0;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) - объявляем строку-имя программы
if (LOWORD(wParam)>=200)&&(LOWORD(wParam)<=300)) - выделяет из 32-битового целочисленного значения младшее слово.
GetMenuString(menu, LOWORD(wParam), buf, sizeof(buf), MF_BYCOMMAND); - функция GetMenuString копирует текстовую строку определяемого пункта меню в заданный буфер.MF_BYCOMMAND - Указывает, что uIDItem дает идентификатор пункта меню. Если ни флажок MF_BYCOMMAND, ни флажок MF_BYPOSITION не установлен, флажок MF_BYCOMMAND является флажком, заданным по умолчанию.
glTexImage2D(GL_TEXTURE_2D, 0, 3, photo_image->sizeX,
photo_image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data); - функция glTexImage2D определяет двумерный образ текстуры
case WM_CREATE: - отправляется тогда, когда программа запрашивает, какое окно будет создаваться вызовом функции CreateWindowEx или CreateWindow
case WM_CLOSE: - сообщение WM_CLOSE отправляется как сигнал, по которому окно или прикладная программа должны завершить свою работу
PostQuitMessage (0); - функция PostQuitMessage указывает системе, что поток сделал запрос на то, чтобы завершить свою работу (выйти). Это обычно используется в ответ на сообщение WM_DESTROY
case WM_DESTROY: - сообщение WM_DESTROY отправляется тогда, когда окно разрушается. Оно отправляется оконной процедуре разрушаемого окна после того, как окно удаляется с экрана.
case WM_TIMER: - сообщение WM_TIMER отправляется в очередь сообщений установившего таймер потока или соответствующей функции обратного вызова TimerProc по истечении интервала, заданного при установке таймера функцией SetTimer .
case WM_KEYDOWN: - сообщение WM_KEYDOWN уведомляет окно с фокусом, что была нажата несистемная клавиша. Несистемные клавиша - если одновременно не нажат ALT ключ.
case VK_ESCAPE: - выполняет действия, которые если клавиша нажата esc
return DefWindowProc (hWnd, message, wParam, lParam); - функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.
7) Enable OpenGL
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
PIXELFORMATDESCRIPTOR pfd int iFormat;
/* get the device context (DC) */
*hDC = GetDC (hWnd);
/* set the pixel format for the DC */
ZeroMemory (&pfd, sizeof (pfd));
pfd.nSize = sizeof (pfd);//Размер структуры
pfd.nVersion = 1;//Версия
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;// флаги
pfd.iPixelType = PFD_TYPE_RGBA;// тип пикселя
pfd.cColorBits = 24;// 24 бита напиксель
pfd.cRedBits = 8;
pfd.cRedShift = 16;
pfd.cGreenBits = 8;
pfd.cGreenShift = 8;
pfd.cBlueBits = 8;
pfd.cBlueShift = 0;
pfd.cAlphaBits = 0;
pfd.cAlphaShift = 0;
pfd.cAccumBits = 64;
pfd.cAccumRedBits = 16;
pfd.cAccumGreenBits = 16;
pfd.cAccumBlueBits = 16;
pfd.cAccumAlphaBits = 0;
pfd.cDepthBits = 16;//Определяет глубину глубины (z-axis) буфера.
pfd.cStencilBits = 8;//Определяет глубину буфера шаблона.
pfd.cAuxBuffers = 0;
pfd.iLayerType = PFD_MAIN_PLANE;// тип слоя
pfd.bReserved = 0;//Не использованное. Должно - нулевым.
pfd.dwLayerMask = 0;
pfd.dwVisibleMask = 0;
pfd.dwDamageMask = 0;
iFormat = ChoosePixelFormat (*hDC, &pfd);
if(iFormat == 0) iFormat = 1;
SetPixelFormat (*hDC, iFormat, &pfd);
/* create and enable the render context (RC) */
*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );
glEnable(GL_ALPHA_TEST);//- разрешить прозрачностью
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);//разрешает использование источника света
glEnable(GL_LIGHT0);//включает источник света под номером "0".
glEnable(GL_BLEND);//включает режим смешения цветов.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
float pos[4] = {2,2,2,1};
float spec[4] = {1,1,1,1};
float dir[3] = {-1,-1,-1};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec);
float ambient[4] = {0.4, 0.4, 0.4, 1};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);//освещение
photo_image = auxDIBImageLoad("00.bmp");
glTexImage2D(GL_TEXTURE_2D, 0, 3,
photo_image->sizeX,
photo_image->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, -10,10);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
PIXELFORMATDESCRIPTOR pfd; - cтруктура PIXELFORMATDESCRIPTOR описывает формат пикселя чертежа поверхности.
glMatrixMode( GL_MODELVIEW ); - прилагает последующие матричные действия к матричной кипе modelview
gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); - функция gluLookAt создает рассматривающий матричный производный от точки глаза, контрольная точка, указывающих центр сцены, и up вектор.
glOrtho(-5,5, -5,5, -10,10); - функция glOrtho умножает текущую матрицу орфографической матрицей.Параметры:Определите координаты для левого и правого вертикального отсечения плоскостей.Определите координаты для низа и завершайте горизонтальное отсечение плоскостей.Определите расстояниям в nearer и далее глубину, вырезать плоскости. Эти расстояния являются негативом если плоскость должна быть за зрителем.
glLoadIdentity(); - функция glLoadIdentity заменяет текущую матрицу на единичную
glMatrixMode( GL_PROJECTION ); - функция glMatixMode определяет, что какая матрица является текущей матрицей.GL_PROJECTION - матрица проекций
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir); - массивы pos и dir содержат координаты местоположения лампы и направления, куда она светит. Массив dir содержит три координаты - x,y,z. Массив pos - четыре, назначение четвертого мне не очень ясно. Если его значение отличается от нуля, то изображение вполне логичное получается. Если же он ноль, то получается что-то непотребное.
GL_ONE_MINUS_SRC_ALPHA); - функция glBlendFunc определяет арифметику пикселя.Определяет как красный, зеленый, синий, и буквенные исходные-стыковочные показатели вычислены.
wglMakeCurrent( *hDC, *hRC ); - функция wglMakeCurrent делает определенный OpenGL, предоставляющее контекст вызов резьбы текущего предоставления контекста.
SetPixelFormat (*hDC, iFormat, &pfd); - функция SetPixelFormat устанавливает контекстный пиксель определенного формата устройства в формат определенный индексом iPixelFormat.
pfd.dwDamageMask = 0; - определяет независимо более, чем одним акциям формата пикселя тот же фреймовый буфер. Если результат поразрядного-И аварийных масок между двумя форматами пикселя - не равным нулю, тогда они распространяют те же буферы.
pfd.dwVisibleMask = 0; - определяет видимую маску. Видимая маска использована в связи (вместе)с маской слоя, чтобы определяться если один слой перекрывает другой. Если результат поразрядного-И видимой маски слоя и маска слоя слоя секунды ненулевое, тогда первый слой перекрывает второй слой, и прозрачная величина пикселя существует между двумя слоями. Если видимая маска - 0, слой непрозрачный.
pfd.dwLayerMask = 0; - определяет маску слоя. Маска слоя использована в связи (вместе)с видимой маской, чтобы определяться если один слой перекрывает другой.
pfd.cAuxBuffers = 0; - определяет количество вспомогательных буферов. Вспомогательные буферы не поддерживаны
pfd.cAlphaShift = 0; - определяет что сдвиг имеет значение альфу bitplanes в каждом цветном буфере RGBA. Альфа bitplanes не поддерживана.
ZeroMemory (&pfd, sizeof (pfd)); - функция ZeroMemory заполняет указанный фрагмент памяти нулями
*hDC = GetDC (hWnd); - функция GetDC извлекает дескриптор контекста дисплея для клиентской области указанного окна. Контекст дисплея может быть использован в последующих функциях GDI для рисования в клиентской области окна.
glEnable(GL_COLOR_MATERIAL); - GL_COLOR_MATERIAL - разрешает использовать цвета при включенном источнике света.
pfd.cRedBits = 8; - определяет число красных bitplanes в каждом цветном буфере RGBA.
pfd.cRedShift = 16; - определяет что сдвиг имеет значение красные bitplanes в каждом цветном буфере RGBA.
pfd.cGreenBits = 8;- определяет число зеленный bitplanes в каждом цветном буфере RGBA.
pfd.cGreenShift = 8;- определяет что сдвиг имеет значение зеленный bitplanes в каждом цветном буфере RGBA.
pfd.cBlueBits = 8;- определяет число голубой bitplanes в каждом цветном буфере RGBA.
pfd.cBlueShift = 0;- определяет что сдвиг имеет значение голубой bitplanes в каждом цветном буфере RGBA.
pfd.cAlphaBits = 0; - определяет номер альфы bitplanes в каждом цветном буфере RGBA. Альфа bitplanes не поддерживана.
pfd.cAccumBits = 64; - определяет общее число bitplanes в буфере накопления.
pfd.cAccumRedBits = 16; - определяет число красных bitplanes в буфере накопления.
pfd.cAccumGreenBits = 16; - определяет число зеленный bitplanes в буфере накопления.
pfd.cAccumBlueBits = 16; - определяет число голубой bitplanes в буфере накопления.
pfd.cAccumAlphaBits = 0; - определяет номер альфы bitplanes в буфере накопления.
glEnable(GL_DEPTH_TEST);//устанавливает режим проверки глубины пикселей
8) Disable OpenGL
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)//выкл использования
{
wglMakeCurrent (NULL, NULL);
wglDeleteContext (hRC);
ReleaseDC (hWnd, hDC);
}
wglMakeCurrent (NULL, NULL); - функция wglMakeCurrent делает определенный OpenGL, предоставляющее контекст вызов резьбы текущего предоставления контекста.
wglDeleteContext (hRC); - функция wglDeleteContext удаляет определенный OpenGL, предоставляющее контекст.
ReleaseDC (hWnd, hDC); - функция ReleaseDC освобождает контекст устройства (DC) для использования другими приложениями.
5 .ПРИМЕРЫ ЭКРАННЫХ ФОРМ
При запуске программы видим главное окно программы. Пример экранной формы приведён на рисунке 2.
Рисунок 2 - готовая программа
При выборе пункта меню «Figures -Bishop» выбираем шахматную фигуру «Офицер». Пример на рисунке 3.
Рисунок 3-шахматная фигура «Офицер»
При выборе пункта меню «Figures -Rook» выбираем шахматную фигуру «Ладья». Пример на рисунке 4.
Рисунок 4 - шахматная фигура «Ладья»
При выборе пункта меню «Figures -King» выбираем шахматную фигуру «Король». Пример на рисунке 5.
Рисунок 5 - шахматная фигура «Король»
При выборе пункта меню «Figures -Queen» выбираем шахматную фигуру «Ферзь». Пример на рисунке 6.
Рисунок 6 - шахматная фигура «Ферзь»
При выборе пункта меню «Textures -00.bmp» выбираем текстуру шахматной фигуры . Пример на рисунке 7.
Рисунок 7- текстура «00.bmp»
При выборе пункта меню «Textures -08.bmp» выбираем металлическую текстуру шахматной фигуры . Пример на рисунке 8.
Рисунок 8 - текстура «08.bmp»
ЗАКЛЮЧЕНИЕ
В данной курсовой работе я ознакомился с основами проектирования 3D моделей реального мира в программном продукте Dev C++ а так же освоил программирование с использованием OpenGL.
В заключение хотелось бы сказать что c точки зрения программиста, OpenGL - это программный интерфейс для графических устройств (например, графических ускорителей). Он включает в себя около 150 различных функций, с помощью которых программист может задавать свойства различных трехмерных и двумерных объектов и выполнять их визуализацию (рендеринг). Т.е. в программе надо задать местоположение объектов в трехмерном пространстве, определить другие параметры (поворот, растяжение, ...), задать свойства объектов (цвет, текстура, материал, ...), положение наблюдателя, а затем библиотека OpenGL выполнит генерацию двумерной проекции этой трехмерной сцены.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. А.А. Богуславский, С.М. Соколов Основы программирования на языке Си++ Часть II. Основы программирования трехмерной графики. - Коломна 2002. - 104 с.
2. Фленов М.Е. Искусство программирования игр на С++ / М.Е. Фленов - СПб.: БХВ, Петербург 2006. - 256 с.
3. Фаппас К. Программирование на С и С++/ К. Фаппас, У. Мюррей.-Киев.: Издательская группа BHV, 2000.-320 с.
4. Фореев В.Н. Компьютерная графика/ В.Н. Фореев. - СПб.: БХВ, 2002. - 432 с.
Размещено на Allbest.ur
Подобные документы
Анализ и постановка задач дисциплины "Компьютерная графика". Разработка структуры, функциональной схемы и программной документации. Руководство программисту и оператору. Выбор и обоснование языка программирования. Описание процедур, функций, оценок.
дипломная работа [3,6 M], добавлен 16.11.2011Алгоритм генерации фрактальных ландшафтов. Обоснование выбора языка программирования. Требования к параметрам технических средств. Документация по работе с библиотекой. Составляющие трехуровневого анализа продукта. Основы технико-экономических расчетов.
дипломная работа [1,3 M], добавлен 17.07.2016Разработка компьютерной игры, выбор структур, используемых данных, технологии, языка и среды программирования. Алгоритм и программа для реализации игры, функциональные возможности и сопровождение разрабатываемой системы. Выбор стратегии тестирования.
курсовая работа [341,9 K], добавлен 19.04.2011Выбор и обоснование методов составления схемы алгоритма и разработки программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Алгоритм Горнера. Программа на языке Quick BASIC (с распечаткой листинга).
курсовая работа [55,1 K], добавлен 21.11.2012Построение систем визуализации моделей раскроя и их модификации. Анализ способов и методов создания универсального хранилища данных, на примере построения динамически формируемого информационного файла. Графические возможностей языка высокого уровня С.
научная работа [355,5 K], добавлен 06.03.2009Современные алгоритмы машинной графики. Алгоритмы построения изображения. Глобальная модель освещения Уиттеда. Выбор и обоснование языка и среды программирования. Вспомогательные классы свойств трехмерных объектов. Условия применения программы.
курсовая работа [785,7 K], добавлен 24.06.2009Разработка пособия для специальности "Вычислительная техника и программное обеспечение", ее алгоритм. Технические характеристики и требования к интерфейсу. Минимальные требования программы. Описание процедуры создания и вывода информации в WebBrowser.
курсовая работа [3,4 M], добавлен 04.01.2016Минимальные технические требования для работы с программным продуктом. Требования к условиям выполнения работ по проектированию. Выбор среды и языка программирования. Требования к функционированию. Инфологическая модель структуры хранения данных.
дипломная работа [3,3 M], добавлен 21.11.2011Требования к техническим, программным средствам разработки и функционированию программы. Обоснование выбранного языка программирования. Описание алгоритма решения задачи, тестирование ее основных функций. Понятие дружелюбного пользовательского интерфейса.
курсовая работа [85,9 K], добавлен 31.10.2014Разработка корпоративной и сети масштаба города (Metro Area Network, MAN) в программном продукте OpNet IT Guru Academic Edition v.9.1 и анализ полученных результатов. Определение профиля трафика, настройка оборудования, выбор типа собираемой статистики.
лабораторная работа [2,9 M], добавлен 04.02.2013