Программирование на Visual C++. Архив рассылки
Шрифт:
Кроме изменения положения самого объекта иногда бывает нужно изменить положение точки наблюдения, что, однако также приводит к изменению видовой матрицы. Это можно сделать с помощью команды
где точка (eyex, eyey, eyez) определяет точку наблюдения, (centerx, centery, centerz) задает центр сцены, который будет проектироваться в центр области вывода, а вектор (upx, upy, upz) задает положительное направление оси у, определяя поворот камеры. Если, например, камеру не надо поворачивать, то задается
Фактически, эта команда совершает перенос и поворот объектов сцены, но в таком виде задавать параметры бывает удобнее.
В OpenGL существуют ортографическая (параллельная) и перспективная проекция. Первый тип проекции может быть задан командами
Первая команда создает матрицу проекции в усеченный объем видимости (параллелограмм видимости) в левосторонней системе координат. Параметры команды задают точки (left, bottom, –near) и (right, top, –near), которые отвечают левому нижнему и правому верхнему углам окна вывода. Параметры near и far задают расстояние до ближней и дальней плоскостей отсечения по дальности от точки (0, 0, 0) и могут быть отрицательными.
Во второй команде, в отличие от первой, значения near и far устанавливаются равными –1 и 1 соответственно.
Перспективная проекция определяется командой
которая задает усеченный конус видимости в левосторонней системе координат. Параметр angley определяет угол видимости в градусах по оси у и должен находиться в диапазоне от 0 до 180. Угол видимости вдоль оси x задается параметром aspect, который обычно задается как отношение сторон области вывода. Параметры zfar и znear задают расстояние от наблюдателя до плоскостей отсечения по глубине и должны быть положительными. Чем больше отношение zfar /znear , тем хуже в буфере глубины будут различаться расположенные рядом поверхности, так как по умолчанию в него будет записываться 'сжатая' глубина в диапазоне от 0 до 1 (см. следующий пункт).
После применения матрицы проекций на вход следующего преобразования подаются так называемые усеченные (clip) координаты, для которых значения всех компонент (x, y, z, w) находятся в отрезке [-1, 1]. После этого находятся нормализованные координаты вершин по формуле: (x, y, z) = (x/w, y/w, z/w) Область вывода представляет собой прямоугольник в оконной системе координат, размеры которого задаются командой:
Значения всех параметров задаются в пикселях и определяют ширину и высоту области вывода с координатами левого нижнего угла (x, y) в оконной системе координат. Размеры оконной системы координат определяются текущими размерами окна приложения, точка (0,0) находится в левом нижнем углу окна.
Используя параметры команды glViewPort, вычисляются оконные координаты центра области вывода (o, o) по формулам o=x+width/2, o=y+height/2. Пусть p=width, p=height, тогда можно найти оконные координаты каждой вершины: (x, y, z) = ((p/2)x+ o, (p/2)y+ o[(f-n)/2] z+(n+f)/2). При этом целые положительные величины n и f задают минимальную и максимальную глубину точки в окне и по умолчанию равны 0 и 1 соответственно.
Команда glViewPort обычно используется в функции, зарегистрированной с помощью команды glutReshapeFunc, которая вызывается, если пользователь изменяет размеры окна приложения, изменяя соответствующим образом область вывода.
Продолжение статьи – в выпуске 67б.
Программирование на Visual C++
Выпуск №67б от 10 марта 2002 г.
СТАТЬЯ
Учебное пособие по OpenGL
Продолжение. Начало см. выпуск 67
Авторы: Фролов Антон
Игнатенко Алексей
Источник: Лаборатория компьютерной графики при ВМиК МГУ
Для создания реалистических изображений необходимо определить как свойства самого объекта, так и свойства среды, в которой он находится. Первая группа свойств включает в себя параметры материла, из которого сделан объект, способы нанесения текстуры на его поверхность, степень прозрачности объекта. Ко второй группе можно отнести количество и свойства источников света, уровень прозрачности среды, а также модель источников света. Все эти свойства можно задавать, используя соответствующие команды OpenGL.
Для задания параметров текущего материала используются команды
С их помощью можно определить рассеянный, диффузный и зеркальный цвета материала, а также цвет степень зеркального отражения и интенсивность излучения света, если объект должен светиться. Какой именно параметр будет определяться значением param, зависит от значения pname:
GL_AMBIENT | параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют рассеянный цвет материала (цвет материала в тени). Значение по умолчанию: (0.2, 0.2, 0.2, 1.0). |
GL_DIFFUSE | параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют цвет диффузного отражения материала. Значение по умолчанию: (0.8, 0.8, 0.8, 1.0). |
GL_SPECULAR | параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют цвет зеркального отражения материала. Значение по умолчанию: (0.0, 0.0, 0.0, 1.0). |
GL_SHININESS | параметр params должен содержать одно целое или вещественное значение в диапазоне от 0 до 128, которое определяет степень зеркального отражения материала. Значение по умолчанию: 0. |
GL_EMISSION | параметр params должен содержать четыре целых или вещественных значения цветов RGBA, которые определяют интенсивность излучаемого света материала. Значение по умолчанию: (0.0, 0.0, 0.0, 1.0). |
GL_AMBIENT_AND_DIFFUSE | эквивалентно двум вызовам команды glMaterial.. со значением pname GL_AMBIENT и GL_DIFFUSE и одинаковыми значениями params. |