В предыдущем разделе вы научились раскрашивать треугольники и четырехугольники. Этот урок научит вас, как вращать эти цветные объекты вокруг их осей координат.
Фактически, достаточно добавить несколько строк к коду из предыдущего раздела. Давайте перепишем всю процедуру еще раз. Вам удобно знать, что было добавлено и что изменено.
Добавьте две переменные, чтобы управлять вращением этих двух объектов. Эти две переменные добавляются после других переменных в начале программы (bool fullscreen=TRUE; две строки ниже). Это переменные типа с плавающей запятой, которые позволяют нам очень точно вращать объекты. Числа с плавающей запятой содержат десятичные знаки, а это значит, что нам не нужно использовать углы 1, 2, 3... Вы обнаружите, что числа с плавающей запятой являются основой программирования OpenGL. Новая переменная rtri используется для вращения треугольника, а rquad — для вращения четырехугольника.
Вар
…
rtri : GLfloat // Угол треугольника (новое)
rquad : GLfloat // Угол для четырехугольника (новое);
…
Затем измените glDraw() следующим образом:
ПРОЦЕДУРА glDraw();
Начинать
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT // Очищаем экран и буфер глубины);
glLoadIdentity(); //Сбрасываем матрицу наблюдения текущей модели
//Следующая строка кода новая. glRotatef(Angle,Xvector,Yvector,Zvector) отвечает за поворот объекта вокруг определенной оси.
//Эта команда имеет множество применений. Угол обычно представляет собой переменную, представляющую угол, на который поворачивается объект.
//Три параметра Xvector, Yvector и Zvector совместно определяют направление оси вращения.
//Например, вектор, описываемый (1,0,0), проходит через 1 единицу оси координат X и направлен вправо.
//Вектор, описываемый (-1,0,0), проходит через 1 единицу оси координат X, но в левом направлении.
//Д. Майкл Трауб: Дает приведенное выше объяснение Xvector, Yvector и Zvector.
//Чтобы лучше понять вращение X, Y и Z, позвольте мне привести несколько примеров...
//Ось X — вы используете настольную пилу. Ось в центре лезвия расположена слева направо (точно так же, как ось X в OpenGL).
//Острые зубья пилы резко вращаются вокруг оси X, по-видимому, поворачиваясь вверх или вниз.
//Зависит от направления, в котором начинает вращаться пильное полотно. Это та же ситуация, что и при вращении чего-либо вокруг оси X в OpenGL.
//(Примечание переводчика: Если в этот момент вы повернетесь лицом к монитору, вас обязательно распилят^-^.)
//Ось Y. Допустим, вы находитесь в центре огромного торнадо, причем центр торнадо направлен от земли к небу (точно так же, как ось Y в OpenGL).
//Мусор и обломки дико вращаются вокруг оси Y слева направо или справа налево.
//Это та же ситуация, что и при вращении чего-либо вокруг оси Y в OpenGL.
//Ось Z — вы смотрите на вентилятор прямо перед собой. Центр веера направлен прямо к вам (как ось Z в OpenGL).
//Лопасти вентилятора резко вращаются по часовой стрелке или против часовой стрелки вокруг оси Z. Это та же ситуация, что и при вращении чего-либо вокруг оси Z в OpenGL.
glTranslatef(-1.5, 0.0, -6.0 // Перемещение влево на 1,5 единицы и на экран 6.0);
//В следующей строке кода, если rtri равно 7, мы поворачиваем треугольник на 7 слева направо вокруг оси Y.
//Вы также можете изменить значение параметра, чтобы одновременно вращать треугольник вокруг осей X и Y.
glRotatef(rtri, 0.0, 1.0, 0.0 // Поворот треугольника вокруг оси Y (новое)
//В приведенном ниже коде нет изменений. Цветной градиентный треугольник рисуется в левой части экрана и вращается слева направо вокруг оси Y.
glBegin(GL_TRIANGLES); // Рисуем треугольники
glColor3f(1.0, 0.0, 0.0); //Установим текущий цвет на красный
glVertex3f(0.0, 1.0, 0.0); // Верхняя вершина;
glColor3f(0.0, 1.0, 0.0); //Установим текущий цвет на зеленый
glVertex3f(-1.0, -1.0, 0.0); // Внизу слева
glColor3f(0.0, 0.0, 1.0); //Установим текущий цвет на синий
glVertex3f(1.0, -1.0, 0.0); // Внизу справа
glEnd(); // Конец рисования треугольника
//В приведенном ниже коде вы заметите, что мы добавили еще один вызов glLoadIdentity().
//Цель — сбросить матрицу наблюдения модели.
//Если мы не сбросим настройки и не вызовем glTranslate напрямую, возникнут неожиданные результаты.
//Поскольку ось координат была повернута, вероятно, она не в том направлении, в котором вы хотите.
//Таким образом, то, что мы изначально хотели переместить объект влево и вправо, может стать вверх и вниз, в зависимости от того, насколько сильно вы повернете ось координат.
//Попробуем закомментировать glLoadIdentity() и посмотрим, какие результаты появятся.
//После сброса матрицы наблюдения модели все оси X, Y и Z сбрасываются, и мы вызываем glTranslate.
//Вы заметите, что на этот раз мы переместили вправо всего на 1,5 единицы, а не на 3,0 единицы, как в прошлом уроке.
//Потому что, когда мы перезагружаем сцену, фокус возвращается в центр сцены (на 0,0).
//Таким образом, вам нужно сдвинуться вправо всего на 1,5 единицы.
//Когда мы переместимся в новую позицию, поверните четырехугольник вокруг оси X. Квадрат будет вращаться вверх и вниз.
glLoadIdentity(); //Сброс матрицы наблюдения модели
glTranslatef(1.5, 0.0, -6.0 // Перемещение вправо на 1,5 единицы и переход на экран 6.0);
glRotatef(rquad, 1.0, 0.0, 0.0 // Поворот четырехугольника вокруг оси X (новое)
glBegin(GL_QUADS); // Рисуем квадрат
glColor3f(0.6, 0.2, 2.0); //Установим текущий цвет на фиолетовый
glVertex3f(-1.0, 1.0, 0.0 // Верхний левый);
glVertex3f(1.0, 1.0, 0.0); // Верхний правый угол;
glVertex3f(1.0, -1.0, 0.0); // Внизу слева
glVertex3f(-1.0, -1.0, 0.0); // Внизу справа
glEnd(); // Конец рисования квадрата
//Следующие две строки новые.
//Если rtri и rquad представляются как контейнеры,
//Затем в начале программы мы создали контейнеры (rtri и rquad).
//Когда контейнер создан, он пуст.
//Первая строка кода ниже добавляет к контейнеру 0,2.
//Поэтому каждый раз, когда мы запускаем предыдущий код, значение в контейнере rtri здесь будет увеличиваться на 0,2.
//Следующая строка уменьшает значение в контейнере rquad на 0,15.
//Аналогично, каждый раз, когда мы запускаем предыдущий код, значение в контейнере rquad здесь будет уменьшаться на 0,15.
//Падение в конечном итоге приведет к вращению объекта в направлении, противоположном направлению роста.
rtri := rtri + 0.2 // Увеличиваем переменную вращения треугольника (новое)
rquad := rquad - 0.15 // Уменьшаем переменную вращения четырехугольника (новое)
Конец;