МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
З В І Т
до лабораторної роботи №5
з курсу «Програмування комп’ютерної графіки»
на тему: «Квадрік-об'єкти. Камера»
Виконав:ст. гр. УІ-31
Прийняла:
Львів – 2011
Мета роботи.
Дослідження можливостей моделювання графічних об'єктів з використанням квадрик-об'єктів бібліотеки OPENGL; установка і використання камери; дослідження і порівняльний аналіз результатів, отриманих при переміщенні камери і при переміщенні об'єкту.
Варіант 1
Текст програми
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingTao.OpenGl;
usingTao.FreeGlut;
usingTao.Platform.Windows;
namespaceGeometricTransformation
{
publicpartialclass Form1 : Form
{
public Form1()
{
InitializeComponent();
// инициализация для работы с openGL
AnT.InitializeContexts();
}
// вспомогательныепеременные - в них будутхранитсяобработанныезначения,
// полученные при перетаскиванииползунковпользователем
double a = 0, b = 0, c = -5, d = 0, zoom = 1; // выбранные оси
int os_x = 1, os_y = 0, os_z = 0;
// режим сеточнойвизуализации
boolWire = false;
privatevoidForm1_Load(object sender, EventArgs e)
{
// инициализациябибилиотекиglut
Glut.glutInit();
// инициализациярежимаэкрана
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE);
// установка цвета очистки экрана (RGBA)
Gl.glClearColor(255, 255, 255, 1);
// установка портавывода
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
// активацияпроекционнойматрицы
Gl.glMatrixMode(Gl.GL_PROJECTION);
// очистка матрицы
Gl.glLoadIdentity();
// установка перспективы
Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.Height, 0.1, 200);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
// начальная настройка параметровopenGL (тест глубины, освещение и первыйисточниксвета)
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
// установка первыхэлементов в списках combobox
comboBox1.SelectedIndex = 0;
comboBox2.SelectedIndex = 0;
// активация таймера, вызывающегофункцию для визуализации
RenderTime.Start();
}
// обрабатываемотклик таймера
privatevoidRenderTimer_Tick(object sender, EventArgs e)
{
// вызываемфункциюотрисовкисцены
Draw();
}
// событиеизменениязначения
privatevoidtrackBar1_Scroll(object sender, EventArgs e)
{
// переводимзначение, установившееся в элементеtrackBar в необходимый нам формат
a = (double)trackBar1.Value / 1000.0;
// подписываемэтозначение в labelэлементеподданнымползунком
label4.Text = a.ToString();
}
// событиеизменениязначения
privatevoidtrackBar2_Scroll(object sender, EventArgs e)
{
// переводимзначение, установившееся в элементеtrackBar в необходимый нам формат
b = (double)trackBar2.Value / 1000.0;
// подписываемэтозначение в labelэлементеподданнымползунком
label5.Text = b.ToString();
}
// событиеизменениязначения
privatevoidtrackBar3_Scroll(object sender, EventArgs e)
{
// переводимзначение, установившееся в элементеtrackBar в необходимый нам формат
c = (double)trackBar3.Value / 1000.0;
// подписываемэтозначение в labelэлементеподданнымползунком
label6.Text = c.ToString();
}
// событиеизменениязначения
privatevoidtrackBar4_Scroll(object sender, EventArgs e)
{
// переводимзначение, установившееся в элементеtrackBar в необходимый нам формат
d = (double)trackBar4.Value;
// подписываемэтозначение в labelэлементеподданнымползунком
label6.Text = d.ToString();
}
// событиеизменениязначения
privatevoidtrackBar5_Scroll(object sender, EventArgs e)
{
// переводимзначение, установившееся в элементеtrackBar в необходимый нам формат
zoom = (double)trackBar5.Value / 1000.0;
// подписываемэтозначение в labelэлементеподданнымползунком
label6.Text = zoom.ToString();
}
// изменениязначениячекбокса
privatevoid checkBox1_CheckedChanged(objectsender, EventArgs e)
{
// еслиотмечен
if (checkBox1.Checked)
{
// устанавливаемсеточный режим визуализации
Wire = true;
}
else
{
// иначе - полигональнаявизуализация
Wire = false;
}
}
// изменение в элементахcomboBox
privatevoid comboBox1_SelectedIndexChanged(objectsender, EventArgs e)
{
// в зависимости от выбранногорежима
switch (comboBox1.SelectedIndex)
{
// устанавливаемнеобходимую ось (будетиспльзовано в функцииglRotate**)
case 0:
{
os_x = 1;
os_y = 0;
os_z = 0;
break;
}
case 1:
{
os_x = 0;
os_y = 1;
os_z = 0;
break;
}
case 2:
{
os_x = 0;
os_y = 0;
os_z = 1;
break;
}
}
}
// функцияотрисовки
privatevoidDraw()
{
// очистка буфера цвета и буфера глубины
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glClearColor(255, 255, 255, 1);
// очищениетекущейматрицы
Gl.glLoadIdentity();
// помещаемсостояниематрицы в стек матриц , дальнейшиетрансформациизатронуттольковизуализациюобъекта
Gl.glPushMatrix();
// производимперемещение, в зависимости от значений, полученных при перемещенииползунков
Gl.glTranslated(a, b, c);
// поворот по установленной оси
Gl.glRotated(d, os_x, os_y, os_z);
// и масштабированиеобъекта
Gl.glScaled(zoom, zoom, zoom);
// в зависимсоти от установленного типа объекта
switch (comboBox2.SelectedIndex)
{
// рисуемнужныйобъект, используюфунциибибилиотеки GLUT
case 0:
{
if (Wire) // еслиустановленсеточный режим визуализации
Glut.glutWireSphere(2, 16, 16); // сеточная сфера
else
Glut.glutSolidSphere(2, 16, 16); // полигональная сфера
break;
}
case 1:
{
if (Wire) // еслиустановленсеточный режим визуализации
Glut.glutWireCylinder(1, 2, 32, 32); // цилиндр
else
Glut.glutSolidCylinder(1, 2, 32, 32);
break;
}
case 2:
{
if (Wire) // еслиустановленсеточный режим визуализации
Glut.glutWireCube(2); // куб
else
Glut.glutSolidCube(2);
break;
}
case 3:
{
if (Wire) // еслиустановленсеточный режим визуализации
Glut.glutWireCone(2, 3, 32, 32); // конус
else
Glut.glutSolidCone(2, 3, 32, 32);
break;
}
case 4:
{
if (Wire) // еслиустановленсеточный режим визуализации
Glut.glutWireTorus(0.2, 2.2, 32, 32); // тор
else
Glut.glutSolidTorus(0.2, 2.2, 32, 32);
break;
}
}
// возвращаемсостояниематрицы
Gl.glPopMatrix();
// завершаемрисование
Gl.glFlush();
// обновлемэлементAnT
AnT.Invalidate();
}
}
}
Результати виконання програми
Висновок
На даній лабораторній роботі я дослідив можливості моделювання графічних об'єктів з використанням квадрик-об'єктів бібліотеки OPENGL.