Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Скачать 0.66 Mb.
|
60 Глава 4- Преобразования объектов void gluLookAt ( GLdouble eyex , GLdouble eyey , GLdouble eyez , GLdouble centx , GLdouble centy , GLdouble centz , GLdouble upx, GLdouble upy, GLdouble upz) где точка (eyex, eyey, eyez) определяет точку наблюдения, (centx, centy, centz) задает центр сцены, который будет проецироваться в центр области вывода, а вектор (upx, upy, upz) задает положительное направление оси у, определяя поворот камеры. Если, например, камеру не надо поворачивать, то задается значение (0,1,0), а со значением (0, —1,0) сцена будет перевернута. Строго говоря, эта команда совершает перенос и поворот объектов сцены, но в таком виде задавать параметры бывает удобнее. Следует отметить, что вызывать команду gluLookAtQ имеет смысл перед определением преобразований объектов, когда мо-дельно-видовая матрица равна единичной. Запомните: матричные преобразования в OpenGL нужно записывать в обратном порядке. Например, если вы хотите сначала повернуть объект, а затем передвинуть его, сначала вызовите команду glTranslate (), а только потом —glRotate(). После этого определяйте сам объект. 4.3. Проекции В OpenGL существуют стандартные команды для задания ортографической (параллельной) и перспективной проекций. Первый тип проекции может быть задан командами void glOrtho (GLdouble left , GLdouble right , GLdouble bottom , GLdouble top , GLdouble near , GLdouble far) void gluOrtho2D (GLdouble left , GLdouble right , GLdouble bottom, GLdouble top) 4-3. Проекции 61 Первая команда создает матрицу проекции в усеченный объем видимости (параллелепипед видимости) в левосторонней системе координат. Параметры команды задают точки (left, bottom, znear) и (right, top, z far), которые отвечают левому нижнему и правому верхнему углам окна вывода. Параметры near и far задают расстояние до ближней и дальней плоскостей отсечения по удалению от точки (0, 0, 0) и могут быть отрицательными.
(right, top, zfar) Рис. 4.З. Ортографическая проекция Во второй команде, в отличие от первой, значения near и far устанавливаются равными —1 и 1 соответственно. Это удобно, если OpenGL используется для рисования двумерных объектов. В этом случае положение вершин можно задавать, используя команды glVertex2. Перспективная проекция определяется командой void gluPerspective (GLdouble angley , GLdouble aspect , GLdouble znear, GLdouble zfar) которая задает усеченный конус видимости в левосторонней системе координат. Параметр angley определяет угол видимости в градусах по оси у и должен находиться в диапазоне от 0 до 180. 62 Глава 4- Преобразования объектов Угол видимости вдоль оси х задается параметром aspect, который обычно задается как отношение сторон области вывода (как правило, размеров окна). Рис. 4.4. Перспективная проекция Параметры zfar и znear задают расстояние от наблюдателя до плоскостей отсечения по глубине и должны быть положительными. Чем больше отношение zfar/znear, тем хуже в буфере глубины будут различаться расположенные рядом поверхности, так как по умолчанию в него будет записываться «сжатая» глубина в диапазоне от 0 до 1. Прежде чем задавать матрицы проекций, не забудьте включить режим работы с нужной матрицей командой glMatrixMode(GL_PROJECTION) и сбросить текущую с помощью вызова glLoadldentityQ. Пример: /* ортографическая проекция */ glMatrixMode (GL_PROJECTION); glLoadldentity () ; glOrtho(0, w, 0, h, -1.0, 1.0); 4-4- Область вывода 63 4.4. Область вывода После применения матрицы проекций на вход следующего преобразования подаются так называемые усеченные (clipped) координаты. Затем находятся нормализованные координаты вершин по формуле: 'xn\ /Xc/Wc Уп 1 = 1 Ус/Wc ,Zn) \Zc/wc Область вывода представляет собой прямоугольник в оконной системе координат, размеры которого задаются командой void glViewPort (GLint x, GLint у, GLint width, GLint height) Значения всех параметров задаются в пикселах и определяют ширину и высоту области вывода с координатами левого нижнего угла (х,у) в оконной системе координат. Размеры оконной системы координат определяются текущими размерами окна приложения, точка (0,0) находится в левом нижнем углу окна. Используя параметры команды glViewPortQ, OpenGL вычисляет оконные координаты центра области вывода (ох,оу) по формулам: ох = х + width/2 оу = у + height/2 Пусть рх = width, py = height, тогда можно найти оконные координаты каждой вершины: {рх/2)хп + ох (Ру/2)Уп + Оу J(/-n)/2]zra + (n + /)/2, При этом целые положительные величины пи/ задают минимальную и максимальную глубину точки в окне и по умолчанию равны 0 и 1 соответственно. Глубина каждой точки записывается в специальный буфер глубины (z-буфер), который 64 Глава 4- Преобразования объектов используется для удаления невидимых линий и поверхностей. Установить значения пи/ можно вызовом функции void glDepthRange (GLclampd n, GLclampd f) Команда glViewPortQ обычно используется в функции, зарегистрированной с помощью команды glutReshapeFuncQ, которая вызывается, если пользователь изменяет размеры окна приложения. 4.5. Контрольные вопросы Какие системы координат используются в OpenGL? Перечислите виды матричных преобразований в OpenGL. Каким образом в OpenGL происходят преобразования объектов? Что такое матричный стек? Перечислите способы изменения положения наблюдателя в OpenGL. Какая последовательность вызовов команд glTranslate (), glRotateQ и glScale() соответствует команде gluLookAt(0, 0, -10, 10, 0, 0, 0, -1, 0)? Какие стандартные команды для задания проекций вы знаете? Что такое видовые координаты? Нормализованные координаты? Глава 5. Материалы и освещение Для создания реалистичных изображений необходимо определить как свойства самого объекта, так и свойства среды, в которой он находится. Первая группа свойств включает в себя параметры материала, из которого сделан объект, способы нанесения текстуры на его поверхность, степень прозрачности объекта. Ко второй группе можно отнести количество и свойства источников света, уровень прозрачности среды, а также модель освещения. Все эти свойства можно задавать, вызывая соответствующие команды OpenGL. 5.1. Модель освещения В OpenGL используется модель освещения, в соответствии с которой цвет точки определяется несколькими факторами: свойствами материала и текстуры, величиной нормали в этой точке, а также положением источника света и наблюдателя. Для корректного расчета освещенности в точке надо использовать единичные нормали, однако команды типа glScale могут изменять длину нормалей. Чтобы это учитывать, используйте уже упоминавшийся режим нормализации векторов нормалей, который 65 66 Глава 5. Материалы и освещение включается вызовом команды glEnable (GL_NORMALEZE) Для задания глобальных параметров освещения используются команды void glLightModel [ i f] (GLenum pname, GLenum param) void glLightModel [ i f]v (GLenum pname, const GLtype *params) Аргумент pname определяет, какой параметр модели освещения будет настраиваться и может принимать следующие значения: GL_LIGHT_MODEL_LOCAL_ VIEWER - параметр param должен быть булевым и задает положение наблюдателя. Если он равен GL_FALSE, то направление обзора считается параллельным оси — z вне зависимости от положения в видовых координатах. Если же он равен GL_TRUE, то наблюдатель находится в начале видовой системы координат. Это может улучшить качество освещения, но усложняет его расчет. Значение по умолчанию: GL_FALSE. GL_LIGHT_MODEL_TWO_SIDE — параметр param должен быть булевым и управляет режимом расчета освещенности как для лицевых, так и для обратных граней. Если он равен GL_FALSE, то освещенность рассчитывается только для лицевых граней. Если же он равен GL_TRUE, расчет проводится и для обратных граней. Значение по умолчанию: GL_FALSE. GL_LIGHT_MODE_AMBIENT —параметр params должен содержать четыре целых или вещественных числа, которые определяют цвет фонового освещения даже в случае отсутствия определенных источников света. Значение по умолчанию: (0.2, 0.2, 0.2,1.0). |