You are on page 1of 10

xtnФедеральное агентство по образованию

Государственное образовательное учреждение высшего


профессионального образования
«ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Факультет автоматики и вычислительной техники


Направление (специальность) – Информационные системы

Кафедра вычислительной техники

«Применение визуальных эффектов в OpenGL»:


Отчет по лабораторной работе № 5

по дисциплине компьютерная геометрия и графика

Исполнитель
студент, 8960 _________ Е. И. Блеч
(подпись)
_____________________
(дата)

Руководитель
доцент, к.т.н _________ О.С. Токарева
(подпись)
_____________________
(дата)

Вариант 12
Томск –2009
Цель работы: Изучить и освоить библиотеку OpenGL.

Задача: Напишите программу, в которой будет перемещаться


по горячим клавишам треугольник. Предусмотреть
возможность вращения и масштабирования.
1.Исходный текст программы:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <GL/gl.h> // Заголовочные файлы для библиотеки OpenGL32
#include <GL/glu.h> // Заголовочные файлы для библиотеки GLu32

#pragma hdrstop

#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;

BOOL bSetupPixelFormat(HDC hdc)


{
PIXELFORMATDESCRIPTOR pfd, *ppfd;
int pixelformat;

ppfd = &pfd;

ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_RGBA; ;// iPixelType – формат указания цвета -
цвет
ppfd->cColorBits = 16; // cColorBits – глубина цвета
ppfd->cDepthBits = 16; // cDepthBits – размер буфера глубины (Z-Buffer)

ppfd->cAccumBits = 0;
ppfd->cStencilBits = 0; // cStencilBits – размер буфера трафарета

// ChoosePixelFormat подбирает формат пикселей, максимально удовлетворяющий


нашим требованиям
if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)
{
MessageBox(NULL, "ChoosePixelFormat failed", "Error",MB_OK);
return FALSE;
}
// SetPixelFormat устанавливает его в контексте устройства (dc)
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
{
MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
return FALSE;
}
return TRUE;
}

//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle); //ghDC – дескриптор устройства , просто указатель на
окно)
rtri = 0.0;
if (!bSetupPixelFormat(ghDC)) Close();
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);

glClearColor(1.0, 1.0, 1.0, 1.0); // glClearColor устанавливает цвет (в нашем


случае белый), которым будет заполняться экран при очищении.

glViewport(0, 0, Width, Height);


glMatrixMode(GL_PROJECTION); // сообщает о том, что следующие две команды
будут воздействовать на матрицу проекции. Матрица проекции отвечает за
добавление в нашу сцену перспективного вида.

glLoadIdentity(); // функция работает подобно сбросу.


glOrtho(-7, 7, -7, 7, 2, 15);
gluLookAt(0, 0, 5, 0, 0, 0, 0, 1, 0); //позиционирует камеру, вид и головной
вектор. Первые три значения указывают на положение камеры. Следующие 3 значения
указывают точку визирования (направление камеры). ОбычныйПоследние три значения
указывают OpenGL направление головного вектора.

glMatrixMode(GL_MODELVIEW); // Обычныйлюбые новые трансформации будут


воздействовать на матрицу вида модели

glEnable(GL_COLOR_MATERIAL); // разрешили давать нашим объектам какой-то


цвет

glEnable(GL_DEPTH_TEST); // разрешили тест глубины, чтобы изображение было


объёмным

glEnable(GL_LIGHTING); // разрешили освещение


glEnable(GL_LIGHT0); // включили «лампочку №0»

// glLightfv устанавливает свойства «лампочек»:


float p[4] = {3, 3, 3, 1},
d[3] = {-1, -1, -3};
glLightfv(GL_LIGHT0, GL_POSITION, p); // позицию
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, d); // и направление света.

}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormResize(TObject *Sender)
{
glViewport(0, 0, Width, Height); // Сброс текущей области вывода
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
if(ghRC)
{
wglMakeCurrent(ghDC,0); // освободить контекст,
wglDeleteContext(ghRC); // разрушить
}
if(ghDC) ReleaseDC(Handle, ghDC);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::Draw()
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Очистить экран и буфер
глубины

// Начинаем рисовать треугольники


glBegin(GL_TRIANGLES);
glColor3f(1,0,0); // цвет
glVertex2f(0,0); // вершина треугольника

glColor3f(0,1,0);
glVertex2f(3,-2);

glColor3f(0,0,1);
glVertex2f(1,2);
glEnd(); // заканчиваем рисование треугольников

SwapBuffers(ghDC);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormKeyDown(TObject *Sender, WORD &Key,


TShiftState Shift)
{
Draw();
switch ( Key )
{
case VK_LEFT:
glPushMatrix(); // сохранить текущие координаты
glLoadIdentity(); // сброс
glTranslatef(0.0f,0.0f,-6.0f);
glRotatef(rtri,0.0f,1.0f,0.0f); // glRotatef(Angle,Xtrue,Ytrue,Ztrue)
rtri+= 10 ;// 0.2f;
break;
case VK_RIGHT:
glPushMatrix();
glLoadIdentity(); // сброс
glTranslatef(0.0f,0.0f,-6.0f);
glRotated(rtri,0.0,1.0,0.0);
rtri-= 10; //0.2f;
break;
case VK_UP:
glPushMatrix() ;
glLoadIdentity(); // сброс
glTranslatef(0.0f,0.0f,-6.0f);
glRotatef(rtri,1.0f,0.0f,0.0f);
rtri+= 10; // 0.2f;
break;
case VK_DOWN:
glPushMatrix();
glLoadIdentity(); // сброс
glTranslatef(0.0f,0.0f,-6.0f); // Сдвиг в глубь экрана и влево
glRotatef(rtri,1.0f,0.0f,0.0f);
rtri+= -10;// 0.2f;
break;
case '2':
case VK_ADD:
glPushMatrix();
glScalef(2.0f,2.0f,1.0f);
break;
case '1':
case VK_SUBTRACT:
glPushMatrix();
glScalef(0.5f,0.5f,1.0f);
break;
case 72: // <- h
glPushMatrix();
glTranslated(-1.0f,0.0f,0.0f);
break;
case 74: // down j
glPushMatrix();
glTranslated(0.0f,-1.0f,0.0f);
break;
case 75: // up k
glPushMatrix();
glTranslatef(0.0f,1.0f,0.0f);
break;
case 76: // -> l
glPushMatrix();
glTranslated(1.0f,0.0f,0.0f);
break;

case VK_SPACE:
glPopMatrix(); // вернуться к исходным координатам
break;
default:
bWork = false;
}
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormPaint(TObject *Sender)


{
Draw();
}
//---------------------------------------------------------------------------
1.Выполнение программы

Рис. 1. Исходное состояние.

Рис. 2. Увеличили фигуру в 2 раза.


Рис. 3. Уменьшили исходную фигуру в 2 раза.

Рис. 4. Сдвинули влево.


Рис. 5. Сдвинули вправо и вверх.

Рис. 6. Повернули относительно оси ОУ.


Рис. 7. Относительно ОХ.

Вывод: Изучены основные функции OpenGl,


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