Обратите внимание, что рисование последовательностями glBegin
/ glEnd
, стек матрицы конвейеров с фиксированной функцией, считается устаревшим с десятилетий.Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершины и Шейдер для современного способа рендеринга.
Как вы реализуете вращение фигуры на месте?
Если тень должна вращаться вокруг своей локальной оси, то вы должны сделать вращение перед переводом.В коде это означает, что инструкция поворота должна быть после инструкции перевода:
glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glRotatef(100, 0.0, 0.0, 1.0);
См. Также Перевод OpenGL до и после вращения
Пояснение:
Перевод: см. Документацию glTranslate
:
glTranslate
производит перевод x y z
.Текущая матрица (см. glMatrixMode
) умножается на эту матрицу перевода, при этом продукт заменяет текущую матрицу.
Вращение: см. Документацию glRotate
:
glRotate
производит вращение угловых градусов вокруг вектора x y z
.Текущая матрица (см. glMatrixMode
) умножается на матрицу вращения с произведением, заменяющим текущую матрицу.
Матрица перевода выглядит следующим образом:
Matrix4x4 translate;
translate[0] : ( 1, 0, 0, 0 )
translate[1] : ( 0, 1, 0, 0 )
translate[2] : ( 0, 0, 1, 0 )
translate[3] : ( tx, ty, tz, 1 )
А матрица вращения вокруг оси Z выглядит следующим образом:
Matrix4x4 rotate;
float angle;
rotate[0] : ( cos(angle), sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0, 0, 1, 0 )
rotate[3] : ( 0, 0, 0, 1 )
Результат translate * rotate
таков:
glTranslate( ..... );
glRotate( ..... );
model[0] : ( cos(angle), sin(angle), 0, 0 )
model[1] : ( -sin(angle), cos(angle), 0, 0 )
model[2] : ( 0, 1, 0, 0 )
model[3] : ( tx, ty, tz, 1 )
Результат rotate * translate
:
glRotate( ..... );
glTranslate( ..... );
model[0] : ( cos(angle), sin(angle), 0, 0 )
model[1] : ( -sin(angle), cos(angle), 0, 0 )
model[2] : ( 0, 0, 1, 0 )
model[3] : ( cos(angle)*tx - sin(angle)*tx, sin(angle)*ty + cos(angle)*ty, tz, 1 )