Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






OpenGL: Масштабирование. Поворот. Перенос






Мы уже знаем, что границы области вывода лежат в пределах от -1 до 1 Это может привести к неудобству при подготовке изображений. К счастью, OpenGL предоставляет удобное средство на этот случай – масштабирование. Масштабирование осуществляется с помощью команды

glScalef (x, y, z).

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

Пример: glScalef (0.5, 1.0, 1.0) – масштаб по горизонтали уменьшаем вдвое.

glScalef (2.0, 1.0, 1.0) – масштаб по горизонтали увеличиваем вдвое.

Задание 1: Нарисуйте два одинаковых прямоугольник. Уменьшите масштаб одного из них в два раза и по оси X и по оси Y.

Примечание 1: При двумерных построениях значение коэффициента по оси Z безразлично.

Примечание 2: После команд рисования необходимо восстановить нормальный масштаб (т.е. увеличить вдвое).

Масштабные множители могут иметь отрицательные значения, при этом изображение переворачивается по соответствующей оси.

Задание 2: Переверните фигуру по оси Y.

Для поворота используется команда

glRotatef (angle, x, y, z)

с четырьмя аргументами: angle – угол поворота, в градусах, и вектор поворота – задается тремя вещественными числа (x, y, z).

Для двумерных построений наиболее нагляден поворот по оси Z.

Задание 3: Нарисуйте квадрат и поверните его на 45. Должен получиться ромб.

Примечание 2: После команд рисования необходимо восстановить нормальную точку зрения.

Перенос точки зрения (системы координат) осуществляется командой

glTranslatef (x, y, z)

с тремя аргументами - величинами переноса для каждой из осей.

Задание 4: Перенесите фигуру в правую нижнюю часть окна.

Перейдем к вопросу о совместном использовании поворота и переноса - это чаще всего и используется при построениях.

 

Задание 5: Постройте узор с помощью цикла в котором вызываются команды поворота и переноса, показанный на рис. 1.

 

Рисунок 1. Узор, построенный с помощью команд поворота и переноса

 

По предыдущим примерам вы должны были очень хорошо уяснить, как важно восстанавливать текущую систему координат. При каждой следующей перерисовке окна она сдвигается и поворачивается, поэтому нам приходится постоянно следить, чтобы после рисования система координат вернулась в прежнее место. Для этого можно пользоваться обратными поворотами и перемещениями. Такой подход неэффективен и редко встречается в примерах и профессиональных программах, т. к. приводит к потерям скорости воспроизведения. Функции glRotatef и glTranslatef реализуются как перемножение текущей матрицы на матрицы поворота и переноса, соответственно.

Обычно в состоянии, к которому потребуется затем вернуться, запоминают значение текущей матрицы. Вместо того чтобы заново перемножать матрицы и тратить время на операции, связанные с математическими расчетами, возвращаемся сразу к запомненному значению.

Команды glPushMatrix и glPopMatrix позволяют запомнить и восстановить текущую матрицу. Использование этих функций делает код более читабельным, а воспроизведение - более быстрым.

Задание 6: М одифицируем программу рисования четырех прямоугольниклв. В цикле перед операциями поворота и переноса запомним текущую систему координат (обратимся к glpushMatrix), а после рисования очередного квадрата - восстановим ее (вызовем glPopMatrix).






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.