При использовании преобразований следует помнить следующее правило: вектор домножается на матрицу справа, т.е. при перемножении справа стоит вектор, а слева – матрица. Таким образом, если у нас есть последовательность преобразований, то последовательность функций должна быть противоположной. Для большей ясности рассмотрим один пример: пускай у нас есть квадрат, центр которого расположен в начале координат. Нам надо этот квадрат поворачивать вокруг собственного центра, а затем, отодвинув его от начала координат на 3 единицы, повернуть его вокруг начала координат, ну и для большего интереса будем масштабировать этот квадрат. В качестве решения задачи имеем следующую последовательность преобразований:
1. масштабировать квадрат
2. повернуть квадрат вокруг своего центра
3. сдвинуть квадрат на 3 единицы
4. повернуть квадрат вокруг начала координат
Теперь распишем вызовы соответствующих функций:
glMatrixMode( GL_MODELVIEW ); // вращение вокруг начала координат glRotatef( Angle , 0 , 0 , 1 ); //сдвиг на 3 единицы glTranslatef( 3 , 0 , 0 ); //вращение вокруг центра квадрата glRotatef( Angle++ , 0 , 0 , 1 ); //масштабирование glScalef( Scale , Scale , 0 );
Как видите, все согласно правилу.
Вот пожалуй и все на сегодня, вроде все просто, однако если возникнут вопросы – пишите сами знаете куда )).
ЗЫ исходные коды к данной статье прилагаются.