Студопедия

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

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

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






OpenGL: Создание трехмерных объектов






Во всех предыдущих примерах для задания вершин мы использовали версию команды glvertex с указанием двух координат вершин. Третья координата, по оси Z, устанавливалась нулевой.

Трехмерное пространство ограничено кубом с координатами точек вершин по диагоналям (-1, -1, -1) и (1, 1, 1) (рис. 1).

Рисунок 1. Координаты области вывода

 

Задание 1: Нарисовать куб из шести квадратов.

Примечание: Если вы не заметили трехмерности, попробуйте повернуть объект по оси Z.

Объем трехмерного пространства можно увеличить с помощью команды

glFrustum (left, right, bottom, top, znear, zfar),

задающая параметры вида, в частности, определяющие область воспроизведения в пространстве. Все, что выходит за пределы этой области, будет отсекаться при воспроизведении. Параметры left и right определяют координаты левой и правой вертикалей, bottom и top – нижней и верхней горизонтальных плоскостей отсечения, а znear и zfar – расстояние от ближней и дальней плоскостей отсечения по глубине (причем оба значения должны быть положительными). Считается, что наблюдатель находится в точке с координатами (0, 0, 0).

Основная последовательность действий должна быть заключена между командами glPushMatrix и glPopMatrix. Если этого не делать, то при каждой перерисовке окна, например, при изменении его размеров, сцена будет уменьшаться в размерах.

 

Задание 2: Установите параметры вида в первом задании следующим образом:

glFrustum (-1, 1, -1, 1, 3, 10);

Примечание: Теперь все, что рисуется с нулевым значением координаты Z, не будет видно наблюдателю, поскольку ближнюю плоскость отсечения мы расположили на расстоянии трех единиц от глаза наблюдателя, располагающегося в точке (0, 0, 0). Поэтому перед воспроизведением куба необходимо сместить систему координат на пять единиц в глубь с помощью команды glTranslatef.

Задание 3: Удалите из предыдущего примера команды glPushMatrix и glPopMatrix, а перед вызовом команды glFrustum вызовите команду glLoadIdentity. Эта команда организует действие " вернуться в исходное состояние". При каждой перерисовке экрана перед заданием видовых параметров это следует проделывать, иначе объем сцены будет последовательно отсекаться из предыдущего.

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

Задание 4: Задайте нужный режим воспроизведения полигонов так, чтобы воспроизводились только грани куба.

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

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

glOrtho (left, right, bottom, top, near, far).

Аргументы команды glOrtho имеют точно такой же смысл, что и у glFrustum, но последние два аргумента могут иметь отрицательное значение.

Задание 5: Замените команду glFrustum на glOrtho.

Помимо этих двух команд, OpenGL предоставляет еще несколько возможностей установки видовых параметров, например, библиотека glu содержит команду

gluOrtho2D (left, right, bottom, top).

Эта команда имеет четыре аргумента, смысл которых такой же, как и у glOrtho. По своему действию она эквивалентна вызову glOrtho с указанием значения расстояния до ближней плоскости отсечения равным минус единице, и расстоянием до дальней плоскости отсечения равным единице.

Задание 6: Задайте перспективу с помощью команды gluOrtho2D. Уберите начальный сдвиг по оси Z.

Куб рисуется вокруг глаза наблюдателя и проецируется на плоскость экрана. Согласно установкам этой команды задняя часть куба может частично обрезаться.

Следующая команда – команда библиотеки glu

gluPerspective (angley, aspect, znear, zfar),

определяет усеченный конус видимости в видовой системе координат. Смысл аргументов данной команды: angley задает угол видимости (в градусах) в направлении оси Y, в направлении оси X угол видимости задается через отношение сторон aspect, параметры znear и zfar определяют расстояния от наблюдателя до ближней и дальней плоскостей отсечения.

Пример: gluPerspective(30.0, ClientWidth / ClientHeight, 1 0, 15. 0)

Примечание: Как правило, в качестве значения второго аргумента команды gluPerspective, так называемого аспекта, задают отношение ширины и высоты области вывода.

Задание 7 Задайте перспективу с помощью команды gluPerspective.

Библиотека glu располагает еще одной вспомогательной командой, имеющей отношение к рассматриваемой теме

gluLookAt (eyex, yey, eyez, centerx, centery, centerz, upx, upy, upz).

У нее девять аргументов: координаты позиции глаза наблюдателя в пространстве, координаты точки, располагающейся в центре экрана, и направление вектора, задающего поворот сцены (вектор " up").

При использовании этой команды можно обойтись без начальных операций со сдвигом и поворотом системы координат.

Пример: gluLookAt (2.0, 2, 4.0, 0.4, 0.5, 0.5, 0, 1, 0).

Задание 8: Продемонстрирует работу этой команды.

 






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