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).
|