if(d.z - 0.0) return: j II for orthographic projections // для ортографических проекций
float m[16]: // space for a 4-by-4 matrix // место для матрицы 4 на 4
for(int i - 0: i < 16: i++) // start with identity matrix // начинаем с единичной матрицы
m[i] - (i*5 0)? 1.0 : 0.0: // identity matrix // единичная матрица
m[8] = -d.x/d.z: // add the shear terms // добавляем коэффициенты сдвига
m[9] = -d.y/d.z:
glMultMatrixf(m): // postmultiply it by m // умножаем ее справа на m }
Эта подпрограмма с помощью glOrthoO инициализирует проекционную матрицу для параллельной проекции и затем умножает получившуюся матрицу справа на матрицу сдвига. Что касается последней матрицы, то в программе используется слегка модифицированный вариант матрицы (7.19), где 0 на пересечении третьей строки и третьего столбца заменен на 1. Такой подход более совместим с OpenGL и сохраняет информацию о глубине, чтобы OpenGL смог затем произвести удаление невидимых поверхностей. В тематическом задании 7.3 предоставляется возможность поэкспериментировать с созданием косоугольных проекций.
Практические упражнения
7.6.5. Анализ проекционной матрицы
Покажите, что равенство (7.18) правильно описывает проекционную матрицу, используемую в OpenGL. Иначе говоря, покажите, что эта матрица преобразует каждый угол отображаемого объема в нужный угол канонического отображаемого объема.
7.6.6. Нахождение вектора п Определите компоненты вектора п, которые задают коэффициенты укорачивания (foreshortening ratios) по осям х, у, г, соответственно равные 0,6, 0,4, 0,7. При скольких различных направлениях вектора n можно получить такие коэффициенты укорачивания?
7.6.7. Вектор n в сферических координатах
Определите три коэффициента укорачивания для вектора п, имеющего широту 60° и долготу 125°.
7.6.8. Нарисуйте куб Нарисуйте от руки последовательность диметрических проекций куба, для которых пу = -пг, а пх возрастает от 0 до 1.
7.6.9. Камера в сферических координатах
Какие значения могут принимать широта и долгота вектора n при изометрической проекции?