Порядок следования здесь имеет значение: как мы уже видели ранее, применение преобразования СТ*М к точке означает, что выполняется преобразование, задаваемое матрицей M, а затем преобразование, диктуемое прежним значением СТ. Если же рассуждать в терминах преобразования системы координат, то все это эквивалентно выполнению одного дополнительного преобразования текущей системы координат.
Ниже приведены подпрограммы OpenGL для преобразования в случае двух измерений: О glScaled(sx. sy. 1.0): умножает СТ справа на матрицу, выполняющую масштабирование на величину sx по оси х и на величину sy по оси у; результат помещается обратно в СТ. По оси z никакого масштабирования не производится.
О glTranslatedCdx, dy, 0) : умножает СТ справа на матрицу, выполняющую перемещение на dx по оси х и на dy по оси у; результат помещается обратно в СТ. По оси z никакого перемещения не производится.
О gl Rotated (angle, 0. 0, 1) : умножает СТ справа на матрицу, выполняющую поворот на angle градусов вокруг оси z (она обозначена (0,0,1))2; результат помещается обратно в СТ.
Поскольку эти подпрограммы только компонуют преобразование с СТ, то для начала процесса нам необходимо инициировать СТ для тождественного преобразования. Для этого в OpenGL содержится подпрограмма glLoadldentityO. Поскольку все перечисленные функции могут быть настроены для работы с любой из поддерживаемых в OpenGL матриц, мы должны информировать OpenGL о том, какую матрицу мы изменяем. Это осуществляется посредством функции glMatr 1xMode(GL_M0DELVIEW).
Листинг 5.1. Подпрограммы для поддержки СТ в случае двумерных преобразований
//«««««««« initCT >»»»»»»»»>
void Canvas:: initCT(void)
{
1 Суффикс «d» означает, что аргументы данной функции имеют двойную точность (doubl е). Существует также версия gl Rotatef (), принимающая аргументы типа float.
2 Здесь, как всегда, положительные углы означают повороты против часовой стрелки.