Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Інститут комп’ютерних технологій автоматики та метрології
Кафедра БІТ
Звіт
до лабораторної роботи № 4
з дисципліни :
“Програмування комп’ютерної графіки ”
Львів 2012
Мета: З'ясувати особливості тривимірного моделювання, побудови об'ємних зображень як проекцій на екранній плоскості; дати поняття про параметри вигляду.
КОРОТКІ ТЕОРЕТИЧНІ ДАНІ
Тривимірні координати.
У попередніх лабораторних роботах для малювання фігур використовувалася версія команди glVertex з двома параметрами. Координата по осі Z передбачалася рівною 0.
Для зображення в просторі використовується команда glVertex з трьома параметрами:
glVertex3f(<координата x>, <координата у>, <координата z>).
Значення координати Z лежить в межах від –1 до 1. За умовчанням вважається, що спостерігач розташований в крапці (0, 0, 0), що слід мати на увазі. Щоб вершини з позитивними координатами Z були змальовані, слід зрушити систему координат углиб екрану.
OPENGL відтворює тільки ті частки примітивів, координати яких не перевершують по модулю 1. Примітиви з однаковими координатами малюються за принципом: кожен подальший малюється поверх попереднього. Таке зображення не завжди дає правильні результати, зокрема, якщо не включена підтримка буфера глибини.
Буфер глибини.
Буфер глибини використовується для передачі простору. При відтворенні кожного піксела в цей буфер записується інформація про значення координати Z піксела, так звана віконна Z. Якщо на піксел доводиться декілька крапок, на екран виводиться крапка з найменшим значенням цієї координати.
Для правильної побудови зображень (відповідно до глибини) необхідно включити режим тестування глибини за допомогою команди:
glEnable(GL_DEPTH_TEST);
Код сцени слід починати з очищення двох буферів: буфера кадру і буфера глибини:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Точно так, як і перед черговою побудовою необхідно очистити поверхню малювання, для коректного відтворення потрібно очистити буфер простору.
Проекції.
Зображення тривимірних об'єктів на екрані будується за допомогою проекцій: паралельною (ортографічною) і перспективною.
При зображенні тривимірних об'єктів слід мати на увазі, що зображення будується в межах одиничного куба (координати по кожній з осей змінюються в межах від –1 до 1), причому початок координат (центр куба) знаходиться в центрі вікна, а вісь Z направлена перпендикулярно площині екрану у бік спостерігача. Спосіб проектування визначається вибором команди для установки параметрів вигляду:
glFrustum – вибирається перспективний спосіб проектування
glOrtho – вибирається паралельний спосіб проектування
При паралельному проектуванні зберігається паралельність прямих. Наприклад, при зображенні куба в паралельній проекції задня і передня грані будуть рівні.
При використанні перспективної проекції паралельні лінії об'єкту змальовуються такими, що сходяться в деякій видаленій («углиб» екрану) крапці, що і створює перспективу.
Параметри проектування відносяться до параметрів вигляду.
Хід роботи:
Перед виконанням лабораторної роботи слід ознайомитися з необхідними теоретичними відомостями, що відносяться до можливостей тривимірного моделювання з використанням бібліотеки OPENGL. Рекомендується уважно вивчити теоретичний матеріал, що відноситься до різних способів проектування ([7] – лекція 15).
Завдання лабораторної роботи рекомендується виконувати в порядку їх проходження, відповідно до варіанту, вказаного викладача.
Завдання до лабораторної роботи.
Варіант 2
Фігури
(задані вершинами)
Параметри вигляду
Поворот осей
До завдання 6
Чотирикутник:
(-0.5, -0.5, -0.5) (-0.5, 0.5, -0.5)
(0.8, 0.5, -0.5) (0.5, -0.8, -0.5)
Трикутник:
(-1, -1, 1) (-1, 1, 1) (1, 0, -1);
Трикутник:
(-0.7, -0.7, -0.7) (0, 0, 0) (0, 0, 1)
-0.9, 0.8
-0.8, 0.9
5, 10
Навколо OX:
45
Навколо OY:
45
Змінюється масштаб: збільшення або зменшення об'єкту
Завдання 1. Будую зображення трьох плоских фігур в просторі (відповідно до варіанту). Фігури намальовані не правильно, тому що не встановлений режим перевірки буфера глибини.
Завдання 2. Встановлюю режим перевірки буфера глибини в програмі до завдання 1. Фігури намальовані правильно.
Завдання 3. Встановлюю видові параметри відповідно до варіанту і паралельну проекцію; будую зображення куба з координатами вершин, рівними по модулю 1.
Завдання 4. Поверніть осі координат відповідно до варіанту і побудуйте зображення куба. Оцініть результат. Чому частки куба відсічені? Змініть видові параметри так, щоб куб замальовувався без відсікань. Змініть код програми так, щоб кожна грань куба замальовувалася своїм кольором.
Завдання 5. Напишіть програму, в якій зображення куба змінюється при натисненні клавіш (відповідно до варіанту).
Текст програми:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// для работи з бібліотекою OpenGL
using Tao.OpenGl;
// для работи з бібліотекою FreeGLUT
using Tao.FreeGlut;
// для работи з елементом управління SimpleOpenGLControl
using Tao.Platform.Windows;
namespace lab1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
}
private void Form1_Load(object sender, EventArgs e)
{
// инициализация библиотеки GLUT
Glut.glutInit();
// инициализация режима окна
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
// устанавливаем цвет очистки окна
Gl.glClearColor(255, 255, 255, 1);
// устанавливаем порт вывода, основываясь на размерах элемента управления AnT
Gl.glViewport(0, 0, 300, 300);
Gl.glOrtho(-2, 2, -2, 2, -2, 2);
Gl.glMatrixMode(Gl.GL_PROJECTION);
}
private void button4_Click(object sender, EventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glColor3f(1.0f, 0, 0);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glRotated(45, 1, 1, 0);
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(1, 1, 0);
Gl.glVertex3d(0, 0, 1);
Gl.glVertex3d(1, 0, 1);
Gl.glVertex3d(1, 1, 1);
Gl.glVertex3d(0, 1, 1);
Gl.glEnd();
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0, 0, 1);
Gl.glVertex3d(1, 1, 0);
Gl.glVertex3d(1, 1, 1);
Gl.glVertex3d(1, 0, 1);
Gl.glVertex3d(1, 0, 0);
Gl.glEnd();
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0, 1, 0);
Gl.glVertex3d(0, 0, 1);
Gl.glVertex3d(1, 0, 1);
Gl.glVertex3d(1, 0, 0);
Gl.glVertex3d(0, 0, 0);
Gl.glEnd();
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(0, 1, 1);
Gl.glVertex3d(0, 0, 0);
Gl.glVertex3d(1, 0, 0);
Gl.glVertex3d(1, 1, 0);
Gl.glVertex3d(0, 1, 0);
Gl.glEnd();
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(1, 0, 0);
Gl.glVertex3d(0, 1, 1);
Gl.glVertex3d(1, 1, 1);
Gl.glVertex3d(1, 1, 0);
Gl.glVertex3d(0, 1, 0);
Gl.glEnd();
Gl.glBegin(Gl.GL_QUADS);
Gl.glColor3f(1, 0, 1);
Gl.glVertex3d(0, 0, 0);
Gl.glVertex3d(0, 1, 0);
Gl.glVertex3d(0, 1, 1);
Gl.glVertex3d(0, 0, 1);
Gl.glEnd();
Gl.glFlush();
AnT.Invalidate();
}
}
}
Висновок: На даній лабораторній роботі я створив програми-заготовки для роботи з бібліотекою openGL. Програма створює порожнє вікно для графічного виводу засобами openGL, встановлює всі необхідні параметри графічного виводу, та будує ромбододекаедр с допомогою бібліотеки FreeGLUT.