На рисунке 7.48 показано несколько проекций куба, полученных при различных значениях вектора d. Наиболее популярны первая и последняя проекции, они даже имеют отдельные названия. Первая из них называется косоаксонометрической (cavalier) проекцией; для нее dx-dy~ dz, поэтому в результате сдвига проекции боковой и верхней граней куба имеют ту же длину, что и передняя грань. Последняя проекция носит название кабинетной (cabinet) проекции; для нее dx-dy- dJ2, поэтому длины боковой, и верхней граней равны половине длины передней грани. Некоторым кажется, что косоаксонометричес7.6. Классификация проекций кая проекция выглядит слишком удлиненной, а кабинетная - несколько укороченной, но, несмотря на это, простота вычислений таких проекций обеспечивает их популярность.

Рис. 7.47. Сдвиг сарая для получения трехмерной проекции

Рис 7.48. Несколько косоугольных проекций куба
OpenGL не поддерживает напрямую создание косоугольных проекций. Подпрограмма gl Ortho О задает только ортографическую проекцию, но тем не менее мы можем создавать косоугольные проекции, самостоятельно производя сдвиг.
Нам нужно сначала произвести сдвиг объекта, а затем отобразить его в канонический отображаемый объем. Зададим поэтому начальную проекционную матрицу в форме (7.18) с помощью подпрограммы gl Ortho ( ) и умножим на нее матрицу сдвига. Поскольку этими действиями мы фактически определяем камеру, то имеет смысл добавить соответствующую функцию в класс Camera - назовем ее setObliqueO. Эта функция в качестве параметров принимает шесть параметров (left, top и т. д.), необходимых для функции glOrthoO, а также вектор d, определяющий направление проецирующих лучей. Если вектор d = (0,0,1), камера произведет обычные ортографические проекции. Можно использовать следующий код"opengl1_510.html">⇐ Предыдущая| |Следующая ⇒