Книги

OpenGL / FPC - Глава 7

Зная трансляцию, легко перейти и к поворотам. При повороте вся матрица поворачивается вокруг одной или нескольких осей.

Представьте нашу 3D систему координат. Есть ось X, идущая горизонтально слева направо. Есть ось Y, направленная снизу вверх. Есть еще и ось Z, идущая из экрана. Теперь повернем систему координат вокруг оси X. Ось Y поворачивается к нам, пока она не станет торчать нормально из экрана. Ось Z теперь направлена вертикально. Это будет поворот вокруг оси X на 90 градусов.

Как можно видеть, glRotatef() вызывается с четырьмя аргументам. Первый задает угол поворота. Остальные — это X/ Y/ Z компоненты вектора, вокруг которого мы поворачивем.

Теперь можно вращать матрицу на одинаковый угол каждый раз, когда вызывается основной цикл. Если не сбрасывать матрицу, она будет находиться каждый раз в новом положении, и в результате получится равномерное вращение. Повернется немного, прорисуется, повернется немного, прорисуется, ... понять это совсем легко. Однако по мере возрастания сложности сцен/объектов придется в конечном счете сделать-таки сброс матрицы. Так что следует использовать другой способ.

Матрица сбрасывается каждый оборот, но при этом используется возрастающая переменная. То есть вначале происходит поворот на определенный угол, а затем угол становится больше при каждом вызове основного цикла. Так что и здесь получится равномерное вращение. Результат такой же, а способ его достижения — другой.

Выглядит запутанно, но стоит только поупражняться, как многое станет ясным. Вот пример поворота матрицы вокруг оси Y.

  glClear( GL_COLOR_BUFFER_BIT );
  glLoadIdentity();
  glRotatef( rotation, 0.0, 1.0, 0.0 );                         
  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();  

Полный пример программы здесь. Взгляните на нее, подставьте свои значения параметров вращения, и посмотрите, что произойдет.

Актуальные версии
FPC3.2.2release
Lazarus3.2release
MSE5.10.0release
fpGUI1.4.1release
links