Chapter 2
Быстрый старт

2.4  Переход к новым координатам

     Продолжим рисовать трехмерные фигуры. В предыдущем параграфе вы научились рисовать примитивные трехмерные объекты. Но проблема в том, что они рисуются только в начале координат, т.е. в точке (0,0,0). Для того чтобы изобразить сферу в точке ( x0,y0,z0 ), надо переместить начало координат в эту точку, т.е. надо перейти к новым координатам. Эта процедура, довольно распространенная при программировании графики и анимации. Часто бывает очень удобно сместить координаты в новую точку и повернуть их на требуемый угол, и ваши расчеты резко упростятся. Конкретный пример мы рассмотрим ниже, когда научимся программировать анимацию. А пока вы узнаете, как переходить к новым координатам. Для перехода к новым координатам в OpenGL есть две функции:

  • glTranslated( Dx,Dy,Dz )
  • glRotated(j,x0,y0,z0 )

     Первая функция сдвигает начало системы координат на ( Dx,Dy,Dz ). Вторая - поворачивает на угол j против часовой стрелки вокруг вектора (x0,y0,z0). Теперь, стоит сказать еще о двух очень важных функциях:

  • glPushMatrix()
  • glPopMatrix()

     Они предназначены для сохранения и восстановления текущих координат. Я не стал здесь приводить пример на то, как неудобно переходить от одной системы координат к другой и помнить все ваши переходы. Гораздо удобнее с помощью glPushMatrix() сохранить текущие координаты, потом сдвигаться, вертеться, как вам угодно, а после, вызывом glPopMatrix, вернуться к старым координатам. Итак, настало время поэкспериментировать. Создайте новый проект, повторив пункты из раздела 2.2. Только назовите его sphere2. Сначала мы рассмотрим сдвиг координат. Вставьте в функцию display следующий код:

    glPushMatrix();       // сохраняем текущие координаты

     glTranslated(1.4,0,0);  // сдвигаемся по оси Х на 1.4 
     glColor3d(0,1,0);
     auxSolidSphere(0.5); // рисуем сферу в (1.4,0,0) 
                      // в абсолютных координатах

     glTranslated(1,0,0);  // еще раз сдвигаемся
     glColor3d(0,0,1);
     auxSolidSphere(0.3);

    glPopMatrix();  // возвращаемся к старой системе координат

    glColor3d(1,0,0);
    auxSolidSphere(0.75); // рисуем сферу в точке (0,0,0) 
                     // в абсолютных координатах

Теперь, откомпилируйте и запустите вашу программу.
Меню Build->Execute Sphere.exe


Исходный файл смотрите здесь. Исполняемый файл здесь.

     В общем-то, из комментариев многое понятно. Обращаю ваше внимание только на два последних вызова auxSolidSphere. Перед вызовом glPopMatrix сфера рисуется в точке (2,0,0), а после - в точке (0,0,0).