![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
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).
|