Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Модельно-видовые преобразования




Работа с матрицами

Преобразования объектов

В OpenGL используются три системы координат: левосторонняя, правосторонняя и оконная. Первые две системы являются трехмерными и отличаются друг от друга направлением оси z: в правосторонней она направлена на наблюдателя, в левосторонней – в глубину экрана. Ось x направлена вправо относительно наблюдателя, ось y – вверх. Основной системой координат OpenGL является правосторонняя система.

Для задания различных преобразований объектов сцены в OpenGL используются операции над матрицами, при этом различают три типа матриц: модельно-видовая, матрица проекцийи матрица текстуры. Все они имеют размер 4x4. Видовая матрица определяет преобразования объекта в мировых координатах, такие как параллельный перенос, изменение масштаба и поворот. Матрица проекций определяет, как будут проецироваться трехмерные объекты на плоскость экрана (в оконные координаты), а матрица текстуры определяет наложение текстуры на объект.

Умножение координат на матрицы происходит в момент вызова соответствующей команды OpenGL, определяющей координату (как правило, это команда glVertex*).

Для того чтобы выбрать, какую матрицу надо изменить, используется команда:

void glMatrixMode (GLenum mode),

вызов которой со значением параметра mode равным GL_MODELVIEW, GL_PROJECTION или GL_TEXTURE включает режим работы с модельно-видовой матрицей, матрицей проекций, или матрицей текстуры соответственно. Для вызова команд, задающих матрицы того или иного типа, необходимо сначала установить соответствующий режим.

Для определения элементов матрицы текущего типа вызывается команда

void glLoadMatrix[f d] (GLtype * m),

где m указывает на массив из 16 элементов типа float или double в соответствии с названием команды, при этом сначала в нем должен быть записан первый столбец матрицы, затем второй, третий и четвертый. Еще раз обратим внимание: в массиве m матрица записана по столбцам.

Команда

 

void glLoadIdentity (void)

 

заменяет текущую матрицу на единичную.

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

void glPushMatrix (void)

void glPopMatrix (void)

Они записывают и восстанавливают текущую матрицу из стека, причем для каждого типа матриц стек свой. Для модельно-видовых матриц его глубина равна как минимум 32, для остальных – как минимум 2.

К модельно-видовым преобразованиям будем относить перенос, поворот и изменение масштаба вдоль координатных осей. Для проведения этих операций достаточно умножить на соответствующую матрицу каждую вершину объекта и получить измененные координаты этой вершины:

(x’, y’, z’, 1)T = M * (x, y, z, 1)T,

где M – матрица модельно-видового преобразования. Перспективное преобразование и проектирование производится аналогично. Сама матрица может быть созданас помощью следующих команд:

 

void glTranslate[f d] (GLtype x, GLtype y, GLtype z);

void glRotate[f d] (GLtype angle, GLtype x, GLtype y, GLtype z);

void glScale[f d] (GLtype x, GLtype y, GLtype z).

 

glTranlsate*() производит перенос объекта, прибавляя к координатам его вершин значения своих параметров.

glRotate*() производит поворот объекта против часовой стрелки на угол angle (измеряется в градусах) вокруг вектора (x,y,z).

glScale*() производит масштабирование объекта (сжатие или растяжение) вдоль вектора (x,y,z), умножая соответствующие координаты его вершин на значения своих параметров.

Все эти преобразования изменяют текущуюматрицу, а поэтому применяются к примитивам, которые определяются позже. Если надо повернуть один объект сцены, а другой оставить неподвижным, удобно сначала сохранить текущую видовую матрицу в стеке командой glPushMatrix(), затем вызвать glRotate*() с нужными параметрами, описать примитивы, из которых состоит этот объект, а затем восстановить текущую матрицу командой glPopMatrix().

В общем случае матричные преобразования в OpenGL нужно записывать в обратном порядке. Например, если нужно сначала повернуть объект, а затем передвинуть его, сначала происходит вызов команды glTranslate(), а только потом – glRotate(). После этого необходимо определить сам объект.

Задание к лабораторной работе

Напишите программное приложение, реализующие следующие операции:

- создание исходного изображения объекта согласно варианту задания;

- вращение, перемещение и масштабирование объекта при помощи стандартных функций OpenGL.

Таблица 12.4.1

Варианты заданий

№ варианта Примитивы Преобразование
  смежные треугольники поворот
  веер треугольников вращение
  смежные четырехугольники масштабирование
  веер треугольников поворот
  связанные четырехугольники вращение
  смежные треугольники масштабирование
  многоугольники поворот
  смежные четырехугольники вращение
  веер треугольников масштабирование
  смежные четырехугольники поворот

Требования к отчету

Отчет по лабораторной работе должен содержать:

1. Цель работы, вариант задания, краткое описание проделанной работы.

2. Ответы на контрольные вопросы.

3. Выводы по проделанной работе.

Контрольные вопросы и задания

1. Кратко опишите библиотеки OpenGL и организацию конвейера.

2. Назовите категории команд (функций) библиотеки.

3. Какие основные примитивы используются в OpenGL?

4. Что такое дисплейные списки?

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

6. Перечислите виды матричных преобразований в OpenGL.

7. Что такое матричный стек?





Поделиться с друзьями:


Дата добавления: 2015-04-25; Просмотров: 2810; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.