4.9.3. Поворот вокруг фиксированной точки средствами OpenGL
В разделе 4.8 было показано, что для поворота вокруг произвольной фиксированной точки (т.е. точки, отличной от начала координат) сначала нужно выполнить преобразование сдвига, совмещающее заданную фиксированную точку с началом координат, потом преобразование поворота вокруг начала координат, а затем обратное преобразование сдвига, "возвращающее" фиксированную точку в прежнюю позицию. В приведенной ниже последовательности вызовов функций OpenGL сначала устанавливается режим работы с матрицей вида, затем выполняются описанные выше преобразования для следующих исходных данных: угол поворота 45°, ось поворота параллельна прямой, проведенной через начало координат и точку (1, 2 , 3), а фиксированная точка имеет координаты (4, 5, 6):
glMatrixMode(GL_MODELVIEW) glLoadldentityd; glTranslatef(4.0, 5.0, 6.0);
glRotatef(45.0, 1.0, 2.0, 3.0); glTranslatef(-4.0, -5.0, -6.0);
Обратите внимание на то, что работая с пакетом OpenGL, не нужно формировать матрицу поворота вокруг произвольной оси так, как мы это делали в примере из раздела 4.8.4, хотя в качестве упражнения попробуйте запрограммировать этот метод с помощью имеющихся в составе OpenGL функций умножения матриц.
4.9.4. Последовательность выполнения преобразований В приведенной выше последовательности обращения к функциям OpenGL внимательный читатель наверняка отметил, что преобразования задаются "в обратном порядке", т.е. первое преобразование сдвига задается пятым оператором, а последнее - третьим. Дело в том, что в OpenGL действует следующее правило: Преобразование, которое должно быть в цепочке последним, передается первым вызовом соответствующей функции.
Несложный анализ убедит вас в справедливости этого правила, которое учитывает особенности выполнения операций над текущей матрицей преобразования в исполнительной системе OpenGL. Дело в том, что ТМП всегда домножается справа на новую матрицу преобразования. Поэтому приведенную выше последовательность вызовов функций можно выразить с помощью введенной раньше системы обозначений следующим образом: