Обычно приложения сначала устанавливают матрицу вида в качестве текущей, а потом накладывают на нее прочие нужные матрицы моделирования. Матрица может быть установлена для разумных преобразований вида функцией gl uLookAt (она не является частью OpenGL, но входит во вспомогательную библиотечку, поставляемую со всеми реализациями OpenGL). Матрицы модели-вида в OpenGL обычно хранятся в стеке, и самую верхнюю матрицу можно скопировать на верх стека вызовом функции gl PushMat п х. После этого все преобразования могут быть наложены на самую верхнюю матрицу функциями gl Scale, gl Translate и gl Rotate, чтобы определить преобразования для каждого трехмерного объекта в сцене. Положение источников освещения задается функцией gl Light, трансформируются они текущей матрицей модели-вида, так что координаты источников освещения также хранятся как координаты обзора. Матрица модели-вида должна быть полностью сформирована перед преобразованиями координат источников освещения, иначе эффекты освещения будут полностью нарушены.

Пространства координат и преобразования в OpenGL

Рис. 1.2. Пространства координат и преобразования в OpenGL

Вычисления освещения в OpenGL происходят над вершинами в системе координат обзора. Чтобы правильно вычислить отражение, положения источников освещения и нормали, поверхности нужно расположить в одной и той же системе координат. Часто в реализациях OpenGL это выполняется в системе координат обзора, поэтому заданные нормали поверхности также нужно преобразовать в пространство обзора. Обычно такие преобразования делаются обратной транспозицией матрицы модели-вида.

На этом этапе формулы освещенности OpenGL можно применять для определения освещенности каждой вершины. После преобразования координат в систему обзора обычно определяют видимый объем - часть трехмерной сцены, которая будет видима в окончательном изображении. Преобразование, которое помещает объекты видимого объема в пространство отсечения (система координат, приемлемая для отсечения), называется проецированием. В OpenGL проецирование настраивается функцией gl Hat п xMode, при этом выбирается и правильно устанавливается матрица проекции. Параметры, которые могут передаваться, - это область обзора (размер видимой части сцены), соотношение сторон (вертикальный размер поля обзора может не соответствовать горизонтальному), поверхности отсечения для отбраковки объектов либо слишком близких, либо слишком далеких (при вычислении перспективы получаются причудливые результаты, если пытаться рисовать прямо а точке обзора или сразу перед пей). Три вспомогательных функции, gl Ortho, gl Frustum и gluPerspective, могут устанавливать матрицу проекции, gl Ortho определяет параллельную проекцию (параллельные линии в сцене проецируются на параллельные линии в окончательном двухмерном изображении), a gl Frustum и gl uPerspecti ve определяют проекцию в перспективе (параллельные линии в сцене спроецированы таким образом, чтобы смыкаться в точке схода, примером могут служить рельсы, сходящиеся на горизонте).

Отсечение усеченным конусом исключает любые графические примитивы, находящиеся вне прилегающего к оси пространства отсечения. Это пространство определено формулой, где координаты отсеченного пространствах, у и 2 меньше или равны координате w или больше или равны -w (то есть -w < х < w, -w <у <w, -w <z< w). Графические примитивы или их части, находящиеся снаружи, будут отброшены. Отсечение конусом в OpenGL всегда применяется для всех приходящих примитивов. Произвольное отсечение можно выключить или включить. Приложения могут вызывать функцию gl Cl i рР1 апе для задания одной или больше плоскостей отсечения, которые, в свою очередь, ограничивают область обзора еще больше. Каждая плоскость должна быть отдельно задана функцией gl ЕпаЫ е. Если произвольные плоскости отсечения указаны, они преобразуются в пространство обзора с помощью инверсии текущей матрицы модели-вида. Каждая плоскость, таким образом, определяет отсеченную полуплоскость, в результате будут нарисованы только те части примитивов, которые попадают в пересечение изначальной области обзора и разрешенных полуплоскостей!


⇐ вернуться назад | | далее ⇒